Как изменить длину сторон треугольника в JPanel?

#java #swing

Вопрос:

Прямо сейчас эта программа рисует треугольник с помощью JPanel. Я хочу сделать стороны треугольника больше. Как мне это сделать? Я даже не знаю, где искать. Что мне для этого нужно погуглить? Я действительно застрял, пожалуйста, помогите.

 import javax.swing.JPanel;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Point;

//import javax.swing.JPanel;

//create KochSnowFlake Panel class

public class KochSnowFlake extends JPanel

{
    /**
     * site every method of each class
     * 
     */
    
    
    private static final long serialVersionUID = 1L;

    // Constructor

    public KochSnowFlake()

    {

        // call repaint method

        repaint();

    }

    // paint method from which kochsnowflake method is called

    // by passing the depth value

    public void paintComponent(Graphics g)

    {

        super.paintComponents(g);

        kochsnowflake(0);
        
        

    }

    // kochsnowflake method

    public void kochsnowflake(int depth)

    {

        System.out.println("Depth = "   depth);

        // create a graphics reference

        Graphics g = this.getGraphics();

        g.setColor(Color.black);

        // create the Three points by using

        // Point class.

        Point p1 = new Point(100, 100);

        Point p2 = new Point(300, 100);

        Point p3 = new Point(200, 263);

        // call the kochsegment recursive function

        kochsegment(g, p1, p2, depth);

        kochsegment(g, p2, p3, depth);

        kochsegment(g, p3, p1, depth);

    }

    // kochsegment recursive method

    private void kochsegment(Graphics g, Point p1, Point p2, int

    level) {

        // the base case -- draw the segments

        if (level == 0)

        {

            // set the color of the line

            g.setColor(Color.black);

            // draw a line

            g.drawLine((int) p1.x, (int) p1.y, (int) p2.x, (int) p2.y);

        }

        else

        {

            // the recursive case

            // calculate the 4 smaller line segments

            double sin60 = Math.sqrt(3) * 0.5;

            double cos60 = 0.5;

            // set the color of the lines

            g.setColor(Color.black);

            // set the distance between the points
            
            

            Point distance = new Point((p2.x - p1.x) / 3, (p2.y - p1.y) / 3);
            
            

            // Create new points with respect to the distance

            Point pa = new Point(p1.x   distance.x, p1.y   distance.y);

            Point pb = new Point(p2.x - distance.x, p2.y - distance.y);

            // create the tip of the flakes

            Point pTip = new Point(

                    pa.x   (int) (distance.x * cos60   distance.y * sin60),

                    pa.y   (int) (distance.y * cos60 - distance.x * sin60)

            );

            // call the recursive function until it completes

//the kochsnowflake

            kochsegment(g, p1, pa, level - 1);

            kochsegment(g, pa, pTip, level - 1);

            kochsegment(g, pTip, pb, level - 1);

            kochsegment(g, pb, p2, level - 1);

            System.out.println(level);

        }

    }

}

////////////////////////////////////////////

import javax.swing.JFrame;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

//Create a SnowFlake of JFrame class

public class SnowFlake extends JFrame

{

     //Constructor

     public SnowFlake()

     {

          //create the object for the KochsnowFlake Panel class

          KochSnowFlake kfs=new KochSnowFlake();

          add(kfs);

     }

     //main method

     public static void main(String args[])

     {

          //create frame object

          SnowFlake sf=new SnowFlake();

          sf.setTitle("KochSnowFlake");

          sf.setVisible(true);

          sf.setSize(4000,4000);

          sf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     }

}
 

Комментарии:

1. Перестаньте повторять свой вопрос 4 раза. Это один из способов НЕ получить помощи. Если вам нужна помощь, задайте четкий и полный вопрос. 1) При выполнении рисования в методе kockSnowFlake() вы должны передать графический объект из метода paintComponent (). Не используйте гетграфику. Как изменить длину сторон треугольника в JPanel? — измените точки треугольника так, чтобы они находились дальше друг от друга.

2. @camickr привет, извини за это. Можете ли вы дополнительно указать, где я меняю точки?

3. Где вы их создаете.

Ответ №1:

Я переработал ваш код, чтобы создать следующий графический интерфейс.

Снежинка Коха

В коде много изменений, но изменение, которое отвечает на ваш вопрос, относится к kochSnowflake методу KochSnowFlakePanel класса.

Я сделал треугольник пропорциональным размеру рисунка JPanel . Размер чертежа JPanel определяется в конструкторе KochSnowFlakePanel класса.

Я сделал линии толще, чтобы их было хорошо видно.

Вот полный исполняемый код.

 import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;

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

public class KochSnowFlakeGUI implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new KochSnowFlakeGUI());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Koch SnowFlake");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(new KochSnowFlakePanel(), BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    public class KochSnowFlakePanel extends JPanel {

        private static final long serialVersionUID = 1L;
        
        public KochSnowFlakePanel() {
            this.setBackground(Color.WHITE);
            this.setPreferredSize(new Dimension(400, 400));
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            kochSnowflake(g, 0);
        }
        
        private void kochSnowflake(Graphics g, int depth) {
            int x1 = 100;
            int y1 = 100;
            int x2 = getWidth() - 100;
            int y2 = 100;
            int x3 = getWidth() / 2;
            int y3 = getHeight() - 100;
            
            Point p1 = new Point(x1, y1);
            Point p2 = new Point(x2, y2);
            Point p3 = new Point(x3, y3);

            kochSegment(g, p1, p2, depth);
            kochSegment(g, p2, p3, depth);
            kochSegment(g, p3, p1, depth);
        }
        
        private void kochSegment(Graphics g, Point p1, Point p2, int level) {
            if (level == 0) {
                Graphics2D g2d = (Graphics2D) g;
                g2d.setColor(Color.BLACK);
                g2d.setStroke(new BasicStroke(5f));
                g2d.drawLine(p1.x, p1.y, p2.x, p2.y);
            } else {
                double sin60 = Math.sqrt(3) * 0.5;
                double cos60 = 0.5;

                Point distance = new Point((p2.x - p1.x) / 3, (p2.y - p1.y) / 3);
                Point pa = new Point(p1.x   distance.x, p1.y   distance.y);
                Point pb = new Point(p2.x - distance.x, p2.y - distance.y);

                double x = Math.round(distance.x * cos60   distance.y * sin60);
                double y = Math.round(distance.y * cos60 - distance.x * sin60);
                Point pTip = new Point(pa.x   (int) x, pa.y   (int) y);
                
                kochSegment(g, p1, pa, level - 1);
                kochSegment(g, pa, pTip, level - 1);
                kochSegment(g, pTip, pb, level - 1);
                kochSegment(g, pb, p2, level - 1);
            }
        }
        
    }

}