5

如果我有一个点数组 (x,y,z) 并且给定一个点 (x,y,z),我使用什么代码来确定该点是否位于数组定义的形状内?

我在这个上画了一个空白......

我正在使用 C#

编辑

感谢大家的回复,我从评论中找到了这个链接(http://alienryderflex.com/polygon/),它很好地解释了这个过程。

谢谢!

供参考:

bool pointInPolygon() {
    
      int      i, j=polySides-1 ;
      boolean  oddNodes=NO      ;
    
      for (i=0; i<polySides; i++) {
        if (polyY[i]<y && polyY[j]>=y
        ||  polyY[j]<y && polyY[i]>=y) {
          if (polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x) {
            oddNodes=!oddNodes; }}
        j=i; }
     
      return oddNodes; }

它需要一些工作,但这就是它的胆量。

再次感谢

4

3 回答 3

16

使用您知道在形状之外的点,并检查从该点到给定点的线是否穿过形状的表面。如果它通过奇数个表面,则给定点在形状内部。

于 2011-02-10T21:51:34.270 回答
2

除了 Guffa 的回答之外,确定一条线是否与表面相交比听起来更难。这是其背后的数学原理:直线和平面的交点。您必须采用该基本算法(包括找到每个表面到该点的法线,然后确定法线与线之间的角度以形成您找到第三个点的直角三角形;WPF 的 Media3D 库具有关于点的函数和使这一切变得更容易的向量),然后确定您找到的点是否在该表面的边界内与该表面的平面相交。为此,您可以对该表面进行任何面积 > 0 的 2D 投影,并执行“多边形中的点”测试,这是您尝试执行的“多面体中的点”测试的 2D 版本。

祝你好运。

于 2011-02-10T22:07:40.517 回答
0

如果您在画布上绘制形状,这是一个快速简便的解决方案。

    private void Canvas_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.OriginalSource is Polygon)
        {
            //do something
        }
    }

“多边形”可以是 System.Windows.Shapes 中的任何形状。

于 2021-12-23T13:27:33.710 回答