【问题标题】:How do I check if a point is contained between 4 other points?如何检查一个点是否包含在其他 4 个点之间?
【发布时间】:2013-02-21 22:13:18
【问题描述】:

我有 4 个点可以创建一些四边形,我想知道第五个点是否介于它们之间。 类似于这些图像:

第五个点在哪里没关系,我需要知道第五个点是否在其他4个点创建的区域内。

4 个点也可以移动。 我该怎么做?

【问题讨论】:

标签: c# winforms geometry area


【解决方案1】:

您可以使用 GraphicsPath 类。

Point p1 = new Point(1,0);
Point p2 = new Point(10, 3);
Point p3 = new Point(9, 13);
Point p4 = new Point(3,2);
Point p = new Point(5,5);
GraphicsPath g = new GraphicsPath();
g.AddPolygon(new Point[] { p1, p2, p3, p4 });
var result = g.IsVisible(p);

【讨论】:

    【解决方案2】:

    如果您有这些点的坐标,请尝试获取创建四边形的点的线性方程。我将用三角形中的点来解释它。假设我们在外面有 3 个点:

    A(-1,-1)
    B(0,2)
    C(1,1)
    

    还有一个在里面:

    D(0,0)
    

    你可以找到外点的线性方程:

    AB -> y = 3x + 2
    BC -> y = -x + 2
    CA -> y = x
    

    然后你计算 x=0 的 y(因为点 D 有 x=0)并且你知道 D 低于 AB,低于 BC 但它在 CA(如果它高于 CA,它将在三角形 ABC 内)。

    【讨论】:

      【解决方案3】:
      public class PolygonFence
      {
          public List<Point> PointList = new List<Point>();
      
          public PolygonFence(List<Point> points)
          {
              foreach (Point p in points)
              {
                  this.PointList.Add(p);
              }
          }
      
          public int Count()
          {
              return PointList.Count;
          }
      
          public bool IsWithinFence(Point p)
          {
              int sides = this.Count();
              int j = sides - 1;
              bool pointStatus = false;
              for (int i = 0; i < sides; i++)
              {
                  if (PointList[i].Y < p.Y && PointList[j].Y >= p.Y || PointList[j].Y < p.Y && PointList[i].Y >= p.Y)
                  {
                      if (PointList[i].X + (p.Y - PointList[i].Y) / (PointList[j].Y - PointList[i].Y) * (PointList[j].X - PointList[i].X) < p.X)
                      {
                          pointStatus = !pointStatus;
                      }
                  }
                  j = i;
              }
              return pointStatus;
          }
      }
      

      将点添加到PointList 并调用IsWithinFence() 方法。 Point p 是您要检查它是否在多边形内的点。 关于运动的部分,你必须自己弄清楚!

      【讨论】:

        猜你喜欢
        • 2013-09-06
        • 2020-02-03
        • 2014-12-12
        • 1970-01-01
        • 2016-01-14
        • 2020-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多