Ý tưởng:
- Thiết kế các đường thẳng vẽ trái đất trong k gian 3 chiều.
- Sử dụng phép chiếu (phối cảnh, song song...) đưa toạ độ trong k gian 3 chiều về 2 chiều.
- Sử dụng phép co để biến hình nhỏ hoặc lớn tuỳ tích.
- Thiết kế các đường thẳng vẽ trái đất trong k gian 3 chiều.
- Sử dụng phép chiếu (phối cảnh, song song...) đưa toạ độ trong k gian 3 chiều về 2 chiều.
- Sử dụng phép co để biến hình nhỏ hoặc lớn tuỳ tích.
Code:
#include "graphics.h"
#include "math.h"
#include "conio.h"
#define pi 3.1415
typedef struct R3{
float x,y,z;
};
typedef struct {
R3 Point[39];
}VatThe;
float xd,yd,zd;
void ToaDoDiemVatThe(float k,float l,float i,VatThe p) {
p.Point[1].x=0; ;p.Point[1].y=0 ;p.Point[1].z=0-2*i;
p.Point[2].x=0 ;p.Point[2].y=60-k ;p.Point[2].z=20-i;
p.Point[3].x=-30+k ;p.Point[3].y=50-k ;p.Point[3].z=20-i;
p.Point[4].x=-50+k ;p.Point[4].y=30-k ;p.Point[4].z=20-i;
p.Point[5].x=-60+k ;p.Point[5].y=0 ;p.Point[5].z=20-i;
p.Point[6].x=-50+k ;p.Point[6].y=-30+k ;p.Point[6].z=20-i;
p.Point[7].x=-30+k ;p.Point[7].y=-50+k ;p.Point[7].z=20-i;
p.Point[8].x=0 ;p.Point[8].y=-60+k ;p.Point[8].z=20-i;
p.Point[9].x=30-k ;p.Point[9].y=-50+k ;p.Point[9].z=20-i;
p.Point[10].x=50-k ;p.Point[10].y=-30+k ;p.Point[10].z=20-i;
p.Point[11].x=60-k ;p.Point[11].y=0 ;p.Point[11].z=20-i;
p.Point[12].x=50-k ;p.Point[12].y=30-k ;p.Point[12].z=20-i;
p.Point[13].x=30-k ;p.Point[13].y=50-k ;p.Point[13].z=20-i;
p.Point[14].x=0 ;p.Point[14].y=60-l ;p.Point[14].z=50;
p.Point[15].x=-30+l ;p.Point[15].y=50-l ;p.Point[15].z=50;
p.Point[16].x=-50+l ;p.Point[16].y=30-l ;p.Point[16].z=50;
p.Point[17].x=-60+l ;p.Point[17].y=0 ;p.Point[17].z=50;
p.Point[18].x=-50+l ;p.Point[18].y=-30+l ;p.Point[18].z=50;
p.Point[19].x=-30+l ;p.Point[19].y=-50+l ;p.Point[19].z=50;
p.Point[20].x=0 ;p.Point[20].y=-60+l ;p.Point[20].z=50;
p.Point[21].x=30-l ;p.Point[21].y=-50+l ;p.Point[21].z=50;
p.Point[22].x=50-l ;p.Point[22].y=-30+l ;p.Point[22].z=50;
p.Point[23].x=60-l ;p.Point[23].y=0 ;p.Point[23].z=50;
p.Point[24].x=50-l ;p.Point[24].y=30-l ;p.Point[24].z=50;
p.Point[25].x=30-l ;p.Point[25].y=50-l ;p.Point[25].z=50;
p.Point[26].x=0 ;p.Point[26].y=60-k ;p.Point[26].z=80+i;
p.Point[27].x=-30+k ;p.Point[27].y=50-k ;p.Point[27].z=80+i;
p.Point[28].x=-50+k ;p.Point[28].y=30-k ;p.Point[28].z=80+i;
p.Point[29].x=-60+k ;p.Point[29].y=0 ;p.Point[29].z=80+i;
p.Point[30].x=-50+k ;p.Point[30].y=-30+k ;p.Point[30].z=80+i;
p.Point[31].x=-30+k ;p.Point[31].y=-50+k ;p.Point[31].z=80+i;
p.Point[32].x=0 ;p.Point[32].y=-60+k ;p.Point[32].z=80+i;
p.Point[33].x=30-k ;p.Point[33].y=-50+k ;p.Point[33].z=80+i;
p.Point[34].x=50-k ;p.Point[34].y=-30+k ;p.Point[34].z=80+i;
p.Point[35].x=60-k ;p.Point[35].y=0 ;p.Point[35].z=80+i;
p.Point[36].x=50-k ;p.Point[36].y=30-k ;p.Point[36].z=80+i;
p.Point[37].x=30-k ;p.Point[37].y=50-k ;p.Point[37].z=80+i;
p.Point[38].x=0 ;p.Point[38].y=0 ;p.Point[38].z=100+2*i;
}
void PhepChieu() {
xd=0.4;
yd=-0.894;
zd=0.224;
}
void BienDoi(VatThe p,int x,int y){
for(int i=1;i<=38;i++) {
p.Point[i].x=p.Point[i].y*(xd/yd) +p.Point[i].x+320+x;
p.Point[i].z=p.Point[i].y*(zd/yd) +p.Point[i].z+200+y;
}
}
void PhepXoay(int l,VatThe p, VatThe v) {
float k;
k=l*pi/180;
for(int i=1; i<=38; i++) {
v.Point[i].x = cos(k)*p.Point[i].x +sin(k)*p.Point[i].y;
v.Point[i].y = -sin(k)*p.Point[i].x +cos(k)*p.Point[i].y;
v.Point[i].z = p.Point[i].z;
}
}
void VeVatThe(VatThe v) {
for(int i=2; i<=13; i++) {
line(v.Point[1].x,v.Point[1].z,v.Point[i].x,v.Point[i].z);
line(v.Point[38].x,v.Point[38].z,v.Point[i+24].x,v.Point[i+24].z);
line(v.Point[i].x,v.Point[i].z,v.Point[i+12].x,v.Point[i+12].z);
line(v.Point[i+12].x,v.Point[i+12].z,v.Point[i+24].x,v.Point[i+24].z);
if (i<=12) {
line(v.Point[i].x,v.Point[i].z,v.Point[i+1].x,v.Point[i+1].z);
line(v.Point[i+12].x,v.Point[i+12].z,v.Point[i+1+12].x,v.Point[i+1+12].z);
line(v.Point[i+24].x,v.Point[i+24].z,v.Point[i+1+24].x,v.Point[i+1+24].z);
}
}
line(v.Point[2].x,v.Point[2].z,v.Point[13].x,v.Point[13].z);
line(v.Point[2+12].x,v.Point[2+12].z,v.Point[13+12].x,v.Point[13+12].z);
line(v.Point[2+24].x,v.Point[2+24].z,v.Point[13+24].x,v.Point[13+24].z);
}
void Init() {
int gd,gm;
gd= DETECT;
initgraph(&gd,&gm,"c:\\tc\\bgi");
}
void main() {
clrscr();
int gm,gd= DETECT;
initgraph(&gd,&gm,"c:\\tc\\bgi");
line(100,100,200,200);
VatThe Vat;
ToaDoDiemVatThe(0,-20,10,Vat);
PhepChieu();
BienDoi(Vat,0,0);
VeVatThe(Vat);
getch();
closegraph();
}