Такая проблема: в поставленной задаче требуется сделать вращение фигуры вокруг своего центра
Само вращение я сделал, но возникает проблема при вращении части с аркой (тк у арки начало координат не в центре). Код класса:
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();
}
}
}
Как сделать что бы при вращении арка не улетала в сторону? Или может есть какой другой метод для рисования арки, где центром координат будет центр?
Четыре первых параметра drawArc задают прямоугольник, в который вписан эллипс, из которого вырезается дуга. В данном случае нужна дуга окружности, поэтому можно не обращать внимание на то, что оси эллипса должны быть наклонены, но вот позицию самого квадрата нужно задать корректно.
В данный момент *mas[4]
(левая верхняя точка квадрата) является повернутой точкой, которая ранее отстояла от центра окружности на R по горизонтали и вертикали, а должны она быть точкой, отстоящей от повернутого центра окружности на R по горизонтали и вертикали.
На рисунке G -неправильно, F - правильно
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Не думал что придется тратить на это время,но уже изрядно потрепался в поисках ответаИспользование spring
Для ограничения ввода четырех цифр в лексическом анализаторе Lex используется следующая конструкция: [0-9]{4}Как ограничить ввод, так что бы ввести...
Всегда ли конструкцию if-else можно реализовать через аналогичную switch-case в языке Java? Вопрос был на экзамене в вузе, я предположил, к примеру, что...