为了账号安全,请及时绑定邮箱和手机立即绑定

Java Swing如何缩放三角形

Java Swing如何缩放三角形

长风秋雁 2022-10-26 17:12:34
当我更改窗口大小时,我想绘制一些随机三角形并缩放它们。我有一个单独的类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 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

每次绘制时都会缩放它。因此,如果在您进行缩放后比例因子没有设置为 1,那么每次绘制它时它都会变大或变小。在paintComponent 中创建新数组以传递缩放值但保留原始值。

*编辑


 @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);

}


查看完整回答
反对 回复 2022-10-26
?
慕神8447489

TA贡献1780条经验 获得超1个赞

由于您正在处理多边形,因此最简单的解决方案是利用 API 的现有功能,通过使用 aAffineTransform来更改输出的比例

https://i.stack.imgur.com/e2vLR.gif

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 图形教程以获取更多详细信息



查看完整回答
反对 回复 2022-10-26
  • 2 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号