从直线嵌套抛物线曲线

时间:2018-01-21 06:27:32

标签: java swing paint paintcomponent curve

我无法为我的作业复制图片。我将不胜感激任何提示或解决方案。我相信我有一般的想法,但我很难找出数学来复制图像并在一个循环中完成所有事情。

我的计划需要符合以下标准:

  1. 匹配图片
  2. 为每对抛物线曲线生成随机颜色
  3. 使用任何宽度或高度
  4. 使用单个循环绘制整个图形。
  5. 这是图片: Image 这是我到目前为止所尝试的

    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;
    
            }           
    }
    

    输出:

    Result

1 个答案:

答案 0 :(得分:1)

实现它的方法是覆盖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();
    }
}

输出:

enter image description here