十字キーをレンダリングし、十字キーが押された場合に回転させるコードがあります。四角形を塗りつぶす
今私は、最初はうまく機能した立方体の片面を埋めるようにしました。
しかし、ちょっと観察したところ、ある角度で立方体を回転させると、塗りつぶすべき面が非常に奇妙になることに気付きました。
コード:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class Cube extends JFrame {
double p[][] = new double[9][4];
int x=1, y=2, z=3;
boolean xRotUp = false;
boolean yRotRight = false;
boolean xRotDown = false;
boolean yRotLeft = false;
double px, py, pz;
double angle_x = 0.02;
double angle_y = 0.0150;
double angle_z = 0.010;
public Cube() {
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case 37:
yRotLeft = false;
break;
case 38:
xRotUp = false;
break;
case 39:
yRotRight = false;
break;
case 40:
xRotDown = false;
break;
}
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case 37:
if (!yRotRight) {
yRotLeft = true;
} else {
yRotRight = false;
}
break;
case 38:
if (!xRotDown) {
xRotUp = true;
} else {
xRotDown = false;
}
break;
case 39:
if (!yRotLeft) {
yRotRight = true;
} else {
yRotLeft = false;
}
break;
case 40:
if (!xRotUp) {
xRotDown = true;
} else {
xRotUp = false;
}
break;
}
}
});
}
public void rotate() {
for (int i=0; i<9;i++) {
px = p[i][x];
py = p[i][y];
pz = p[i][z];
if (xRotUp) {
p[i][y] = py*Math.cos(angle_x)-pz*Math.sin(angle_x);
p[i][z] = py*Math.sin(angle_x)+pz*Math.cos(angle_x);
py = p[i][y];
pz = p[i][z];
}
if (xRotDown) {
p[i][y] = py*Math.cos(-angle_x)-pz*Math.sin(-angle_x);
p[i][z] = py*Math.sin(-angle_x)+pz*Math.cos(-angle_x);
py = p[i][y];
pz = p[i][z];
}
if (yRotRight) {
p[i][x] = px*Math.cos(angle_y)+pz*Math.sin(angle_y);
p[i][z] =-px*Math.sin(angle_y)+pz*Math.cos(angle_y);
px = p[i][x];
}
if (yRotLeft) {
p[i][x] = px*Math.cos(-angle_y)+pz*Math.sin(-angle_y);
p[i][z] =-px*Math.sin(-angle_y)+pz*Math.cos(-angle_y);
px = p[i][x];
}
}
}
public void init() {
setBackground(new Color(0,0,0));
p[1][x] = -100; p[1][y] = -100; p[1][z] = -100;
p[2][x] = +100; p[2][y] = -100; p[2][z] = -100;
p[3][x] = +100; p[3][y] = -100; p[3][z] = +100;
p[4][x] = -100; p[4][y] = -100; p[4][z] = +100;
p[5][x] = -100; p[5][y] = +100; p[5][z] = -100;
p[6][x] = +100; p[6][y] = +100; p[6][z] = -100;
p[7][x] = +100; p[7][y] = +100; p[7][z] = +100;
p[8][x] = -100; p[8][y] = +100; p[8][z] = +100;
/* 8 - - - - - 7
/| /|
5 - - - - - 6 |
| | | |
| 4 - - - -|- 3
|/ |/
1 - - - - - 2
*/
}
Image buffer;
Graphics2D gBuffer;
public void paint(Graphics g) {
if (buffer==null) {
buffer=createImage(this.getSize().width, this.getSize().height);
gBuffer=(Graphics2D)buffer.getGraphics();
}
gBuffer.clearRect(0,0,this.getSize().width, this.getSize().height);
gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gBuffer.setColor(Color.LIGHT_GRAY);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,(int)(p[8][x])+200,(int)(p[8][y])+200);
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.drawLine((int)(p[5][x])+200,(int)(p[5][y])+200,(int)(p[3][x])+200,(int)(p[3][y])+200);
gBuffer.setColor(Color.DARK_GRAY);
gBuffer.fillPolygon(new int[] {
(int)p[1][x]+200,
(int)p[2][x]+200,
(int)p[6][x]+200,
(int)p[5][x]+200},
new int[] {
(int)p[1][y]+200,
(int)p[2][y]+200,
(int)p[5][y]+200,
(int)p[6][y]+200
} , 4);
gBuffer.setColor(Color.CYAN);
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,(int)(p[2][x])+200,(int)(p[2][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,(int)(p[3][x])+200,(int)(p[3][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,(int)(p[4][x])+200,(int)(p[4][y])+200);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,(int)(p[1][x])+200,(int)(p[1][y])+200);
gBuffer.drawLine((int)(p[5][x])+200,(int)(p[5][y])+200,(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[6][x])+200,(int)(p[6][y])+200,(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.setColor(Color.RED);
gBuffer.drawLine((int)(p[7][x])+200,(int)(p[7][y])+200,(int)(p[8][x])+200,(int)(p[8][y])+200);
gBuffer.setColor(Color.CYAN);
gBuffer.drawLine((int)(p[8][x])+200,(int)(p[8][y])+200,(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.setColor(Color.BLUE);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,(int)(p[8][x])+200,(int)(p[8][y])+200);
g.drawImage (buffer, 0, 0, this);
try {Thread.sleep(20);}
catch (InterruptedException e) {}
//for (int i=1;i<9;i++) {
// Rotation um z-Achse
//p[i][x] = px*Math.cos(angle_z)-py*Math.sin(angle_z);
//p[i][y] = py*Math.cos(angle_z)+px*Math.sin(angle_z);
// }
rotate();
repaint();
}
public void update(Graphics g) {paint(g);}
}
は、あなたが「奇妙な振る舞い」によって何を意味するかについて詳しく説明することはできますか?あなたはそれがどのように見えるのか、実際にどのように見えるのですか?多くのコードがあり、細部の詳細は人々が間違っているかもしれないものを絞り込むのに役立ちます。 – paisanco
これらのポリゴンのうちの1つが突き出ている - あなたは私たちのジオメトリーをしたいですか? – gpasch
@paisancoは_gpasch_のようにすでに1つのポリゴンが突き出ていると言います。ときどき動き回って複数の三角形を作成する – Clyme