我试图计算给定一组点(带有索引号的queenx,queeny)的斜率,以找出两个点是水平,垂直还是对角线。以下是代码:
请注意,方法checkSlope只是计算斜率。鉴于以下几点,我不明白这种方法有什么问题: [0,0] [6,1] [4,2] [7,3] [1,4] [3,5] [5,6] [2,7],它仍然显示有匹配,当确实没有。
for(int i = 0; i < 8; i++) {
int x1 = queenx.get(i);
int y1 = queeny.get(i);
for(int j = 0; j < 8; j++) {
int x2 = queenx.get(j);
int y2 = queeny.get(j);
if(i != j) {
double slope = Math.abs(checkSlope(x1, y1, x2, y2));
try {
if ((slope == 1) || (slope == 0)) {
correct = false;
System.out.println("x1 = " + x1 + " y1 = " + y1 + " x2 = " + x2 + " y2 = " + y2);
break;
}
} catch(Exception e) {
correct = false;
break;
}
}
}
}
public static double checkSlope(int x1, int y1, int x2, int y2) {
return (double)((y2 - y1) / (x2 - x1));
}
答案 0 :(得分:1)
问题是你转得太晚了。该部门使用整数。尝试删除外部的parens:(double)(y2 - y1) / (x2 - x1)
;
但这是一个很难的方法。而且,正如您所了解的那样,浮点计算很棘手。例如。如果分母为零,则斜率计算将失败。
更简单的方法:有4种情况:
y1 == y2
x1 == x2
y2 - y1 == x2 - x1
y2 - y1 == x1 - x2
您只需要测试这四种情况。你可以通过分解差异来使事情变得整洁:
int dy = y2 = y1;
int dx = x2 - x1;
if (dx == 0 || dy == 0 || dx == dy || dx == -dy) {
// match!
}
如果您愿意,可以将最后两个“或”案例替换为:abs(dx) == abs(dy)
。
答案 1 :(得分:0)
点 1 = (x,y) 点 2 = (a,b) 检查对角线:
沿着同一条水平线:y ==b 沿着同一条垂直线:x==a