这个程序用于输出一系列整数,这些整数可以被另一个程序读取(由我的教师提供;我确信她的代码不是问题)来绘制线条图案。
预期的图案是四条曲线,从每个角开始并逆时针方向朝中心方向旋转;然后当每个动作的长度大于一个点和下一个点之间的距离时停止。
看起来像这样:
不幸的是,程序要么在第一个点达到此距离时停止,并且不允许其他三个完成,要么在第四个和最后一个点到达此点时停止,但与此同时输出了一堆其他没有任何意义的随机行。
看起来像这样:
此时,任何见解都会受到赞赏。代码如下。
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 :(得分:0)
在我看来,您在计算中遇到严重的舍入/截断错误,这主要是因为您使用int
来表示&#34; slugs&的明确XY位置#34 ;. (这是x
个对象的y
和Point
值。)
这意味着您要从int
转换为double
并反复转换回int
。从double
到int
的每次转化都会引入错误
我建议您使用double
重新编码,以表示真正的X-Y位置,并在绘制线条时转换为int
值。
(这里可能还有其他的东西;也就是其他一些不那么明显的bug。但按照我建议的方式进行计算会删除一些&#34;噪音&#34;并使代码更容易理解。)