1

我确信我的问题是一个非常通用的问题,可能是一个纯 Java 问题。但是,我一直在尝试找到一种方法来确定三个坐标是否共线,使用相同的查找逻辑似乎不适用于将“点”作为输入的示例。两种方法可以是 1. 找到形成三个坐标/点的三角形面积。如果他们在同一行;area 的值必须为零。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 等值。对于明显不共线的情况;我最终得到了相同的斜率值。

有没有办法可以使用任何构造获得明确的共线性通知?我的方法正确吗?我传递给该方法的坐标的样本值为 Coordinate endPointOne = -26.666666666666686, 32.38095238095238 .... 等

期待您的投入。

感谢和问候

4

4 回答 4

6

我不是在检查区号,而是检查三个点是否共线。那么公式是:

点 (x1,y1), (x2,y2), (x3,y3)。

它应该是共线的当且仅当,

 (y2-y1)      (y3-y2)
 -------  =   -------
 (x2-x1)      (x3-x2)

所以代码应该是,

  if(result1==result2){
      isCollenear = true;
  }
于 2013-06-05T08:56:32.397 回答
2

两件事:你知道吗?Math.round比较(long)Math.floor(a + 0.5d)双打==真的不是一个好主意,比如Math.abs(a - b) < EPSILON将差异与小数位进行比较。

于 2013-06-05T08:57:56.843 回答
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;
}
于 2013-06-05T09:14:54.110 回答
0

有一个更简单的方法。

  1. 这两个点 (x 1 , y 1 ) 和 (x 2 , y 2 ) 之间的线的公式是:

    y = y 1 + ((y 2 - y 1 ) / (x 2 - x 1 )) * (x - x 1 )

  2. 测试 (x 3 , y 3 ) 是否满足上述公式……在可接受的增量内(以允许舍入误差)。

为获得最准确的结果,请选择使 (x 3 , y 3 ) 为直线中点的点;例如 x 3在 x 1和 x 2之间

(注意 (x 2 - x 1 ) 为零的退化情况......)

于 2013-06-05T10:33:24.967 回答