java - 我该怎么做才能使程序不从最后添加的点开始绘制?

标签 java graphics

我正在尝试创建一个程序,使一个正方形进入另一个正方形(稍微旋转),另一个正方形进入另一个正方形,依此类推。我已经成功创建了一个程序来做到这一点。但我希望程序能够制作几个这样的盒子。看一下插图以获得更好的想法:

我的问题是,在绘制第一个框,然后尝试绘制第二个框之后,绘制线条的“光标”有点卡在最后一个点,因此它从我的第一个正方形的最后一个点绘制线条到第二个正方形中的第一个点,如下所示:

正如您在 pointPanel 构造函数中看到的那样,我尝试清除列表,并重置计数器和 i 变量,但没有成功。我可以做任何修改来避免这个问题吗?我尝试将clear()指令放在其他地方。但也许我错过了一些东西。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;




public class Art {
    ArrayList<Point> points = new ArrayList<>();
    int i =0;
    public static void main(String[] args) {
        new Art();
    }

    public Art() {
        JFrame frame = new JFrame("Art");
        frame.add(new pointPanel());

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);


    }

    public class pointPanel extends JPanel{
        //Constructor
        public pointPanel(){
            points(0, 100);
            //points.clear();
            points(500, 200);

        }

        @Override
        //Dimension
        public Dimension getPreferredSize() {
            return new Dimension(800, 600);
        }



        public void points(double x, double y){
            double t=0.1;   //constant
            final int side = 100;
            int counter=0;

            while (counter<20){
                 //Init the first points-->
                Point p  = new Point((int)(x),      (int) (y)           );
                Point p1 = new Point((int)(x+side), (int)(y)            );
                Point p2 = new Point((int)(x+side), (int) (y-side)      );
                Point p3 = new Point((int)(x),      (int)(y-side)       );
                Point p4 = new Point((int)(x),      (int)(y)            );
                //-->and adding them to the list
                if (counter == 0) {
                    points.add(p);
                    points.add(p1);
                    points.add(p2);
                    points.add(p3);
                    points.add(p4);
                }


                //Dynamic part: 
                //If the method has been run earlier - place points making it possible to draw lines
                if (counter>0){
                    x=(1-t)*points.get(i).x + t * points.get(i+1).x;
                    y=(1-t)*points.get(i).y + t * points.get(i+1).y;
                    points.add(  new Point( (int) x, (int) y)  );
                    i++;    
                }

                if (counter>0){
                    x=(1-t)*points.get(i).x + t * points.get(i+1).x;
                    y=(1-t)*points.get(i).y + t * points.get(i+1).y;
                    points.add(  new Point( (int) x, (int) y)  );
                    i++;
                }

                if (counter>0){
                    x=(1-t)*points.get(i).x + t * points.get(i+1).x;
                    y=(1-t)*points.get(i).y + t * points.get(i+1).y;
                    points.add(  new Point( (int) x, (int) y)  );
                    i++;
                }

                if (counter>0){
                    x=(1-t)*points.get(i).x + t * points.get(i+1).x;
                    y=(1-t)*points.get(i).y + t * points.get(i+1).y;
                    points.add(  new Point( (int) x, (int) y)  );
                    i++;
                }

                if (counter>0){
                    x=(1-t)*points.get(i).x + t * points.get(i-3).x;
                    y=(1-t)*points.get(i).y + t * points.get(i-3).y;    
                    points.add(  new Point( (int) x, (int) y)  );       
                    i++;
                }



                counter++;

            }//while
        //counter=0;
        //i=0;
        x=0;
        y=0;

        }//metode

        //Paint-method
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;

            g2d.setColor(Color.RED);
            for (int i = 0; i < points.size()-1; i++) {
                g2d.drawLine(points.get(i).x, points.get(i).y, points.get(i+1).x, points.get(i+1).y);
            }

           g2d.dispose();
        }   
    }
}

最佳答案

你必须将方 block 的点分开,例如创建一个具有四个点的 Square 类以及一个在 Graphics2d 中绘制该正方形的方法。你怎么做,每个点都与其后继点相连,无论它是否属于同一个正方形。

public class Square {
    private final Point v1;
    private final Point v2;
    private final Point v3;
    private final Point v4;

    public Square(Point v1, Point v2, Point v3, Point v4) {
        this.v1 = v1;
        this.v2 = v2;
        this.v3 = v3;
        this.v4 = v4;
    }

    public void paint(Graphics2D g) {
        g.setColor(Color.RED);
        g.drawLine(v1.x, v1.y, v2.x, v2.y);
        g.drawLine(v2.x, v2.y, v3.x, v3.y);
        g.drawLine(v3.x, v3.y, v4.x, v4.y);
        g.drawLine(v4.x, v4.y, v1.x, v1.y);
    }

    public void nextSquare() {
        int x1=(1-t)*v1.x + t * v2.x;
        int y1=(1-t)*v1.y + t * v2.y;

        int x2=(1-t)*v2.x + t * v3.x;
        int y2=(1-t)*v2.y + t * v3.y;

        int x3=(1-t)*v3.x + t * v4.x;
        int y3=(1-t)*v3.y + t * v4.y;

        int x4=(1-t)*v4.x + t * v1.x;
        int y4=(1-t)*v4.y + t * v1.y;

        return new Square(
            new Point(x1, y1),
            new Point(x2, y2),
            new Point(x3, y3),
            new Point(x4, y4));
     }
 }

创建正方形:

List<Square> squares = new ArrayList<>();
Point p  = new Point((int)(x),      (int) (y)           );
Point p1 = new Point((int)(x+side), (int)(y)            );
Point p2 = new Point((int)(x+side), (int) (y-side)      );
Point p3 = new Point((int)(x),      (int)(y-side)       );
Square s = new Square(p, p1, p2, p3);

squares.add(s);
for (int i = 1; i < 20; i++) {
    s = s.nextSquare();
    squares.add(s);
}

代码不是 100%,因为我是在手机上输入的...

绘制方法,假设 squares 是一个实例变量:

//Paint-method
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for (Square s : squares) {
        s.paint(g2d);
    }
    g2d.dispose(); 
}

关于java - 我该怎么做才能使程序不从最后添加的点开始绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32313857/

相关文章:

java - 无法包含外部 jar

delphi - AggPas Delphi 绘图透明度

java - 我在 GUI 中实现鼠标操作监听器时遇到问题

java - 如何在同一个 JVM 上以不同的配置多次启动 servlet

java - Android:两个应用程序具有相同的包名。如何区分它们?

java - Android Studio 无法打开项目

graphics - 从球坐标旋转体

algorithm - 基本空间雕刻算法

java - 当事件发生时绘制新的图形组件(即圆圈)

Java/EJB 3.0 CMT/JTA/MySQL/Hibernate - 事务不回滚