2013-08-11 2 views
2

Я пишу метод, возвращающий список точек между двумя точками. Каким-то образом наклон (y2-y1)/(x2-x1) продолжает давать мне 0,0 все время независимо от позиций startPoint и endPoint. Вот метод:Поплавкий подсчет продолжает возвращаться 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; 
    } 

Можно ли указать, что я делаю неправильно? Благодаря

ответ

5

Попробуйте литья ваши Интс в поплавках, а

Во время caluclation вам нужно бросить хотя бы один элемент плавать:

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
+0

Sweet как !! большое спасибо. : P –

3

Вы забыли бросить ИНТ во время деления. Попробуйте что-то вроде этого: -

float ratio = ((float)(y2 - y1)/(x2 - x1)); 
+0

Awesome !! Оно работает. Такое простое решение @. @ Заняло у меня полчаса, чтобы узнать –

+0

@ ht.luvit: - Добро пожаловать! –

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 и полностью устранить отливку.

Смежные вопросы