我正在编写一种方法来返回2点之间的点数列表。不管怎样,无论startPoint和endPoint位置如何,斜率(y2-y1)/(x2-x1)始终给我0.0。 这是方法:
public ArrayList<Point> calculatePath(Point startPoint, Point endPoint) {
ArrayList<Point> calculatedPath = new ArrayList<>();
int x1 = startPoint.x;
int y1 = startPoint.y;
int x2 = endPoint.x;
int y2 = endPoint.y;
System.out.println("Run");
if ((x2 - x1) != 0) {
float ratio = ((y2 - y1) / (x2 - x1));
System.out.println(ratio);
int width = x2 - x1;
for (int i = 0; i < width; i++) {
int x = Math.round(x1 + i);
int y = Math.round(y1 + (ratio * i));
calculatedPath.add(new Point(x, y));
}
} else {
if (y1 < y2) {
while (y1 == y2) {
calculatedPath.add(new Point(x1, y1));
y1++;
}
} else {
while (y1 == y2) {
calculatedPath.add(new Point(x1, y1));
y1--;
}
}
}
return calculatedPath;
}
有谁可以指出我做错了什么?感谢
答案 0 :(得分:5)
尝试将你的整数投射到花车中
在你的caluclation过程中,你需要将至少一个元素转换为float:
float ratio = ((float)(y2 - y1) / (float)(x2 - x1));
那是因为:
float a = integer / integer
^^^^^^^^^^^^^^^^^ - The result will be an integer.
Therefore u need to cast at least one of the
to float
这个例子很容易显示:
public static void main(String[] args)
{
float resultWithoutCast = 5 / 3;
float resultWithCast = (float)5 /3 ;
System.out.println(resultWithoutCast);
System.out.println(resultWithCast);
}
会打印
答案 1 :(得分:3)
你忘了在分裂期间施放你的int。尝试这样的事情: -
float ratio = ((float)(y2 - y1) / (x2 - x1));
答案 2 :(得分:2)
执行算术时,您需要确保使用允许预期结果的类型。例如,您的代码的问题是您正在寻找浮点结果但使用int
- 这里的问题是int
只会截断任何浮点。
有几种方法可以解决这个问题 - 正如已经建议你可以使用强制转换
float ratio = ((float)(y2 - y1) / (x2 - x1));
或者您可以使用float
个变量,它会产生更易读的代码,例如
float x1 = (float)startPoint.X;
float y1 = (float)startPoint.Y;
...
float ratio = (y2 - y1) / (x2 - x1);
然而,这导致更多的铸造。
或者,您可以将Point
替换为PointF
并完全取消投射。