程序给出奇怪的输出

时间:2014-11-07 19:45:44

标签: java

这个程序用于输出一系列整数,这些整数可以被另一个程序读取(由我的教师提供;我确信她的代码不是问题)来绘制线条图案。

预期的图案是四条曲线,从每个角开始并逆时针方向朝中心方向旋转;然后当每个动作的长度大于一个点和下一个点之间的距离时停止。

看起来像这样:
http://i.imgur.com/fLeHZah.png?1

不幸的是,程序要么在第一个点达到此距离时停止,并且不允许其他三个完成,要么在第四个和最后一个点到达此点时停止,但与此同时输出了一堆其他没有任何意义的随机行。

看起来像这样:
http://i.imgur.com/1ncJquj.png?1

此时,任何见解都会受到赞赏。代码如下。

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

1 个答案:

答案 0 :(得分:0)

在我看来,您在计算中遇到严重的舍入/截断错误,这主要是因为您使用int来表示&#34; slugs&的明确XY位置#34 ;. (这是x个对象的yPoint值。)

这意味着您要从int转换为double并反复转换回int。从doubleint的每次转化都会引入错误

我建议您使用double重新编码,以表示真正的X-Y位置,并在绘制线条时转换为int值。


(这里可能还有其他的东西;也就是其他一些不那么明显的bug。但按照我建议的方式进行计算会删除一些&#34;噪音&#34;并使代码更容易理解。)