2012-10-15 2 views
1

내 텍스트 북에서이 예제의 개념을 파악하는 데 많은 어려움을 겪고 있습니다. 아이디어는 빨강, 노랑 및 녹색 불빛과 함께 신호등을 그립니다. 나는 몇 가지 질문이있다. 코드의 일부가 무엇인지 알아내는 데 문제가 있습니다.빨강, 노랑 및 녹색 표시등이있는 신호등을 그리는 코드는 어떻게 작동합니까?

  1. cxcy 페이지의 중심을 파악하는 것이 맞습니까?
  2. 프레임의 중심을 알아 내기 위해 fxfy이 있습니까?
  3. 무엇이 dy인지 모르겠으며 왜 3 등으로 3이 아닌 4로 나뉘며 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? 

을 중심으로 측면 길이 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

오전 내가 바로 cx 가정하고 cy 페이지의 중심을 알아낼 수 있습니다?

는 프레임의 중앙을 알아 내기 위해 fxfy 있습니까?

아니, 그들이있어 왼쪽 상단

나는하며 만약 4로 나눈 아니라 3 세에 대한 조명과 있어요 왜 LAMP_RADIUS 완전히 나를 혼란 어떤 DY 모르는 좌표입니다.

상자 안에 세로로 세 개의 표시등을 맞추려면 중간에 하나, 높이가 1/4, 높이가 3/4가되어야합니다. 따라서 4로 나누십시오. 나는 왜 LAMP_RADIUS이 들어 있는지 확신 할 수 없다. 내가 일반적으로 잘 보이는 그림, 즉 램프가 더 넓게 간격을 만들기 위해 "퍼지 요인"이라고 부르는 것으로 보인다, 그러나 어떤 이유없이 잘 보이는 이유...

빨강, 노랑 및 초록색에 대한 세 개의 add(createFilledCircle)에서 나는 위치 신호가 정지 신호 프레임 내부에서 어떻게 계산되는지 이해하지 못합니다.

는 그들은 단지 수직으로 나는 GOval circle = newGOval(x-r, y-r, 2 * r, 2 * r);을 이해하지 못하는 createFilledCircle() 방법에서 dy

에 의해 간격 있습니다. 나는 x-ry-r이 무엇을하는지, 어떻게 그 위치와 관련이 있는지 이해하지 못합니다.GOval

크기 2r와 좌표 (x - r, y - r)에 의해 정의 된 상자 안에 원을 박 았어요 -

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

하지

(x, y)

+0

. 왼쪽 상단이 좌표 계산 방법을 잊어 버렸기 때문에 나는이 문제에 많은 어려움을 겪었습니다. –

관련 문제