我确信我的问题非常通用,可能是一个纯粹的java问题。然而,我一直试图找到一种方法来确定三个坐标是否共线使用相同的发现逻辑它似乎不适用于以“点”作为输入的示例。 有两种方法可以 1.找到形成三个坐标/点的三角形区域。如果他们在同一条线上;面积的值必须为零。 2.将连接这些坐标的线分成两条,找到相同的斜坡。如果它们在同一条线上,则斜率将相同。
以下是我正在尝试的方法。
private
boolean collinearCheck( Coordinate endPointOne , Coordinate intersection,Coordinate endPointTwo ){
boolean isCollenear = false;
//Area of triangle approach
double area = (Math.round(endPointOne.x )* (Math.round(intersection.y) - Math.round (endPointTwo.y)) + Math.round(intersection.x )* (Math.round(endPointTwo.y) - Math.round (endPointOne.y)) +
Math.round(endPointTwo.x) * (Math.round(endPointOne.y) - Math.round(intersection.y)));
if((endPointOne.x * (intersection.y - endPointTwo.y) + intersection.x * (endPointTwo.y - endPointOne.y) +
endPointTwo.x * (endPointOne.y - intersection.y))<= 0) if(Math.round(area) <= 0)
{
isCollenear = true;
}
// Slope Approach
double numeratorOne = Math.round(intersection.y) - Math.round(endPointOne.y);
double denominatorOne = Math.round(intersection.x) - Math.round(endPointOne.x);
double numeratorTwo = Math.round(endPointTwo.y) - Math.round(intersection.y);
double denominatorTwo = Math.round(endPointTwo.x) - Math.round(intersection.x);
double result1 = Math.round(numeratorOne/denominatorOne);
double result2 = Math.round(numeratorTwo/denominatorTwo);
if(result1== 0 && result2==0){
isCollenear = true;
}
return isCollenear;
}
在这两种情况下,使用坐标作为输入;即使对于类似的共线情况,我最终也会获得该区域的4等值。对于明显不共线的情况;我最终获得了相同的斜率值。
有没有办法可以使用任何构造获得明确的共线性通知?我的方法是否正确? 传递给方法的坐标i的样本值是Coordinate endPointOne = -26.666666666666686,32.38095238095238 .... etc
期待您的投入。
谢谢&amp;此致
答案 0 :(得分:5)
我没有检查区号,而是检查三个点是否共线。那么公式是:
点(x1,y1),(x2,y2),(x3,y3)。
它应该是colinear iff,
(y2-y1) (y3-y2)
------- = -------
(x2-x1) (x3-x2)
所以代码应该是,
if(result1==result2){
isCollenear = true;
}
答案 1 :(得分:2)
有两件事:你知道Math.round
做(long)Math.floor(a + 0.5d)
并且比较==
的双打真的不是一个好主意去找像Math.abs(a - b) < EPSILON
这样的东西比较一些小数的差异的地方。
答案 2 :(得分:0)
Split the line joining these coordinates into two and find the individual slopes for the same. If they are on the same line, the slopes will be same.
- 这种方法最好找出三个点是否共线,但你的代码几乎不需要修改,
修改这些行
double result1 = Math.round(numeratorOne/denominatorOne);
double result2 = Math.round(numeratorTwo/denominatorTwo);
if(result1== 0 && result2==0){
isCollenear = true;
}
到
double result1 = numeratorOne/denominatorOne;
double result2 = numeratorTwo/denominatorTwo;
double r3= Math.round((result1 -result2)*1000.0); // to apply 0.001 tolerance
if(r3==0)
{
isCollenear = true;
}
答案 3 :(得分:0)
有一种更简单的方法。
这两个点之间的直线公式(x 1 ,y 1 )和(x 2 ,y < sub> 2 )是:
y = y 1 +((y 2 - y 1 )/(x 2 - x 1 ))*(x - x 1 )
测试if(x 3 ,y 3 )是否满足上述公式...在可接受的delta内(允许舍入误差)。
要获得最准确的结果,请选择点(x 3 ,y 3 )为该线的中间点;例如x 3 介于x 1 和x 2 之间
(谨防堕落的情况,其中(x 2 - x 1 )为零......)