http://www.youtube.com/watch?v=OlgqC8HLBTA.
хочу такое же себе сделать, нашел только 2 примера, ни один из них корректно не заработал.
если кто-то такое писал, поделитесь пж кодом.
А от Вашего есть толк ? Или все сообщения должны быть такими, какими Вы их хотите видеть ?drakon писал(а):Аlex, какой толк с вашего сообщения?
Код: Выделить всё
/**************************************************************************/
#define PI 3.1415927
typedef struct{
short x;
short y;
}P_Pos;
/**************************************************************************/
P_Pos Get_Point(short p_num, int zoom, double Xan, double Yan, double Zan){
short Yt, Xt, Zt;
short X, Y, Z;
short cube[][3]={-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1};
P_Pos ret;
X=cube[p_num][0]*zoom;
Y=cube[p_num][1]*zoom;
Z=cube[p_num][2]*zoom;
Xan *= PI/180; // Переводим градусы в радианы
Yan *= PI/180; //
Zan *= PI/180; //
Yt = Y * cos(Xan) - Z * sin(Xan);
Zt = Y * sin(Xan) + Z * cos(Xan);
Y = Yt;
Z = Zt;
Xt = X * cos(Yan) - Z * sin(Yan);
Zt = X * sin(Yan) + Z * cos(Yan);
X = Xt;
Z = Zt;
Xt = X * cos(Zan) - Y * sin(Zan);
Yt = X * sin(Zan) + Y * cos(Zan);
X = Xt;
Y = Yt;
ret.x = X;
ret.y = Y;
return ret;
}
/**************************************************************************/
void Draw_Cube(P_Pos *p_arr){
Line(p_arr[0].x, p_arr[0].y, p_arr[1].x, p_arr[1].y);
Line(p_arr[1].x, p_arr[1].y, p_arr[3].x, p_arr[3].y);
Line(p_arr[3].x, p_arr[3].y, p_arr[2].x, p_arr[2].y);
Line(p_arr[2].x, p_arr[2].y, p_arr[0].x, p_arr[0].y);
Line(p_arr[4].x, p_arr[4].y, p_arr[5].x, p_arr[5].y);
Line(p_arr[5].x, p_arr[5].y, p_arr[7].x, p_arr[7].y);
Line(p_arr[7].x, p_arr[7].y, p_arr[6].x, p_arr[6].y);
Line(p_arr[6].x, p_arr[6].y, p_arr[4].x, p_arr[4].y);
Line(p_arr[1].x, p_arr[1].y, p_arr[5].x, p_arr[5].y);
Line(p_arr[0].x, p_arr[0].y, p_arr[4].x, p_arr[4].y);
Line(p_arr[3].x, p_arr[3].y, p_arr[7].x, p_arr[7].y);
Line(p_arr[2].x, p_arr[2].y, p_arr[6].x, p_arr[6].y);
}
/**************************************************************************/
Код: Выделить всё
/**************************************************************************/
void Task_1(void){
static short zoom;
static short i, grad;
static P_Pos pos[8], pos_prev[8];
static char zoom_op=0;
for(i=0;i<8;i++) pos_prev[i].x=pos_prev[i].y=0;
zoom = 40;
grad=15;
while(1){
OS_Delay(20 Ms);
/****************************************************************/
grad+=1; // Увеличиваем угол поворота
if(grad>360) grad=0; //
/******* Узнаём координаты 8-ми точек, учитывая поворот **********/
for(i=0;i<8;i++){
pos[i]=Get_Point(i , zoom, grad, grad, grad);
pos[i].x +=(320/2);
pos[i].y +=(240/2);
}
/****************************************************************/
SetColor(RGB565CONVERT(0,0,0)); // Закрашиваем куб чёрным цветом
Draw_Cube(pos_prev); // по старым координатам
SetColor(RGB565CONVERT(0,250,0)); // Рисуем новый куб зелёным цветом
Draw_Cube(pos); //
for(i=0;i<8;i++) pos_prev[i]=pos[i]; // Сохраняем текущие координаты
/****************************************************************/
}
}
/**************************************************************************/
Код: Выделить всё
/**************************************************************************/
void Task_1(void){
static short zoom;
static short i, grad;
static P_Pos pos[8], pos_prev[8];
static char zoom_op=0;
for(i=0;i<8;i++) pos_prev[i].x=pos_prev[i].y=0;
zoom = 40;
grad=15;
while(1){
OS_Delay(20 Ms);
/****************************************************************/
grad+=1; // Увеличиваем угол поворота
if(grad>360) grad=0; //
/****************************************************************/
if(zoom_op){
if(--zoom<10) zoom_op=0;
}
else{
if(++zoom>60) zoom_op=1;
}
/******* Узнаём координаты 8-ми точек, учитывая поворот **********/
for(i=0;i<8;i++){
pos[i]=Get_Point(i , zoom, grad, grad, grad);
pos[i].x +=(320/2);
pos[i].y +=(240/2);
}
/****************************************************************/
SetColor(RGB565CONVERT(0,0,0)); // Закрашиваем куб чёрным цветом
Draw_Cube(pos_prev); // по старым координатам
SetColor(RGB565CONVERT(0,250,0)); // Рисуем новый куб зелёным цветом
Draw_Cube(pos); //
for(i=0;i<8;i++) pos_prev[i]=pos[i]; // Сохраняем текущие координаты
/****************************************************************/
}
}
/**************************************************************************/