带有变换矩阵的旋转多边形。图形正在变形

问题描述 投票:0回答:1

我在Java中相对较新,我有一个任务来实现从随机点绘制的图形的旋转。必须通过“裸逻辑”来编写实现,因此在这种情况下,AffineTransform工具不是一个选择。我被困在想将形状转换为原点以进行旋转的那一刻。我绞尽脑汁,上网冲浪,但解决方案无法成功。已经有一个类似问题的话题,那是关于矩形转换的,所以它对我没有用。也许有人可以帮忙。

公共类Frame扩展JFrame {

private JButton polyBtn = new JButton("Draw/Redraw Poly");
private JButton rotationBtn = new JButton("Rotate");
private JSpinner polySpn = new JSpinner(new SpinnerNumberModel(3,3,10,1));
private JSpinner angleSpn = new JSpinner(new SpinnerNumberModel(0,0,360,1));
private JPanel panel = new JPanel();
private JPanel controlPanel = new JPanel();
private JLabel polyLbl = new JLabel("Choose number of corners");
private JLabel angleLbl = new JLabel("Choose angle of rotation");
private int cornerAmount , degree ;
private boolean figureIsDrawed = false;
Random r = new Random();
Polygon poly = new Polygon();
Polygon editedPoly = new Polygon();


public Frame() {

    super("Rotate Object");
    setBounds(100, 100, 500, 250);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container container = this.getContentPane();
    container.setLayout(new BorderLayout());
    setVisible(true);
    setLocationRelativeTo(null);
    setResizable(false);

    polyBtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            cornerAmount = (int) polySpn.getValue();
            drawPoly(cornerAmount);

        }});

    rotationBtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            degree = (int) angleSpn.getValue();
            rotateShape(degree);

        }});

    panel.setPreferredSize(new Dimension(350,250));
    panel.setBackground(Color.ORANGE);
    panel.setBorder(BorderFactory.createLineBorder(Color.black,3));

    controlPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));
    controlPanel.setLayout(new GridLayout(6,0,0,0));

    polyLbl.setFont(polyLbl.getFont().deriveFont(10.0f));
    angleLbl.setFont(angleLbl.getFont().deriveFont(10.0f));

    controlPanel.add(polyLbl);
    controlPanel.add(polySpn);
    controlPanel.add(polyBtn);

    controlPanel.add(angleLbl);
    controlPanel.add(angleSpn);
    controlPanel.add(rotationBtn);

    container.add(controlPanel,BorderLayout.CENTER);
    container.add(panel,BorderLayout.EAST);
}

private void drawPoly(int corners) {
    Graphics g = panel.getGraphics();
    int panelWidth = panel.getWidth();
    int panelHeight = panel.getHeight();

    if(figureIsDrawed) {
        poly.reset();
        repaint();
        figureIsDrawed = false;
    }else {
        poly.addPoint(panelWidth/2, panelHeight/2);
        System.out.println(poly.xpoints[0]);
        System.out.println(poly.ypoints[0]);
        for(int i = 0 ; i < corners-1 ; i++) {
            poly.addPoint(r.nextInt(panelWidth), r.nextInt(panelHeight));               
        }
        g.drawPolygon(poly);
        figureIsDrawed = true;
    }
}
private void rotateShape(int degree) {
    Graphics g = panel.getGraphics();
    int[] xCord = poly.xpoints;
    int[] yCord = poly.ypoints;
    double rads = degree * (Math.PI/180);
    double sin =  Math.sin(rads);
    double cos =  Math.cos(rads);
    double[][] transform = new double[3][3];
    int panelW = this.getWidth();
    int panelH = this.getHeight();
    transform[0][0] = cos;
    transform[0][1] = -sin;
    transform[1][0] = sin;
    transform[1][1] = cos;

    double[] transformedX = new double[xCord.length];
    double[] transformedY = new double[yCord.length];

    int[] updatedX = new int[xCord.length];
    int[] updatedY = new int[yCord.length];
    for(int i = 0;i<updatedX.length;i++) {
        updatedX[i] = xCord[i];
        updatedY[i] = yCord[i];
        transformedX[i] = Math.round(updatedX[i] * transform[0][0] + updatedY[i] * transform[0][1] + transform[0][2]);
        transformedY[i] = Math.round( updatedX[i] * transform[1][0] + updatedY[i] * transform[1][1] + transform[1][2]);
        updatedX[i] = (int)transformedX[i];
        updatedY[i] = (int)transformedY[i];
    }
    g.setColor(Color.orange);
    g.fillRect(0, 0, panelW, panelH);
    g.setColor(Color.black);
    g.drawPolygon(updatedX, updatedY, updatedX.length); 
}

}

主要问题是在“ RotateShape”方法中。我只是不知道如何使它正确工作。

java user-interface matrix graphics point
1个回答
0
投票

您的旋转代码正确。但是,您尝试变换的点比多边形中的点多。内部xpointsypoints数组不一定完全填充。将所有出现的xCord.lengthyCord.length替换为poly.npoints,就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.