首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用acm.graphics绘制城堡和塔楼

用acm.graphics绘制城堡和塔楼
EN

Code Review用户
提问于 2018-01-15 10:42:16
回答 2查看 695关注 0票数 2

下面的代码是我对Java艺术与科学第5章练习10的解决方案。因此,在这里,使用acm程序和图形,我需要绘制一个城堡与两个侧塔和其他三个连续的塔,一些距离的主要建筑(城堡和它的两个侧塔)。有什么办法比这更快吗?

(这幅画很完美,因为我花了大量的时间为画布上的每一个物体寻找完美的位置。)

代码语言:javascript
复制
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));
}

}
EN

回答 2

Code Review用户

回答已采纳

发布于 2018-01-15 13:38:07

没有什么需要优化的,但以下几点仍然会加快速度:

代码语言:javascript
复制
final double tower_width = 150;
-------------------------------------------------- Compiler can fill in better
private static final double TOWER_WIDTH = 150;

代码语言:javascript
复制
GRect create_tower(double x, double y) {
-------------------------------------------------- Compiler can inline method body
private GRect createTower(double x, double y) {

文体风格:

代码语言:javascript
复制
public void run() {
-------------------------------------------------- Code Style, detects misspelling
@Override
public void run() {

通过GObject API提供的变体,可以实现真正的优化:

代码语言:javascript
复制
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

票数 0
EN

Code Review用户

发布于 2018-01-15 14:23:37

以下是我的意见:

1)与其为对象使用create方法,为什么不使用可以实例化的类呢?在我看来更清楚

代码语言:javascript
复制
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); --这更清楚地显示了将塔放置在特定位置的意图

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/185130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档