Ý 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.

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();
}