Amsterdammed 发表于 2006-6-10 09:15:39


对于直线的绿色向量,点在一侧,对于红色向量,它在另一侧。

MickD 发表于 2006-6-10 15:33:37

这个解决方案来自我们沼泽上的一位俄罗斯朋友,不记得是谁了。
(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
)

DaveW 发表于 2006-6-10 17:09:09

这就是我不喜欢Lisp的原因:对我来说这是俄语。我不知道会发生什么。代码看起来足够紧凑,但我不知道如何将其嵌入VBA宏,更不用说VB可执行文件了<是我的错,我敢肯定。。。

DaveW 发表于 2006-6-12 20:37:49

这个想法是,你从0,001开始,在两个方向上偏移你拥有的边界。比您在两条新折线上搜索最接近您的pt的点。你看看哪一个更接近你的观点。是否定的,偏移它在里面,否则不是,
我希望我能帮助,
Bernd

havano 发表于 2006-6-12 21:00:41


好的,凹多边形是一种不同的球类游戏。您仍然可以使用neg/pos例程,但您必须使用集合论/布尔逻辑来组合边缘创建的半空间,这创建了一个可以描述为参数方程的表面,您可以插入一个点并找出它是进还是出-这不是一件小事-不过。
另一种选择是将您的多边形分解为简单的凸形(例如三角),并对每个新形状进行neg/pos测试,一旦您获得“pos”命中,它就必须在多边形内。
有很多方法可以做到这一点,但您需要权衡复杂性和准确性与速度。
干杯,
米克。
页: 1 [2]
查看完整版本: 边界内还是边界外?如何发现?