Java Swing Как масштабировать треугольник - PullRequest
0 голосов
/ 30 апреля 2019

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

У меня есть отдельный класс MyTriangle, который расширяет MyShape. У меня также есть две переменные: scaleX и scaleY. Всякий раз, когда я пытаюсь умножить значения треугольника x и y и изменить размер окна, треугольники сходят с ума и внезапно исчезают. Когда я пытаюсь написать

graphics.fillPolygon(new int[]{(int)(x1*scX),(int)(x2*scX)(int)(x3*scX)}, new int[]{(int)(y1*scY),(int)(y2*scY),(int)(y3*scY), 3);

По какой-то причине в моем окне ничего не происходит.

//from MyShape class:
//scX = window.getWidth()/(double)window.defaultWidth;
//scY = window.getHeight()/ (double)window.defaultHeight;

public class MyTriangle extends MyShape {
    int[] x;
    int[] y;
    public MyTriangle(int x1, int x2, int x3, int y1, int y2, int y3, int red, int green, int blue) {
        super(x1, x2, x3, y1, y2, y3, red, green, blue);
        this.x=new int[]{x1,x2,x3};
        this.y=new int[]{y1,y2,y3};
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        for(int i = 0; i<3; i++){
            x[i]=(int)(x[i]*scX);
            y[i]=(int)(y[i]*scY);
        }
        graphics.fillPolygon(x,y,3);
    }

Как мне это сделать, чтобы это работало? Такое масштабирование прекрасно работает с прямоугольниками и овалами.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Вы масштабируете это каждый раз, когда рисуете. так что если масштабный коэффициент не будет установлен в 1 после увеличения, то каждый раз, когда он рисует, он будет увеличиваться или уменьшаться. в paintComponent создайте новые массивы для передачи масштабированных значений, но сохраните оригиналы.
* EDIT

 @Override
protected void paintComponent(Graphics graphics) {
    int[] xS = new int[3];
    int[] yS = new int[3]; 
    super.paintComponent(graphics);
    for(int i = 0; i<3; i++){
        xS[i]=(int)(x[i]*scX);
        yS[i]=(int)(y[i]*scY);
    }
    graphics.fillPolygon(xS,yS,3);
}
1 голос
/ 30 апреля 2019

Поскольку вы имеете дело с многоугольником, самое простое решение - воспользоваться уже существующей функциональностью API, используя AffineTransform для изменения масштаба вывода

Simple Scale

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Main {

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

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                MyTriangle shape = new MyTriangle(50, 100, 0, 0, 100, 100, 0, 0, 0);
                JSlider slider = new JSlider(0, 400);
                slider.setValue(100);
                frame.add(shape);
                frame.add(slider, BorderLayout.SOUTH);

                slider.addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent arg0) {
                        double value = slider.getValue() / 100d;
                        shape.setScale(value);
                    }
                });

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MyTriangle extends JPanel {

        int[] x;
        int[] y;

        double scX;
        double scY;

        public MyTriangle(int x1, int x2, int x3, int y1, int y2, int y3, int red, int green, int blue) {
            this.x = new int[]{x1, x2, x3};
            this.y = new int[]{y1, y2, y3};
            scX = 1;
            scY = 1;
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        public void setScale(double scale) {
            scX = scale;
            scY = scale;
            repaint();
        }

        @Override
        protected void paintComponent(Graphics graphics) {
            super.paintComponent(graphics);
            Graphics2D g2d = (Graphics2D) graphics.create();
            AffineTransform at = AffineTransform.getScaleInstance(scX, scY);
            g2d.setTransform(at);
            g2d.fillPolygon(x, y, 3);
            g2d.dispose();
        }
    }
}

Я бы настоятельно рекомендовал взглянуть на Учебник 2D-графики для получения более подробной информации.

...