我有一段代码检查给定的3个坐标是否彼此呈线性关系(如果是,则返回true)。但有没有办法让代码给出或采取几个像素/图?
private boolean collinear(double x1, double y1, double x2, double y2, double x3, double y3) {
return (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);
}
你看,坐标必须完全内联才能注册为线性。我如何能够在某种“范围”内查看它,以便检查一个值,然后用新值设置坐标?
----添加----
我试图看看3点是否形成一条直线,但是我想让它在一个阈值内检查(因为某些点可能稍微偏离)。一旦Java发现实际上这些点是线性的(给出或取出),我希望它然后将x1,x2,x3,y1等替换为Java检查的值。
答案 0 :(得分:1)
使用Hesse法线形式,您可以计算从点到线的垂直距离。因此,当距离小于一个阈值时,它们就足够了。
此类代码称为distanceFromLine
()
Java内置了
Line2D line = new Line2D.Double(x0, y0, x1, y1);
double distance = line.ptLineDist(px, py);
if (Math.abs(distance) < threshold) {
// is Near line
}
答案 1 :(得分:0)
您是在寻找符合某些特定公式的公差,还是仅仅是“关闭”?
如果您只是寻找一般的“关闭”,那么只需检查一些有用范围内的差异而不是相等。 e.g。
return Math.abs((x1-x2)*(y1-y3)-(y1-y2)*(x1-x3))<tolerance;
如果您有一些特定的规则,例如“第三个点必须在前两个点形成的行的2个像素内”或某些规则,那么当然您必须研究任何规则并明确编写代码实现它。