以下是我的方法:
- [color=GREEN];; Point Inside-p - Lee Mac[/color]
- [color=GREEN];; Utilises a ray-casting algorithm to determine whether a[/color]
- [color=GREEN];; given point (WCS) resides within a supplied object.[/color]
- ([color=BLUE]defun[/color] LM:PointInside-p ( pt obj [color=BLUE]/[/color] lst ray )
- ([color=BLUE]setq[/color] lst
- ([color=BLUE]vlax-invoke[/color]
- ([color=BLUE]setq[/color] ray
- ([color=BLUE]vla-addray[/color]
- ([color=BLUE]vla-objectidtoobject[/color] ([color=BLUE]vla-get-document[/color] obj) ([color=BLUE]vla-get-ownerid[/color] obj))
- ([color=BLUE]vlax-3D-point[/color] pt)
- ([color=BLUE]vlax-3D-point[/color] ([color=BLUE]mapcar[/color] '[color=BLUE]+[/color] pt '(1.0 0.0 0.0)))
- )
- )
- 'intersectwith obj [color=BLUE]acextendnone[/color]
- )
- )
- ([color=BLUE]vla-delete[/color] ray)
- ([color=BLUE]=[/color] 1 ([color=BLUE]logand[/color] 1 ([color=BLUE]length[/color] lst)))
- )
要测试:
- ([color=BLUE]defun[/color] c:test ( [color=BLUE]/[/color] ent obj pnt )
- ([color=BLUE]if[/color] ([color=BLUE]setq[/color] ent ([color=BLUE]car[/color] ([color=BLUE]entsel[/color] [color=MAROON]"\nSelect Polyline: "[/color])))
- ([color=BLUE]if[/color] ([color=BLUE]vlax-method-applicable-p[/color] ([color=BLUE]setq[/color] obj ([color=BLUE]vlax-ename->vla-object[/color] ent)) 'intersectwith)
- ([color=BLUE]while[/color] ([color=BLUE]setq[/color] pnt ([color=BLUE]getpoint[/color] [color=MAROON]"\nPick Point: "[/color]))
- ([color=BLUE]if[/color] (LM:PointInside-p ([color=BLUE]trans[/color] pnt 1 0) obj)
- ([color=BLUE]alert[/color] [color=MAROON]"Point is INSIDE"[/color])
- ([color=BLUE]alert[/color] [color=MAROON]"Point is OUTSIDE"[/color])
- )
- )
- ([color=BLUE]princ[/color] [color=MAROON]"\nInvalid Object selected."[/color])
- )
- )
- ([color=BLUE]princ[/color])
- )
- ([color=BLUE]vl-load-com[/color]) ([color=BLUE]princ[/color])
对于投影光线平行于相交边缘的情况,可能需要进行更严格的测试。但上述内容足以满足大多数一般应用。 |