Вращение фигуры во круг точки

93
27 февраля 2022, 07:30

Такая проблема: в поставленной задаче требуется сделать вращение фигуры вокруг своего центра

Само вращение я сделал, но возникает проблема при вращении части с аркой (тк у арки начало координат не в центре). Код класса:

    import javax.swing.*;
import java.awt.*;
import java.awt.geom.Arc2D;
import java.awt.geom.GeneralPath;
public class CMy2DObject12 extends JFrame {
    private int x;
    private int y;
    private int A;
    private int A1;
    private int A2;
    private int A3;
    private double Angle;
    private double[] xmas=new double[17];
    private double[] ymas=new double[17];
    public CMy2DObject12(int x, int y, int a, int a1, int a2, int a3) {
        this.x = x;
        this.y = y;
        A = a;
        A1 = a1;
        A2 = a2;
        A3 = a3;
        Angle=90;
        massLoad();
        setSize(600,600);
        setVisible(true);
    }
    private void massLoad(){
        xmas[0]=x-A/2+A2;
        ymas[0]=y-A/2;
        xmas[1]=x+A/2;
        ymas[1]=y-A/2;
        xmas[2]=x+A/2;
        ymas[2]=y-A/2;
        xmas[3]=x+A/2;
        ymas[3]=y-A1/2;
        xmas[4]=x+A/2-A1/2;
        ymas[4]=y-A1/2;
        xmas[5]=x+A/2;
        ymas[5]=y+A1/2;
        xmas[6]=x+A/2;
        ymas[6]=y+A/2;
        xmas[7]=x+A/2;
        ymas[7]=y+A/2;
        xmas[8]=x-A/2+A3;
        ymas[8]=y+A/2;
        xmas[9]=x-A/2+A3;
        ymas[9]=y+A/2;
        xmas[10]=x-A/2+A3;
        ymas[10]=y+A/2-A3;
        xmas[11]=x-A/2+A3;
        ymas[11]=y+A/2-A3;
        xmas[12]=x-A/2;
        ymas[12]=y+A/2-A3;
        xmas[13]=x-A/2;
        ymas[13]=y+A/2-A3;
        xmas[14]=x-A/2;
        ymas[14]=y-A/2+A2;
        xmas[15]=x-A/2;
        ymas[15]=y-A/2+A2;
        xmas[16]=x-A/2+A2;
        ymas[16]=y-A/2;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public int getA() {
        return A;
    }
    public void setA(int a) {
        A = a;
    }
    public int getA1() {
        return A1;
    }
    public void setA1(int a1) {
        A1 = a1;
    }
    public int getA2() {
        return A2;
    }
    public void setA2(int a2) {
        A2 = a2;
    }
    public int getA3() {
        return A3;
    }
    public void setA3(int a3) {
        A3 = a3;
    }
    public void Move(int dx,int dy, double dAngle){
        x=dx;
        y=dy;
        massLoad();
        repaint();
    }
    public void Move(){
    }
    public void Rotate(double dAngle) {
        for (int i = 0; i < 17; i++){
            double xx= (x + (xmas[i] - x) * Math.cos(dAngle) - (ymas[i] - y) * Math.sin(dAngle));
            double yy=  (y + (ymas[i] - y) * Math.cos(dAngle) + (xmas[i] - x) * Math.sin(dAngle));
            xmas[i]=xx;
            ymas[i]=yy;
        }
        if(Angle==360) Angle=0;
        Angle+=Math.toDegrees(dAngle);
        System.out.println(Angle);
        repaint();
    }
    @Override
    public void paint(Graphics g){
        Graphics2D g2d = (Graphics2D) g;
        GeneralPath figure = new GeneralPath();
        g2d.setPaint(Color.WHITE);
        g2d.fillRect(0,0,600,600);
        g2d.setPaint(Color.BLACK);
        //g2d.drawOval((int)xmas[4],(int)ymas[4],A1,A1);
        g2d.drawArc((int) (xmas[4]),(int)ymas[4],A1,A1,(int)Angle,180);
        g2d.setPaint(Color.RED);
        g2d.drawLine(x-1,y,x+1,y);
        g2d.drawLine(x,y-1,x,y+1);
        g2d.drawLine((int)xmas[0],(int)ymas[0],(int)xmas[1],(int)ymas[1]);
        g2d.drawLine((int)xmas[2],(int)ymas[2],(int)xmas[3],(int)ymas[3]);
        g2d.drawLine((int)xmas[5],(int)ymas[5],(int)xmas[6],(int)ymas[6]);
        g2d.drawLine((int)xmas[7],(int)ymas[7],(int)xmas[8],(int)ymas[8]);
        g2d.drawLine((int)xmas[9],(int)ymas[9],(int)xmas[10],(int)ymas[10]);
        g2d.drawLine((int)xmas[11],(int)ymas[11],(int)xmas[12],(int)ymas[12]);
        g2d.drawLine((int)xmas[13],(int)ymas[13],(int)xmas[14],(int)ymas[14]);
        g2d.drawLine((int)xmas[15],(int)ymas[15],(int)xmas[16],(int)ymas[16]);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Как сделать что бы при вращении арка не улетала в сторону? Или может есть какой другой метод для рисования арки, где центром координат будет центр?

Answer 1

Четыре первых параметра drawArc задают прямоугольник, в который вписан эллипс, из которого вырезается дуга. В данном случае нужна дуга окружности, поэтому можно не обращать внимание на то, что оси эллипса должны быть наклонены, но вот позицию самого квадрата нужно задать корректно.

В данный момент *mas[4] (левая верхняя точка квадрата) является повернутой точкой, которая ранее отстояла от центра окружности на R по горизонтали и вертикали, а должны она быть точкой, отстоящей от повернутого центра окружности на R по горизонтали и вертикали.

На рисунке G -неправильно, F - правильно

READ ALSO
Как в Spring WebFlux использовать Gson вместо Jackson?

Как в Spring WebFlux использовать Gson вместо Jackson?

Не думал что придется тратить на это время,но уже изрядно потрепался в поисках ответаИспользование spring

93
Как задать количество в веденных цифр в ANTLR4

Как задать количество в веденных цифр в ANTLR4

Для ограничения ввода четырех цифр в лексическом анализаторе Lex используется следующая конструкция: [0-9]{4}Как ограничить ввод, так что бы ввести...

79
if-else через switch-case в Java

if-else через switch-case в Java

Всегда ли конструкцию if-else можно реализовать через аналогичную switch-case в языке Java? Вопрос был на экзамене в вузе, я предположил, к примеру, что...

149
Ручной ввод в JDatePicker

Ручной ввод в JDatePicker

При ручном вводе даты возникает ошибка

122