/* File GLOBE.C: Terrestrial Globe - HGC/EGA version */ #include #include #include typedef enum {false, true} boolean; void graph(double y, double z, int *plotted); void rotate3d(double xr, double yr, double zr, double *px, double *py, double *pz); #define LATITUTE 37.29 // Áö±¸º» Áß¾ÓÁ¡ÀÇ À§µµ¿Í °æµµ(º¯°æ °¡´É) #define LONGITUTE 127.04 // ÀÌ °ª ÀÌ¿ÜÀÇ ¼öÄ¡´Â ¼Õ´ëÁö ¸» °Í /* |z */ #define RADIUS 200. /* | */ #define ZROTATE -LONGITUTE /* p/| */ #define YROTATE -LATITUTE /* |+------ y */ #define XROTATE 22.5 /* /-/ */ #define INTERVAL 15. /* / fi */ /* x */ int main(void) { int graphdrive = DETECT, graphmode; int plotted; double x, y, z; double p, fi; double zr, yr, xr; initgraph(&graphdrive, &graphmode, ""); xr = XROTATE * M_PI / 180.; yr = YROTATE * M_PI / 180.; zr = ZROTATE * M_PI / 180.; circle(getmaxx() / 2, getmaxy() / 2, RADIUS); circle(getmaxx() / 2, getmaxy() / 2, 1); /* Latitute */ for (p = M_PI_2; p > -M_PI_2; p -= INTERVAL * M_PI / 180.) { plotted = false; if (fabs(p - 0.) < 1.e-5) setlinestyle(SOLID_LINE, 0, THICK_WIDTH); else setlinestyle(SOLID_LINE, 0, NORM_WIDTH); for (fi = 0.; fi <= 2. * M_PI; fi += M_PI / 24.) { x = RADIUS * cos(p) * cos(fi); y = RADIUS * cos(p) * sin(fi); z = RADIUS * sin(p); rotate3d(xr, yr, zr, &x, &y, &z); if (x < 0.) plotted = false; else graph(y, z, &plotted); } } /* Longitute */ for (fi = 0.; fi < M_PI; fi += INTERVAL * M_PI / 180.) { plotted = false; if (fi == 0.) setlinestyle(SOLID_LINE, 0, THICK_WIDTH); else setlinestyle(SOLID_LINE, 0, NORM_WIDTH); for (p = 0.; p <= 2. * M_PI; p += M_PI / 24.) { x = RADIUS * cos(p) * cos(fi); y = RADIUS * cos(p) * sin(fi); z = RADIUS * sin(p); rotate3d(xr, yr, zr, &x, &y, &z); if (x < 0.) plotted = false; else graph(y, z, &plotted); } } getch(); closegraph(); return(0); } /* Rotation order : z axis -> y axis -> x axis */ void rotate3d(double xr, double yr, double zr, double *px, double *py, double *pz) { double x = *px, y = *py, z = *pz; double x1, y1, z1, x2, y2, z2, x3, y3, z3; x1 = x * cos(zr) - y * sin(zr); y1 = x * sin(zr) + y * cos(zr); z1 = z; x2 = x1 * cos(yr) - z1 * sin(yr); y2 = y1; z2 = x1 * sin(yr) + z1 * cos(yr); x3 = x2; y3 = y2 * cos(xr) - z2 * sin(xr); z3 = y2 * sin(xr) + z2 * cos(xr); *px = x3; *py = y3; *pz = z3; } void graph(double y, double z, int *plotted) { int xx, yy, xasp, yasp; getaspectratio(&xasp, &yasp); xx = getmaxx() / 2 + (int)y; yy = getmaxy() / 2 - (int)(z * xasp / yasp); if (*plotted == false) moveto(xx, yy); else lineto(xx, yy); *plotted = true; }