Files
Jérôme Delacotte 7b30d6e298 first commit
2025-03-06 11:15:32 +01:00

132 lines
3.2 KiB
C++
Executable File

#include "Cube.h"
Cube::Cube(Ecran * _ecran)
{
ecran = _ecran;
}
void Cube::QuickSort(int deb, int fin)
{
int i = deb;
int j = fin;
double milieu = 256 * zface[tri[(deb + fin) / 2]];
int temp;
while (i <= j)
{
while (256 * zface[tri[i]] > milieu) i++;
while (256 * zface[tri[j]] < milieu) j--;
if (i <= j)
{
temp = tri[i];
tri[i] = tri[j];
tri[j] = temp;
i++; j--;
}
}
if (i < fin) QuickSort(i, fin);
if (deb < j) QuickSort(deb, j);
// draw();
}
void Cube::draw()
{
int nb = 0;
while (nb < 200)
{
ecran->LcdClear();
a = a - 0.05;
b = b + 0.05;
for (int n = 0; n < 8; n++) {
lxn[n] = lx[n] * cos(b)
+ ly[n] * sin(a) * sin(b)
+ lz[n] * cos(a) * sin(b);
lyn[n] = ly[n] * cos(a)
- lz[n] * sin(a);
lzn[n] = -lx[n] * sin(b)
+ ly[n] * sin(a) * cos(b)
+ lz[n] * cos(a) * cos(b)
+ 5;
xd[n] = (LCD_X / 2)
+ (LCD_X * lxn[n] * c) / (2 * lzn[n]) * 2;
yd[n] = (LCD_Y / 2)
+ (LCD_Y * lyn[n] * c) / (2 * lzn[n]) * 2;
}
int facev = 0;
for (int m = 0; m < 6; m++) {
znm = (xd[face[m][2]] - xd[face[m][1]]) * (yd[face[m][1]] - yd[face[m][3]]) - (yd[face[m][2]] - yd[face[m][1]]) * (xd[face[m][1]] - xd[face[m][3]]);
//znm=2; only zsorting
if (znm > 0) {
zface[m] = lzn[face[m][0]] + lzn[face[m][1]] + lzn[face[m][2]] + lzn[face[m][3]] + lzn[face[m][4]];
tri[facev] = m;
facev++;
}
}
QuickSort(0, facev - 1);
for (int mb = 0; mb < facev; mb++) {
int color = WHITE;
switch (tri[mb]) {
case 0:
color = WHITE;
break;
case 1:
color = RED;
break;
case 2:
color = BLUE;
break;
case 3:
color = YELLOW;
break;
case 4:
color = GREEN;
break;
case 5:
color = CYAN;
break;
default:
break;
}
points[0].x = xd[face[tri[mb]][0]];
points[0].y = yd[face[tri[mb]][0]];
points[1].x = xd[face[tri[mb]][1]];
points[1].y = yd[face[tri[mb]][1]];
points[2].x = xd[face[tri[mb]][2]];
points[2].y = yd[face[tri[mb]][2]];
points[3].x = xd[face[tri[mb]][3]];
points[3].y = yd[face[tri[mb]][3]];
// FACE 1
ecran->drawFace(
points[0].x, points[0].y,
points[1].x, points[1].y,
points[2].x, points[2].y);
ecran->drawFace(
points[0].x, points[0].y,
points[2].x, points[2].y,
points[3].x, points[3].y);
// ecran->u8g2->drawLine(points[0].x, points[0].y, points[1].x, points[1].y);
// ecran->u8g2->drawLine(points[1].x, points[1].y, points[2].x, points[2].y);
// ecran->u8g2->drawLine(points[2].x, points[2].y, points[0].x, points[0].y);
//
// ecran->u8g2->drawLine(points[0].x, points[0].y, points[2].x, points[2].y);
// ecran->u8g2->drawLine(points[2].x, points[2].y, points[3].x, points[3].y);
// ecran->u8g2->drawLine(points[3].x, points[3].y, points[0].x, points[0].y);
}
ecran->u8g2->sendBuffer();
delay(50);
nb++;
}
}