从直线嵌套抛物线

Nesting parabolic curves from straight lines

我在为作业复制图片时遇到问题。我将不胜感激任何提示或解决方案。我相信我已经掌握了总体思路,但我很难弄清楚复制图像并在一个循环中完成所有操作的数学方法。

我的程序需要满足这些条件:

  1. 匹配图像
  2. 为每对抛物线曲线生成一种随机颜色
  3. 使用任何宽度或高度
  4. 使用一个循环绘制整个图形。

图片如下: 这是我到目前为止尝试过的

public static final int WIDTH = 500;
public static final int HEIGHT = 500;
public static final int LINE_INCREMENT = 5;

public static void main(String[] args) {

    DrawingPanel panel = new DrawingPanel(WIDTH, HEIGHT);
    Graphics g = panel.getGraphics();
    int d = 0;

    int iterations = HEIGHT/LINE_INCREMENT;
    Random rand = new Random();
    int red = 0, green = 0, blue = 0;
    red = rand.nextInt(128) + 128;
    green = rand.nextInt(128) + 128;
    blue = rand.nextInt(128) + 128;
    g.setColor(new Color(red,green,blue));

        for(int y = 0; y < iterations; y++) {
            g.drawLine(0, d, d, HEIGHT);
            g.drawLine(WIDTH, d, d, 0);

            d += LINE_INCREMENT;
        }

        red = rand.nextInt(128) + 128;
        green = rand.nextInt(128) + 128;
        blue = rand.nextInt(128) + 128;
        g.setColor(new Color(red,green,blue));
        d = 0;

        for (int x = 0; x < iterations/2; x++) {
            g.drawLine(WIDTH/4, d + HEIGHT/4, d + WIDTH/4, HEIGHT - HEIGHT/4);
            g.drawLine(d + WIDTH/4, WIDTH/4, WIDTH - WIDTH/4, d + WIDTH/4);

            d += LINE_INCREMENT;

        }           
}

输出:

实现它的方法是覆盖paintComponent

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ParabolicCurves extends JFrame {

    private static final int SIZE = 600;
    private static final int LINE_INCREMENT = 5;
    private static final int NUM_OF_PATTERNS = 4;
    private Random rand = new Random();

    ParabolicCurves()   {

        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        JPanel panel = new DrawingPanel(SIZE);
        add(panel, BorderLayout.CENTER);
        pack();
        setVisible(true);
    }

    class DrawingPanel extends JPanel{

        public DrawingPanel(int size) {
            setPreferredSize(new Dimension(size, size));
            setBackground(Color.WHITE);
        }

        @Override
        public void paintComponent(Graphics g) {

            super.paintComponent(g);

            int red, green, blue, delta , iterations;
            int height, width ,startX, startY, endX, endY ;
            Rectangle boundingRrectangle = getBounds();

            for(int pattern = 0 ; pattern < NUM_OF_PATTERNS; pattern++) {

                red = rand.nextInt(128) + 128;
                green = rand.nextInt(128) + 128;
                blue = rand.nextInt(128) + 128;
                g.setColor(new Color(red,green,blue));

                height = (int) boundingRrectangle.getHeight();
                width = (int) boundingRrectangle.getWidth();
                startX = (int) boundingRrectangle.getX();
                startY = (int) boundingRrectangle.getY();
                endX = startX+width;
                endY = startY+ height;

                iterations = Math.min(width, height)/LINE_INCREMENT;
                delta = 0;
                for (int x = 0; x < iterations ; x++) {

                    g.drawLine(startX, startY+delta, startX+delta, endY);
                    g.drawLine(endX, startY+delta, startX+delta, startY);
                    delta += LINE_INCREMENT;
                }
                //change bounding rectangle 
                boundingRrectangle = new Rectangle(startX+(width/4),
                                                startY+(width/4), width/2, height/2);
            }
        }
    }

    public static void main(String[] args)  {
        new ParabolicCurves();
    }
}

输出: