2014-11-07 3 views
0

이 프로그램은 다른 프로그램 (강사가 제공 한 것으로, 나는 그녀의 코드가 문제가 아님)으로 읽을 수있는 일련의 정수를 출력하여 줄 패턴을 그리기위한 것입니다.이상한 결과를내는 프로그램

의도 한 패턴은 각 모서리에서 시작하여 가운데 방향으로 시계 반대 방향으로 회전하는 4 개의 곡선입니다. 각 운동의 길이가 한 점과 다음 점 사이의 거리보다 클 때 멈 춥니 다.

은 다음과 같습니다, 불행히도 프로그램을
http://i.imgur.com/fLeHZah.png?1

를 하나이 거리가 첫번째 포인트에 도달하면 중지하고 다른 세를 완료 할 수없는, 또는 정지 할 때 네 번째 마지막 지점은이 시점에 도달했지만, 그 사이에 아무 의미가없는 다른 임의의 선이 출력됩니다.

은 다음과 같습니다
http://i.imgur.com/1ncJquj.png?1

어떤 통찰력이 시점에서 감상 할 수있다. 코드는 다음과 같습니다. 당신이 "굼벵이"의 최종 X-Y 위치를 나타 내기 위해 int를 사용하고 있다는 사실로 인해 (주로), 귀하의 계산에 심각한 반올림/절단 오류에서 고통처럼 내게 보이는

import java.util.Scanner; 
import java.io.*; 
import java.awt.Point; 

public class Slugs { 
    public static void main(String[] args) { 
     Scanner input = null; 
     try { 
      input = new Scanner(new File("slug_details.txt")); 
     } 
     catch (java.io.FileNotFoundException e) { 
      System.out.println("Sorry, file not found."); 
      System.exit(-1); 
     } 
     String filename = input.next(); 
     int boxSize = input.nextInt(); 
     int d = input.nextInt(); 

     Point[]slugs = new Point[4]; 
     slugs[0] = new Point(0, 0); 
     slugs[1] = new Point(0, boxSize); 
     slugs[2] = new Point(boxSize, boxSize); 
     slugs[3] = new Point(boxSize, 0); 

     PrintStream output = null; 
     try { 
      output = new PrintStream(new File(filename)); 
     } 
     catch (java.io.FileNotFoundException e) { 
      System.out.println("Sorry, file could not be created."); 
      System.exit(-1); 
     } 
     output.println(boxSize + " " + boxSize); 

     moveSomeSlugs(slugs, d, output); 

    } 
    public static void moveSomeSlugs(Point[]slugs, double d, PrintStream output){ 
     /* move slugs distance d until d > 
     */ 
     double distance = 0.0; 
     double ratio = 0.0; 
     for (int i = 0; i<(slugs.length); i++){ 
      distance = Math.sqrt((Math.pow((slugs[(i+1)%4].x-slugs[i].x), 2))+(Math.pow((slugs[(i+1)%4].y-slugs[i].y), 2))); 
      ratio = d/distance; 
     } 
     while (d <= distance){ 
      for (int i = 0; i<4; i++){ 
       double xmoveDist = (slugs[(i+1)%4].x-slugs[i].x)*ratio; 
       double ymoveDist = (slugs[(i+1)%4].y-slugs[i].y)*ratio; 
       output.print (Math.abs(slugs[i].x) + " " + Math.abs(slugs[i].y) + " "); 
       slugs[i].x += xmoveDist; 
       slugs[i].y += ymoveDist; 
       output.println (Math.abs(slugs[i].x) + " " + Math.abs(slugs[i].y)); 
       distance = Math.sqrt((Math.pow((slugs[(i+1)%4].x-slugs[i].x), 2))+(Math.pow((slugs[(i+1)%4].y-slugs[i].y), 2))); 
       ratio = d/distance; 
       if (d > distance && i == slugs.length-1){ 
        break; 
       } 
      } 
     } 
    } 
} 
+0

원하는 출력과 현재 출력을 포함하도록 게시물을 편집 할 수 있습니까? – Pokechu22

+0

완료. 이미지를 추가 할 수 없어 명성이 너무 낮습니까? –

+0

입력 예는 무엇입니까? 귀하의 민달팽이가 중간에 도달했을 때 멈추지 않고있는 것처럼 보입니다. –

답변

0

. (즉 Point 개체 xy 값이다.)

이 반복적으로 다시 intint에서 double로 변환되는 것을 의미한다. intdouble에서 각 변환 오류,

난 당신이 진정한 X-Y 위치를 나타내며, 당신이 선을 그릴 때 단지 int 값으로 변환하는 double를 사용하여 코딩 제안을 소개합니다.


이 (가 뭔가 다른뿐만 아니라 여기에 갈 수있다. 즉, 덜 분명하다 다른 버그 그러나 계산을 좀 "노이즈"를 제거하고 이해하기 쉬운 코드를 만들 것 제안하는 방식을하고.)

관련 문제