[英]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.