1

在我的教科书中,我很难理解这个例子的概念。这个想法是用红、黄和绿灯画一个红绿灯。我有一些问题。我无法弄清楚代码的哪一部分做了什么。

  1. 我是否正确假设cx并且cy要弄清楚页面的中心?
  2. fxfy找出框架的中心?
  3. 我不知道它是做什么dy的,为什么它被 4 分而不是 3 分给 3 盏灯,这LAMP_RADIUS完全让我感到困惑。
  4. 在红色,黄色和绿色的所有三个add(createFilledCircle)上,我不明白它们的位置是如何在红绿灯框架内计算的。
  5. createFilledCircle()我不明白的方法中GOval circle = newGOval(x-r, y-r, 2 * r, 2 * r);。我不明白什么x-r和做什么以及y-r这与职位有何关系。
import acm. graphics.*;
import acm. program.*;
import java.awt.*;

public class DrawStoplight extends GraphicsProgram {

    public void run () {
        double cx = getWidth() / 2;
        double cy = getHeight() / 2; 
        double fx = cx - FRAME_WIDTH / 2; 
        double fy = cy- FRAME_HEIGHT / 2; 
        double dy = FRAME_HEIGHT / 4 + LAMP_RADIUS / 2; 
        GRect frame = new GRect(fx, fy, FRAME_WIDTH, FRAME_HEIGHT);
        frame.setFilled(true);
        frame.setColor(Color.GRAY);
        add(frame);
        add(createFilledCircle(cx, cy - dy, LAMP_RADIUS, Color.RED));
        add(createFilledCircle(cx, cy, LAMP_RADIUS, Color.YELLOW));
        add(createFilledCircle(cx, cy + dy, LAMP_RADIUS, Color.GREEN));
    }

    private GOval createFilledCircle(double x, double y, double r, Color color){
        GOval circle = new GOval(x-r, y-r, 2 * r, 2 * r)
        circle.setColor(color);
        circle.setFilled(true);
        return circle;
    }

    private static final double FRAME_WIDTH = 50; 
    private static final double FRAME_HEIGHT = 100; 
    private static final double LAMP_RADIUS = 10; 

}
4

2 回答 2

1

我是否正确假设cx并且cy要弄清楚页面的中心?

是的

fxfy找出框架的中心?

不,它们是左上角坐标

我不知道 dy 做了什么,为什么它被 4 分而不是 3 分给 3 个灯,这LAMP_RADIUS完全让我感到困惑。

要将三盏灯垂直安装在一个盒子内,您需要一个在中间,一个在 1/4 高度,一个在 3/4 高度 - 因此除以四。我不确定为什么LAMP_RADIUS会进入它。这似乎是我通常所说的“软糖因素”,以使灯的间距更宽,即看起来正确的图形,但没有任何好的理由为什么它看起来正确......

在红色,黄色和绿色的所有三个add(createFilledCircle)上,我不明白它们的位置是如何在红绿灯框架内计算的。

它们只是垂直间隔dy

createFilledCircle()我不明白的方法中GOval circle = newGOval(x-r, y-r, 2 * r, 2 * r);。我不明白什么x-r和做什么以及y-r这与职位有何关系。

GOval一个圆圈放在由(x - r, y - r)具有大小的坐标定义的框内2r- 即以边长2r为中心的正方形(x, y)

于 2012-10-15T23:47:31.090 回答
1
1. Am I right to assume cx and cy are to figure out the center of the page?

是的

2. Are fx and fy to figure out the center of the frame?

不完全是。他们正在计算框架的左上角。它们从中心开始,并在每个方向上“备份”一半的帧大小。

3. I don't know what dy does and why it's divided by 4 and not 3 for 3 lights and the LAMP_RADIUS totally confuses me. 

在代码中往下看。 dy是灯之间的垂直距离。黄灯正好在中心绘制,红色在dy上面,绿色在dy下面。除数是4因为作者选择将红灯的底边对齐到距框架顶部1/4框架高度的点。同样,他选择将绿灯的顶部与距底部框架高度 1/4 的点对齐。他本可以选择许多其他的计算方式dy

4. On all three add(createFilledCircle) for red, yellow and green I don't understand how their position is calculated inside the stoplight frame. 

它们都具有相同的 x 坐标:框架的中心。y 坐标的计算如 3 中所述。请记住,在屏幕坐标中,正方向是向下的,因此增加 y 会使光线降低。减少使它更高。

5. In the method createFilledCircle() I don't understand GOval circle = newGOval(x-r, y-r, 2 * r, 2 * r);. I don't understand what x-r and y-r does and how that relates to position.

去阅读 newGOval 的手册定义。它在矩形内刻出一个椭圆形。参数是矩形的左上角,后跟宽度和高度。因此,如果 (x,y) 是中心,这将给出一个对角线 (xr, yr) 到 (x+r, y+r) 的框。当您在其中刻一个椭圆时,您会根据需要得到一个以 (x,y) 为中心的圆。

于 2012-10-15T23:58:16.953 回答