下面的代码是我对Java艺术与科学第5章练习10的解决方案。因此,在这里,使用acm程序和图形,我需要绘制一个城堡与两个侧塔和其他三个连续的塔,一些距离的主要建筑(城堡和它的两个侧塔)。有什么办法比这更快吗?
(这幅画很完美,因为我花了大量的时间为画布上的每一个物体寻找完美的位置。)
import acm.program.*;
import acm.graphics.*;
public class Hw1 extends GraphicsProgram {
final double tower_width = 150;
final double tower_height = 600;
final double main_house_width = 400;
final double main_house_height = 500;
final double s_tower_width = 75;
final double s_tower_height = 300;
final double door_width = 50;
final double door_height = 100;
final double window_width = 100;
final double window_height = 100;
GRect create_tower(double x, double y) {
GRect rect = new GRect(tower_width, tower_height);
rect.move(x, y);
return rect;
}
GRect create_main_home(double x, double y) {
GRect rect = new GRect(main_house_width, main_house_height);
rect.move(x, y);
return rect;
}
GRect create_s_tower(double x, double y) {
GRect rect = new GRect(s_tower_width, s_tower_height);
rect.move(x, y);
return rect;
}
GRect create_door(double x, double y) {
GRect rect = new GRect(door_width, door_height);
rect.move(x, y);
return rect;
}
GOval create_window(double x, double y) {
GOval circle = new GOval(window_width, window_height);
circle.move(x, y);
return circle;
}
GPolygon create_arch(double x, double y) {
GPolygon arch = new GPolygon();
arch.addVertex(x, y);
arch.addVertex(x+150, y);
arch.addVertex(x+75, y-150);
return arch;
}
GPolygon create_s_arch(double x, double y) {
GPolygon arch = new GPolygon();
arch.addVertex(x, y);
arch.addVertex(x+75, y);
arch.addVertex(x+37.5, y-100);
return arch;
}
GPolygon create_arch_door(double x, double y) {
GPolygon arch = new GPolygon();
arch.addVertex(x, y);
arch.addVertex(x+50, y);
arch.addVertex(x+25, y-50);
return arch;
}
GPolygon create_house_arch(double x, double y) {
GPolygon arch = new GPolygon();
arch.addVertex(x, y);
arch.addVertex(x+400, y);
arch.addVertex(x+200, y-200);
return arch;
}
public void run() {
add(create_tower(700, 250));
add(create_tower(150, 250));
add(create_main_home(300, 350));
add(create_s_tower(1000, 550));
add(create_s_tower(1200, 550));
add(create_s_tower(1400, 550));
add(create_door(475, 750));
add(create_window(350, 450));
add(create_window(550, 450));
add(create_arch(150, 250));
add(create_arch(700, 250));
add(create_s_arch(1000, 550));
add(create_s_arch(1200, 550));
add(create_s_arch(1400, 550));
add(create_arch_door(475, 750));
add(create_house_arch(300, 350));
}
}发布于 2018-01-15 13:38:07
没有什么需要优化的,但以下几点仍然会加快速度:
final double tower_width = 150;
-------------------------------------------------- Compiler can fill in better
private static final double TOWER_WIDTH = 150;和
GRect create_tower(double x, double y) {
-------------------------------------------------- Compiler can inline method body
private GRect createTower(double x, double y) {文体风格:
public void run() {
-------------------------------------------------- Code Style, detects misspelling
@Override
public void run() {通过GObject API提供的变体,可以实现真正的优化:
GRect create_main_home(double x, double y) {
GRect rect = new GRect(main_house_width, main_house_height);
rect.move(x, y);
return rect;
}
-------------------------------------------------- Optimised API usage
GRect createMainHome(double x, double y) {
return new GRect(x, y, MAIN_HOUSE_WIDTH, MAIN_HOUSE_HEIGHT);
}我冒昧地使用了java风格,这在java中是一个相当困难的惯例(所以我不会被否决)。
值得怀疑的是是使用int还是float而不是double。我会把它留在double。
发布于 2018-01-15 14:23:37
以下是我的意见:
1)与其为对象使用create方法,为什么不使用可以实例化的类呢?在我看来更清楚
public class Tower extends GRect {
final double width = 150;
final double height = 600;
public Tower() {
super(width, height);
}
}2)而不是创建一个GRect,然后移动它,您可以在add时指定它的位置:add(new Tower(), 700, 250); --这更清楚地显示了将塔放置在特定位置的意图
https://codereview.stackexchange.com/questions/185130
复制相似问题