2013-08-11 3 views
2

2 점 사이의 점 목록을 반환하는 메소드를 작성하고 있습니다. 어떻게 든 기울기 (y2-y1)/(x2-x1)은 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 동안뿐만 아니라

수레로의 int를 주조하십시오 :이다

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 

이를 예를 들어 easly 보여줍니다 :

public static void main(String[] args) 
{ 
    float resultWithoutCast = 5/3; 
    float resultWithCast = (float)5 /3 ; 

    System.out.println(resultWithoutCast); 
    System.out.println(resultWithCast); 
} 

그것은 당신이 분열하는 동안 INT 캐스팅 깜빡

  • 1.0
  • 1.6666666
+0

Sweet as !! 정말 고마워. : P –

3

인쇄됩니다. 다음과 같이 시도하십시오. -

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

신난다 !! 그것은 작동합니다. 그런 간단한 해결책 @. @는 나를 발견하기 위해 30 시간이 걸렸다. –

+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); 

그러나 더 많은 캐스팅이 발생합니다.

PointPointF으로 바꿔 완전히 전송하지 않아도됩니다.

관련 문제