2

我正在编写一种方法来返回 2 点之间的点列表。不知何故,斜率 (y2-y1)/(x2-x1) 一直给我 0.0,无论 startPoint 和 endPoint 位置。这是方法:

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;
    }

谁能指出我做错了什么?谢谢

4

3 回答 3

5

尝试将您的整数转换为浮点数

在计算过程中,您需要将至少一个元素转换为浮动:

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.0
  • 1.6666666
于 2013-08-11T10:37:56.667 回答
3

您在除法期间忘记施放您的 int。尝试这样的事情: -

float ratio = ((float)(y2 - y1) / (x2 - x1));
于 2013-08-11T10:39:07.547 回答
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);

然而,这导致更多的铸造。

或者,您可以换掉PointPointF完全消除铸造。

于 2013-08-11T10:44:10.037 回答