2012-10-15 116 views
1

在我的教科書中,我很難理解這個例子的概念。這個想法是用紅色,黃色和綠色的燈光畫一個紅綠燈。我有一些問題。我無法弄清楚代碼的哪部分做了什麼。用紅色,黃色和綠色指示燈繪製紅綠燈的代碼是如何工作的?

  1. 我有權利承擔cxcy是找出頁面的中心嗎?
  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-ry-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; 

} 
+0

感謝你們兩位。 –

回答

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? 

未邊長2r的平方究竟。他們正在計算框架的左上角。他們從中心開始,在每個方向上「倒退」一半的框架尺寸。

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)是中心,那麼給(x + r,y + r)對角線(x-r,y-r)的框。當你在上面寫上一個橢圓時,你會得到一個以(x,y)爲中心的圓。

+0

非常感謝。我只是簡單地忘記了或不記得座標是由數字和圓圈的左上角計算的。這讓我對計算結果感到困惑。 –

1

我說得對不對承擔cxcy是找出頁面的中心?

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-ry-r做什麼以及如何與位置相關。

GOval把一個圓由座標(x - r, y - r)與大小2r定義箱內 - 即中心位於(x, y)

+0

感謝您的解釋。我在這個問題上遇到了很多麻煩,因爲我忘記了左上角是如何計算座標。 –

相關問題