我有三个三角形的顶点,我试图找到位于三角形内侧和侧面的所有整数点。我已经尝试了很多方法,他们都成功找到了内部点,但未能找到三角形两侧的点。目前我正在使用重心坐标:
private static boolean pointInTriangle(int[] p, int[] c1, int[] c2, int[] c3){
float alpha = ((c2[1] - c3[1])*(p[0] - c3[0]) + (c3[0] - c2[0])*(p[1] - c3[1])) /
((c2[1] - c3[1])*(c1[0] - c3[0]) + (c3[0] - c2[0])*(c1[1] - c3[1]));
float beta = ((c3[1] - c1[1])*(p[0] - c3[0]) + (c1[0] - c3[0])*(p[1] - c3[1])) /
((c2[1] - c3[1])*(c1[0] - c3[0]) + (c3[0] - c2[0])*(c1[1] - c3[1]));
float gamma = 1.0f - alpha - beta;
return ( (alpha>=0.0f) && (beta>=0.0f) && (gamma>=0.0f) );
例如,对于顶点(0,0),(0,10),(10,10),它确实找到(10,8)但它也找到(11,8)不正确。
有人能帮助我吗?
提前致谢!
答案 0 :(得分:1)
使用您需要的代码来查找位置是否在三角形内。然后对于另一部分,如果一个点是否在线上......
我会这样做..
通过一次计算2个顶点之间的距离来检查。 假设我们有顶点a,b和c。点p。
检查p是否在a和b之间的线上。
这可以通过衡量a -> p
和p -> b
之间的距离来完成。
如果这两个距离等于a -> b
的距离,则它就在线上。如果p应该离线,距离会更长。
这是一种计算距离的方法(毕达哥拉斯定理):
private static double GetDistance(double x1, double y1, double x2, double y2)
{
double a = Math.abs(x1-x2);
double b = Math.abs(y1-y2);
return Math.sqrt(a * a + b * b);
}