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