繁体   English   中英

点内三角形2d

[英]Point inside triangle 2d

因此,我创建了一种方法来检查点“ ponto”是否在由点A,B,C给出的三角形的顶点内。

到目前为止,我有这个:

final double PRECISION = 0.1;
public boolean dentroDoTriangulo (Point A, Point B, Point C, Point ponto){

    //total
    double ABC = Math.abs ((A.x*(B.y-C.y)+B.x*(C.y-A.y)+ C.x*(A.y-B.y))/2);

    //parcial
    double ABP = Math.abs((A.x*(B.y-ponto.y)+B.x*(ponto.y-A.y)+ponto.x*(A.y-B.y))/2);
    double APC = Math.abs (A.x*(ponto.y-C.y)+ponto.x*(C.y-A.y)+C.x*(A.y-ponto.y))/2;
    double PBC = Math.abs (ponto.x*(B.y-C.y)+B.x*(C.y-ponto.y)+C.x*(ponto.y-B.y))/2;
    double parciais = ABP + APC + PBC ;
    return Math.abs(ABC - parciais) <= PRECISION;
}

我已经尝试过这样做:

ABP +APC +PBC == ABC

也没有任何人可以帮助我了解我在这里做错了什么吗?

编辑:您的代码似乎可以正常工作。 这是一个Point类示例,以防万一您崩溃了。

    public class Point {
      float x;
      float y;
      Point() {
        x = 0;
        y = 0;
      }
      Point(float x, float y) {
        this.x = x;
        this.y = y;
      }
    }

为了以防万一,我提出了另一种解决方案:

查看此算法以确定该点是否在三角形内

我看不到您的Point类,所以我不知道那里是否有错误。 我假设它是x&y坐标的两个浮点数。 我们认为可以。

您能更好地解释您的算法吗? 我好像您正在将三个子三角形的区域相加并将它们与原始三角形(具有PRECISION公差)进行比较。 如果需要,尝试按超链接中所述尝试“ SameSide”函数三遍-先取两个叉积,然后取叉积结果的点积,以确定一个点是否在两条线之间的“正确边”上任意两个顶点(共有三条这样的线)。

算法的代码段:

boolean SameSide(p1, p2, a, b) {
  int[] cp1 = CrossProduct(b - a, p1 - a);
  int[] cp2 = CrossProduct(b - a, p2 - a);
  if (DotProduct(cp1, cp2) >= 0) {
    return true;
  }
  return false;
}

boolean PointInTriangle(p, a, b, c) {
  if (SameSide(p, a, b, c) && SameSide(p, b, a, c) &&
    SameSide(p, c, a, b) {
      return true;
    }
  return false;
}

其中a,b,c是顶点,p是点。 我建议使用int []来保存向量。 您将需要编写辅助函数来计算向量操作。

我无法遵循您的算法,但是您可以从该点向两个方向发出水平(或任何方向)的光线。 如果它在两个方向上都撞击三角形,则该点将位于三角形内部。 您将需要注意光线撞击顶点的特殊条件。 那将被认为是在一侧打了两条线。 但是,只要射线在两个方向上都撞击三角形,该点就会在内部。

因此,我将您的代码用于方法dentroDoTriangulo,并将其卡在类中。 我使用了上面给出的Point类。 然后,我使用下面给出的快速而肮脏的代码调用了您的方法。 它似乎没有任何问题。 就像上面的@TNT一样,测试用例会有所帮助。

 public class Caller { public static void main(String[] args) { Triangle myTraingle = new Triangle(); boolean isInside = myTraingle.dentroDoTriangulo(new Point(1,0), new Point(3,0), new Point(2,2), new Point(2,1)); if (isInside) { System.out.println("Point is inside"); } else { System.out.println("Point is outside"); } } } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM