improper euler

This commit is contained in:
violette 2025-04-27 18:19:47 -04:00
parent ca9f2d4c03
commit 52158d293e

60
main.c
View file

@ -22,8 +22,8 @@
#define ACTION_STEP 0.1
#define PITCH_STEP 0.08
#define ROLL_STEP 0.00
#define YAW_STEP 0.01
#define ROLL_STEP 0.05
#define YAW_STEP 0.05
#define K1 100
#define K2 50
@ -69,23 +69,23 @@ static struct termios originalTerm = {};
double calcX(double x, double y, double z){
return
x * Angle.cosA * Angle.cosB +
y * Angle.sinA * Angle.cosB
x * Angle.cosC * Angle.cosB +
y * Angle.sinC * Angle.cosB
-z * Angle.sinB;
}
double calcY(double x, double y, double z){
return
x * (Angle.cosA * Angle.sinB * Angle.sinC - Angle.sinA * Angle.cosC) +
y * (Angle.sinA * Angle.sinB * Angle.sinC + Angle.cosA * Angle.cosC) +
z * Angle.cosB * Angle.sinC;
x * (Angle.cosC * Angle.sinB * Angle.sinA - Angle.sinC * Angle.cosA) +
y * (Angle.sinC * Angle.sinB * Angle.sinA + Angle.cosC * Angle.cosA) +
z * Angle.cosB * Angle.sinA;
}
double calcZ(double x, double y, double z){
return
x * (Angle.cosA * Angle.sinB * Angle.cosC + Angle.sinA * Angle.sinC) +
y * (Angle.sinA * Angle.sinB * Angle.cosC - Angle.cosA * Angle.sinC) +
z * Angle.cosB * Angle.cosC;
x * (Angle.cosC * Angle.sinB * Angle.cosA + Angle.sinC * Angle.sinA) +
y * (Angle.sinC * Angle.sinB * Angle.cosA - Angle.cosC * Angle.sinA) +
z * Angle.cosB * Angle.cosA;
}
void calcAngle(){
@ -164,20 +164,16 @@ void handleAngle(char *input) {
Angle.currentTarget = *input;
switch (*input) {
case 'W':
Angle.CTarget -= M_PI_2;
// pitch angle +pi/2
Angle.ATarget = Angle.A - M_PI_2;
break;
case 'A':
// yaw angle -pi/2
Angle.BTarget -= M_PI_2;
Angle.BTarget = Angle.B + M_PI_2;
break;
case 'S':
// pitch angle -pi/2
Angle.CTarget += M_PI_2;
Angle.ATarget = Angle.A + M_PI_2;
break;
case 'D':
// yaw angle +pi/2
Angle.BTarget += M_PI_2;
Angle.BTarget = Angle.B - M_PI_2;
break;
default:
Angle.currentTarget = 0;
@ -185,28 +181,28 @@ void handleAngle(char *input) {
// idle animation
//Angle.A += ROLL_STEP;
//Angle.B += YAW_STEP;
Angle.B += YAW_STEP;
//Angle.C += PITCH_STEP;
}
else
switch(Angle.currentTarget) {
case 'W':
Angle.C -= ACTION_STEP;
if (Angle.C <= Angle.CTarget) RESET_C_ANGLE(*input);
Angle.A -= ACTION_STEP;
if (Angle.A <= Angle.ATarget) RESET_A_ANGLE(*input);
break;
case 'A':
Angle.B -= ACTION_STEP;
if (Angle.B <= Angle.BTarget) RESET_B_ANGLE(*input);
break;
case 'S':
Angle.C += ACTION_STEP;
if (Angle.C >= Angle.CTarget) RESET_C_ANGLE(*input);
break;
case 'D':
Angle.B += ACTION_STEP;
if (Angle.B >= Angle.BTarget) RESET_B_ANGLE(*input);
break;
case 'S':
Angle.A += ACTION_STEP;
if (Angle.A >= Angle.ATarget) RESET_A_ANGLE(*input);
break;
case 'D':
Angle.B -= ACTION_STEP;
if (Angle.B <= Angle.BTarget) RESET_B_ANGLE(*input);
break;
}
}
@ -258,11 +254,11 @@ int main(){
memset(output, ' ', SCREEN_WIDTH * SCREEN_HEIGHT);
memset(zBuffer, 0, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(double));
for(double cubeX = -CUBE_WIDTH ; cubeX < CUBE_WIDTH ; cubeX += STEP) {
for(double cubeY = -CUBE_WIDTH ; cubeY < CUBE_WIDTH ; cubeY += STEP) {
for(double cubeX = -CUBE_WIDTH + STEP ; cubeX < CUBE_WIDTH - STEP ; cubeX += STEP) {
for(double cubeY = -CUBE_WIDTH + STEP ; cubeY < CUBE_WIDTH - STEP ; cubeY += STEP) {
rotateCube(cubeX, cubeY, -CUBE_WIDTH, FACE_FRONT);//front
rotateCube(cubeX, cubeY, CUBE_WIDTH, FACE_BACK);//back
rotateCube(CUBE_WIDTH, -cubeX, cubeY, FACE_RIGHT);//right
rotateCube(CUBE_WIDTH, cubeX, cubeY, FACE_RIGHT);//right
rotateCube(-CUBE_WIDTH, cubeX, cubeY, FACE_LEFT);//left
rotateCube(cubeX, CUBE_WIDTH, cubeY, FACE_BOTTOM);//bottom
rotateCube(cubeX, -CUBE_WIDTH, cubeY, FACE_TOP);//top