Java 这段代码是如何绘制红、黄、绿灯的红绿灯的?

Java 这段代码是如何绘制红、黄、绿灯的红绿灯的?,java,Java,在我的课本中,我很难理解这个例子的概念。这个想法是画一个红、黄、绿三色的红绿灯。我有几个问题。我很难弄清楚代码的哪一部分起什么作用 我假设cx和cy是要计算页面的中心,对吗 fx和fy是否用于计算框架的中心 我不知道dy是做什么的,也不知道为什么它被4除,而不是3除,3个灯,灯的半径完全把我弄糊涂了 在所有三个add(createFilled圆圈)上,对于红色、黄色和绿色,我不明白它们在红绿灯框内的位置是如何计算的 在方法createFilledCircle()中,我不理解GOval circl

在我的课本中,我很难理解这个例子的概念。这个想法是画一个红、黄、绿三色的红绿灯。我有几个问题。我很难弄清楚代码的哪一部分起什么作用

  • 我假设
    cx
    cy
    是要计算页面的中心,对吗
  • fx
    fy
    是否用于计算框架的中心
  • 我不知道dy是做什么的,也不知道为什么它被4除,而不是3除,3个灯,
    灯的半径
    完全把我弄糊涂了
  • 在所有三个
    add(createFilled圆圈)
    上,对于红色、黄色和绿色,我不明白它们在红绿灯框内的位置是如何计算的
  • 在方法
    createFilledCircle()
    中,我不理解
    GOval circle=newGOval(x-r,y-r,2*r,2*r)。我不明白
    x-r
    y-r
    的作用,以及它们与位置的关系
    导入acm。图形。*;
    进口acm。方案*;
    导入java.awt.*;
    公共类DrawStoplight扩展图形程序{
    公开作废运行(){
    双cx=getWidth()/2;
    double cy=getHeight()/2;
    双fx=cx-帧宽度/2;
    双fy=cy-框架高度/2;
    双dy=框架高度/4+灯半径/2;
    GRect frame=新GRect(外汇、财政、帧宽、帧高);
    frame.setFilled(true);
    框。设置颜色(颜色。灰色);
    添加(框架);
    添加(createFilledCircle(cx,cy-dy,LAMP_半径,Color.RED));
    添加(createFilledCircle(cx、cy、灯_半径、颜色.黄色));
    添加(创建填充圆(cx,cy+dy,灯的半径,颜色.绿色));
    }
    private GOval createFilledCircle(双x、双y、双r、彩色){
    GOval循环=新GOval(x-r、y-r、2*r、2*r)
    圆。设置颜色(颜色);
    圆圈。设置填充(真);
    返回圈;
    }
    专用静态最终双帧_宽度=50;
    专用静态最终双框_高度=100;
    专用静态最终双灯_半径=10;
    }
    
    我假设
    cx
    cy
    是要计算页面的中心,对吗

    fx
    fy
    是否用于计算框架的中心

    不,它们是左上角的坐标

    我不知道dy是做什么的,为什么它被4除,而不是3除,3个灯,
    LAMP\u RADIUS
    完全把我搞糊涂了

    在一个盒子里垂直安装三盏灯,你需要一个在中间,一个在1/4个高度,一个在3/4个高度,因此除以四。我不确定为什么
    灯的半径
    会进入它。这似乎是我通常所说的“模糊因素”,使灯的间距更大,即一个看起来正确的数字,但没有任何好的理由说明它看起来正确

    在所有三个
    add(createFilled圆圈)
    上,对于红色、黄色和绿色,我不明白它们在红绿灯框内的位置是如何计算的

    它们的垂直间隔为
    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)

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

    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帧高度的点对齐。他本可以选择许多其他的计算方法

    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)为中心的圆,这是你想要的。

    非常感谢。我只是忘记或不记得坐标是由数字和圆的左上角计算出来的。这让我对正在进行的计算感到困惑。谢谢你的解释。我在这个问题上遇到了很多麻烦,因为我忘了左上角是如何计算坐标的。
    4. On all three add(createFilledCircle) for red, yellow and green I don't understand how their position is calculated inside the stoplight frame. 
    
    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.