对于直线的绿色向量,点在一侧,对于红色向量,它在另一侧。 这个解决方案来自我们沼泽上的一位俄罗斯朋友,不记得是谁了。
(defun insidep (pt ent / big flag obj1 obj2 obj3 p1 p2 small)
(vl-load-com)
(if (and pt ent)
(progn
(setq obj1 (vlax-ename->vla-object ent))
(setq obj2 (car (vlax-invoke obj1 'Offset 0.001))
obj3 (car (vlax-invoke obj1 'Offset -0.001))
) ;_ end of setq
(if (> (vla-get-area obj2) (vla-get-area obj3))
(progn
(set 'big obj2)
(set 'small obj3)
) ;_ end of progn
(progn
(set 'big obj3)
(set 'small obj2)
) ;_ end of progn
) ;_ end of if
(setq p1 (vlax-curve-getClosestPointTo big pt)
p2 (vlax-curve-getClosestPointTo small pt)
) ;_ end of setq
(if (> (distance pt p1) (distance pt p2))
(setq flag T)
(setq flag nil)
) ;_ end of if
(mapcar (function (lambda (x)
(progn
(vla-delete x)
(vlax-release-object x)
) ;_ end of progn
) ;_ end of lambda
) ;_ end of function
(list big small)
) ;_ end of mapcar
) ;_ end of progn
) ;_ end of if
flag
)
这就是我不喜欢Lisp的原因:对我来说这是俄语。我不知道会发生什么。代码看起来足够紧凑,但我不知道如何将其嵌入VBA宏,更不用说VB可执行文件了<是我的错,我敢肯定。。。 这个想法是,你从0,001开始,在两个方向上偏移你拥有的边界。比您在两条新折线上搜索最接近您的pt的点。你看看哪一个更接近你的观点。是否定的,偏移它在里面,否则不是,
我希望我能帮助,
Bernd
好的,凹多边形是一种不同的球类游戏。您仍然可以使用neg/pos例程,但您必须使用集合论/布尔逻辑来组合边缘创建的半空间,这创建了一个可以描述为参数方程的表面,您可以插入一个点并找出它是进还是出-这不是一件小事-不过。
另一种选择是将您的多边形分解为简单的凸形(例如三角),并对每个新形状进行neg/pos测试,一旦您获得“pos”命中,它就必须在多边形内。
有很多方法可以做到这一点,但您需要权衡复杂性和准确性与速度。
干杯,
米克。
页:
1
[2]