当前位置: 首页 > 知识库问答 >
问题:

帮助一个Java计划画出彩虹

章博耘
2023-03-14

这件事我会坦白的;这是一个家庭作业,但有人能引导我走上正确的方向,并向我解释代码的某些部分应该是如何工作的吗?说明在代码和问题下面。

这是我到目前为止的代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Rainbow extends JPanel
{
  // Declare skyColor:
     private final Color skyColor = Color.CYAN;

  public Rainbow()
  {
    setBackground(skyColor);
  } 
  // Draws the rainbow.
  public void paintComponent(Graphics g)
  {
super.paintComponent(g);
int width = getWidth();    
int height = getHeight();

// Declare and initialize local int variables xCenter, yCenter
// that represent the center of the rainbow rings:
int xCenter = width/2;
int yCenter = (height * 3) /4;

// Declare and initialize the radius of the large semicircle:
  int largeRadius = width/4;

g.setColor(Color.RED);

// Draw the large semicircle:
 g.fillArc(xCenter,yCenter,largeRadius,height,0,180);
// Declare and initialize the radii of the small and medium
// semicircles and draw them:
int smallRadius = height/4;
 g.setColor(Color.MAGENTA);

 g.fillArc(xCenter,yCenter,width,height,0,180);
 int mediumRadius = (int) Math.sqrt(smallRadius * largeRadius);
 g.setColor(Color.GREEN);
 g.fillArc(xCenter,yCenter,width,height,0,180);


// Calculate the radius of the innermost (sky-color) semicircle
// so that the width of the middle (green) ring is the
// arithmetic mean of the widths of the red and magenta rings:


// Draw the sky-color semicircle:
 g.fillArc(xCenter,yCenter,width,height,0,180);
  }

  public static void main(String[] args)
  {
JFrame w = new JFrame("Rainbow");
w.setBounds(300, 300, 300, 200);
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = w.getContentPane();
c.add(new Rainbow());
w.setVisible(true);
   }
}

我的问题:FILARC到底是如何工作的;我理解参数中的内容,但必须做什么每个弧都是不同的?如何为每个弧线设置一种颜色?我试着这样做,最后我用最接近结尾的颜色显示出来,并覆盖其他颜色。我可能会有更多,我继续编码。

这些是指示:

![在此处输入图像说明][1]

“彩虹”由四个重叠的半圆组成。外圈为红色(color.red),中间为绿色(color.green),内圈为品红色(color.magenta)。最里面的半圆与背景颜色相同。

按照下面的说明,填写Rainbow.java中的空白处。

>

  • 启动彩虹工程。

    在文件顶部的类声明之前添加一个包含您名字的完整注释头。

    向Rainbow类添加一个类型为Color的私有final字段skyColor的声明,初始化为Color.cyan(天空的颜色)。在Rainbow的构造函数中,将窗口的背景设置为skyColor,而不是Color.White。

    在paint方法中,声明局部整数变量xCenter和yCenter表示环中心的坐标。将它们分别初始化为内容窗格的1/2宽和3/4高(向下)。(请记住,Java中图形坐标的原点位于内容窗格的左上角,y轴指向下方。)不要从窗口的尺寸中插入固定的数字。

    声明一个局部变量largeRadius,表示最大(红色)半圆的半径,并将其初始化为宽度的1/4。

    调用g.fillarc(x,y,size,size,from,degrees)(具有所有整数参数)的方法绘制一个圆的扇区。x和y是椭圆形(逻辑上)内接的矩形(在这种情况下是正方形)左上角的坐标;大小是正方形的边(和圆的直径);from是圆弧的起始点,单位为度(水平直径的最东点为0,度(正数)是圆弧的度量值,逆时针方向。向paint方法中添加一条语句,以绘制最大的(红色)半圆。测试你的程序。

    添加语句以显示中半圆(绿色)和小半圆(品红色)。洋红色半圆的半径应为高度的1/4。绿色的半径应该是红色半圆的半径和品红色半圆的半径的几何平均数(乘积的平方根),四舍五入到最近的整数。(对Math.sqrt(x)的调用返回x的平方根的值,这是一个双倍。)重新测试你的程序。

    添加语句来显示背景(“天空”)颜色的最里面的半圆来完成彩虹。使用skyColor常量作为半圆的颜色。选择天色半圆的半径,使中间(绿色)环的宽度是红色和品红色环宽度的算术平均值。

    测试你的程序。

    提交您完成的程序并运行输出。通过捕获屏幕输出(Alt-PrintScrn),将其粘贴到图形程序(如MS Paint)中,然后将图像保存到Eclipse项目目录中,可以包含运行输出(彩虹图片)。

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Container;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Rainbow extends JPanel
    {
      //Declare skyColor:
        private final Color skyColor = Color.CYAN;
    
      public Rainbow()
    {
    setBackground(skyColor);
    }
    
     // Draws the rainbow.
    public void paintComponent(Graphics g)
     {
    super.paintComponent(g);
    int width = getWidth();    
    int height = getHeight();
    
    // Declare and initialize local int variables xCenter, yCenter
    // that represent the center of the rainbow rings:
    int xCenter = width/2;
    int yCenter = (height * 3) /4;
    
    // Declare and initialize the radius of the large semicircle:
      int largeRadius = width/4;
    
    g.setColor(Color.RED);
    
    // Draw the large semicircle:
     g.fillArc(xCenter - largeRadius,yCenter - largeRadius   ,largeRadius,largeRadius,0,180);
    // Declare and initialize the radii of the small and medium
    //semicircles and draw them:
     int smallRadius = height/4;
     int mediumRadius = (int) Math.sqrt(smallRadius * largeRadius);
     g.setColor(Color.GREEN);
     g.fillArc(xCenter-(largeRadius+mediumRadius)/2,yCenter-          (largeRadius+mediumRadius)/2,mediumRadius,mediumRadius,0,180);
     g.setColor(Color.MAGENTA);
     g.fillArc(xCenter-(largeRadius+smallRadius)/2,yCenter-(largeRadius+smallRadius)/2,smallRadius,smallRadius,0,180);
    
    
    
    
    // Calculate the radius of the innermost (sky-color) semicircle
    // so that the width of the middle (green) ring is the
    // arithmetic mean of the widths of the red and magenta rings:
       int skyRadius = (int)((2 * Math.sqrt(smallRadius * largeRadius)) - width/4);
    
    // Draw the sky-color semicircle:
     g.setColor(skyColor);
     g.fillArc(xCenter-skyRadius,yCenter-skyRadius,skyRadius,skyRadius,0,180);
    
     }
    
     public static void main(String[] args)
     {
    JFrame w = new JFrame("Rainbow");
    w.setBounds(300, 300, 300, 200);
    w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container c = w.getContentPane();
    c.add(new Rainbow());
    w.setVisible(true);
     }
    }
    
  • 共有1个答案

    韩宏朗
    2023-03-14

    fillArc()根据给定的参数填充圆的一部分。比如你的第一个圆弧。

    您正在绘制红色的填充弧,在本例中是一个半圆。

    //Set the arc color
    g.setColor(Color.RED);
    
    // Draw the large semicircle:
    g.fillArc(xCenter,yCenter,largeRadius,height,0,180);
    

    当我们画的时候请记住,我们是在上面画的,所以如果你先画绿色的,它就会被红色的覆盖。

    然后我们再画一次这个里面的另一个弧线,但是让这个是天空的颜色(在这个例子中是白色)。这就产生了最终的彩虹形状。所以我们再做一次fillArc,但半径稍小,颜色为白色。

    在那里,我们画出了一道彩虹。

    为了使这个美丽的创造成为中心,我们必须了解fillArc函数的一些内容。

    参数为:

    public abstract void fillArc(int x,
               int y,
               int width,
               int height,
               int startAngle,
               int arcAngle)
    

    int x和int y表示您正在绘制的弧的左上角的坐标。你的代码没有居中的原因是你画圆弧的方式。

    g.fillArc(xCenter - largeRadius,yCenter - largeRadius,largeRadius,largeRadius,0,180);
    g.fillArc(xCenter-(largeRadius+mediumRadius)/2,yCenter-(largeRadius+mediumRadius)/2,mediumRadius,mediumRadius,0,180);
    g.fillArc(xCenter-(largeRadius+smallRadius)/2,yCenter-(largeRadius+smallRadius)/2,smallRadius,smallRadius,0,180);
    

    我拿出了一些多余的东西。你看你是如何减去(largeradius+smallradius)/2和(largeradius+mediumradius)/2的?这是转移彩虹使其偏离中心。相反,你应该拥有的是:

    g.fillArc(xCenter - largeRadius/2,yCenter - largeRadius,largeRadius,largeRadius,0,180);
        g.fillArc(xCenter-(mediumRadius)/2,yCenter-(largeRadius+mediumRadius)/2,mediumRadius,mediumRadius,0,180);
        g.fillArc(xCenter-(smallRadius)/2,yCenter-(largeRadius+smallRadius)/2,smallRadius,smallRadius,0,180);
    

    这将使彩虹正确地居中。原因就在这里。

    这是他们开始画弧线的地方。如果你想把整个彩虹居中,你可以把它移到宽度的一半。所以如果你想把红色圆弧居中,你可以

    xCenter - (largeRadius/2)
    

    因为这是将x开始设置为左半。你不会把largeRadius包含在其他的弧线中,因为你是围绕着这一点的。因此,您需要将它们的宽度移动一半,这就是它们的x位置的原因

    xCenter-(mediumRadius)/2
    xCenter-(smallRadius)/2
    

    以y轴为中心的工作方式不同。你必须考虑到彩虹的整体高度是Largeradius的1/4。您的代码使用了yCenter=3/4*height,因此对它做了一点改动。

    这是我的解决方案

    g.fillArc(xCenter - largeRadius/2,yCenter - largeRadius/2 + largeRadius/4 -height/4,largeRadius,largeRadius,0,180);
    g.fillArc(xCenter-(mediumRadius)/2,yCenter-(mediumRadius)/2 + largeRadius/4 -height/4,mediumRadius,mediumRadius,0,180);
    g.fillArc(xCenter-(smallRadius)/2,yCenter-(smallRadius)/2 + largeRadius/4 -height/4,smallRadius,smallRadius,0,180);
    

    一起来看看吧。我减去largeradius/2(以及相应的半径),其原理与x相同。但后来我又加上了largeradius/4,因为我们要把整个彩虹移下来。这是因为减去相应的半径/2只会使彩虹以整圆为中心,而不是半圆。

    添加largeradius/4将彩虹向下移动一半的高度,正确地将其居中为半圆。最后,减去height/4使yCenter更改为height/2,因为3/4*height是作业中的一个要求。

    很抱歉评论中的所有问题,希望这能澄清问题。

     类似资料:
    • 这是我的任务。 如果随机的3位数字与用户的3位数字完全匹配,则会获得一些奖励。 如果用户匹配3位数字但顺序不一致,则其他奖励。 如果用户匹配2位,则其他奖品 如果用户输入仅匹配1位,则其他奖品 这是我想出的: 我得到了三位数的匹配,有时编译后会得到三位数和两位数的匹配。告诉我怎么了。提前谢谢你们。

    • 色彩管理系统可以统一不同设备之间的颜色差异,使您能够可靠地预测系统最终生成的颜色。正确的查看颜色使您可以在从数字捕捉到最终输出的工作流程中使用口述颜色定义即可。通过色彩管理,还可创建基于 ISO、SWOP 和 Japan Color 打印生产标准的的输出。 为什么色彩有时候不匹配 在出版系统中,没有哪种设备能够重现人眼可以看见的整个范围的颜色。每种设备都使用特定的色彩空间,此色彩空间可以生成一定范

    • 如果把动画比作一个房子,你现在至少已经在熟悉造房子的工具了:锤子、扳手和螺丝刀。你熟悉的动画的工具也就是你在创建一个动画的时候操作的特定属性。但这还不是你考试思考动画和设计动作需要知道的全部。 现在是时候开始布局动画的蓝图了。这是指准确描述动画中每一步将会发生什么的说明。如我之前提到的,你不能在开会的时候仅仅挥舞你的手臂来解释当用户点击一个按钮的时候会发生什么,你需要一个语言来描述和拆分你在想想一

    • 我在用编码棒。com来进行一些java实践。字符串问题之一“withoutString”如下所示: 给定两个字符串,基字符串和删除字符串,返回基字符串的一个版本,其中删除字符串的所有实例都已删除(不区分大小写)。您可以假设删除字符串的长度为1或更大。只删除不重叠的实例,因此删除“xx”后留下“x”。这个问题可以在:http://codingbat.com/prob/p192570 从下面的drop

    • 任务如下。 一个老师有五个学生参加了四次考试。教师根据学生四次考试成绩的平均值,使用以下等级表给学生分配字母等级。 编写一个类,该类在arraylist对象上使用字符串数组来保存五名学生的姓名,使用五个字符的数组来保存五名学生的字母成绩,使用五个数组(每个数组有四个双倍字符)来保存每个学生的一组考试成绩。该类应该具有返回学生姓名、平均测试分数和基于平均值的字母等级的方法。 在一个允许用户输入每个学

    • 我有3张桌子 许可证中的CREATED_AT是一个日期(非空)字段。 表根据同名主键/外键进行关联;客户可以拥有0个或多个许可证,每个许可证都有一个版本。 我想从这些表格中得到: 客户的名字、姓氏和创建的最后一个许可证的release\u id(根据许可证中的created\u AT字段查找最后一个),如果有。 对于这个问题,我使用了以下查询: 这似乎有效,但我问是否有人可以证实我这一点,或者是否