3Â÷¿ø °ø°£¿¡¼ ÀÓÀÇÀÇ °³¼öÀÇ ¼±À» ÀÔ·Â¹Þ¾Æ À̰ÍÀ» ¿ø±Ù¹ýÀ¸·Î Æò¸é¿¡ Ç¥½ÃÇØ ÁÖ´Â ÇÁ·Î±×·¥ÀÔ´Ï´Ù. È»ìÇ¥ Ű·Î ÀÚÀ¯ÀÚÀç·Î 3Â÷¿ø °ø°£À» µå³ªµé¸ç, ¿øÇÏ´Â À§Ä¡¿¡¼ ¿øÇÏ´Â °¢µµ·Î ¹°Ã¼¸¦ º¼ ¼ö ÀÖ½À´Ï´Ù. Àå¸éÀÇ Å©±â´Â â Å©±â¿¡ ¸Â°Ô ÀÚµ¿À¸·Î Á¶ÀýµË´Ï´Ù. (â Å©±â°¡ Á¤»ç°¢ÇüÀ̾î¾ß È¸é ºñÀ²ÀÌ ¸Â°Ô ³ª¿É´Ï´Ù)
¸ðµç ¿òÁ÷ÀÓÀº ÇöÀç ȸéÀ» ±âÁØÀ¸·Î À¯¿¬ÇÏ°Ô ÇàÇØÁý´Ï´Ù. ´Ü, Shift¿Í À§Ä¡ À̵¿ ۸¦ ÇÔ²² ´©¸£¸é YÃà °¢µµ°¡ ¹«½ÃµÇ¾î À̵¿ÇÕ´Ï´Ù. (¿¹¸¦ µé¾î ¾Æ·¡¸¦ º¸¸é¼ ¾ÕÀ¸·Î °¡´Â °ÍÀÌ °¡´ÉÇØÁý´Ï´Ù.)
ƯÈ÷ ÀÌ ÇÁ·Î±×·¥Àº MDI¸¦ ¾²°í ÀÖ¾î¼, ÇÑ ÆÄÀÏÀ» Ç¥½ÃÇϴ âÀ» ¿©·¯ °³ ¸¸µé ¼ö Àֱ⠶§¹®¿¡ ¾Æ·¡Ã³·³ ¸Å¿ì Èï¹Ì·Î¿î Ȱ¿ëµµ ÇÒ ¼ö ÀÖ½À´Ï´Ù. ´Ù¸¥ ¾î¶² ¶óÀ̺귯¸®µµ ¾²Áö ¾Ê°í ÀÚüÀûÀÎ ¼öÇнÄÀ¸·Î ÁÂÇ¥¸¦ °è»êÇÏ°í ±âº» À©µµ¿ì API¸¸ ½á¼ ±×¸²À» Ãâ·ÂÇϱ⠶§¹®¿¡ ¼Ò½º ÄÚµå´Â À̽ļºÀÌ ÀÖ½À´Ï´Ù.
°£´ÜÇÑ ±âÇÏÇÐ µµÇü, Á¤´Ù¸éü, Åä·¯½º(Æ©ºê), ±¸, 3Â÷¿ø ±×·¡ÇÁ µî ¿©·¯ Àç¹ÌÀÖ´Â ÀÔü±×¸²µéÀÌ ¿¹Á¦·Î °°ÀÌ µé¾îÀÖ½À´Ï´Ù. ÆÄÀÏ Ã¹ ÁÙ¿¡ Ãâ·ÂÇÏ°í ½ÍÀº ¼±ÀÇ °¹¼ö¸¦ ³Ö°í, ±× ´ÙÀ½ ¼±ÀÇ Ã¹ Á¡ÀÇ X Y Z ÁÂÇ¥¿Í ³¡ Á¡ÀÇ X Y Z ÁÂÇ¥¸¦ ³Ö¾î Áֱ⸸ Çϸé ÀÔ·Â µ¥ÀÌÅ͸¦ ¾ó¸¶µçÁö ¸¸µé ¼ö ÀÖ½À´Ï´Ù.
Ȥ½Ã MFC71.DLL°ú MSVCR71.DLLÀÌ ¾ø¾î¼ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇÁö ¾ÊÀ¸¸é ÀÌ ¾ÐÃà ÆÄÀϵµ ¹Þ¾Æ¼ À©µµ¿ì ½Ã½ºÅÛ Æú´õ¿¡ ¼³Ä¡ÇϽñ⠹ٶø´Ï´Ù.
2021³â 1¿ù, shift¸¦ ´©¸¥ »óÅ·δ ¿ìŬ¸¯ µå·¡±×¸¦ ÇØ¼ ½ÃÁ¡ º¯È¯ÀÌ µÇÁö ¾Ê´ø ¿À·£ °íÁúÀûÀÎ ¹®Á¦¸¦ ÇØ°áÇß½À´Ï´Ù.
2019³â 9¿ù, ¿¹Á¦ µ¥ÀÌÅÍ¿¡ 3Â÷¿ø ±×·¡ÇÈ ¸ðµ¨ÀÇ °íÀüÀÎ 'À¯Å¸ ÁÖÀüÀÚ'¸¦ Ãß°¡Çß½À´Ï´Ù.
¿À·£¸¸¿¡ ¾÷µ¥ÀÌÆ® µÈ 2018³â 11¿ù 29ÀÏ ¹öÀüÀº,
2005³â 4¿ù 27ÀÏ ¹öÀüÀº,
2004³â 10¿ù 10ÀÏ ¹öÀüÀº (2.2),
2004³â 2¿ù 24 - 3¿ù 1ÀÏ ¹öÀüÀº (2.0),
2003³â 4¿ù 26ÀÏ ¹öÀüÀº,



´ÙÀ½Àº ÀÌ ÇÁ·Î±×·¥À¸·Î º¼ ¼ö ÀÖ´Â 3Â÷¿ø ±×·¡ÇÈ µ¥ÀÌÅ͸¦ »ý¼ºÇØ ÁÖ´Â ÇÁ·Î±×·¥ÀÔ´Ï´Ù.
¿øÀº DELTA¸¸ÇÑ Á¤¹Ðµµ·Î Ç¥ÇöÇÕ´Ï´Ù. °ªÀÌ ÀÛÀ»¼ö·Ï ÃÎÃÎÇØÁý´Ï´Ù. M_PI/15´Â 15°¢ÇüÀ» ÀǹÌÇÏÁö¿ä.
int Build3dSphere()
{
#define M_PI 3.141592
#define RADIU 200
#define DX 0
#define DY 0
#define DZ 0
#define DELTA M_PI/15
FILE *fp; double a,b;
fp=fopen("d:\\±¸.txt", "wt");
for(b=0;b<=2*M_PI;b+=DELTA) {
for(a=0;a<2*M_PI;a+=DELTA) {
fprintf(fp, "%f %f %f ", cos(b)*cos(a)*RADIU+DX, sin(b)*cos(a)*RADIU+DY,
sin(a)*RADIU+DZ);
fprintf(fp, "%f %f %f\n", cos(b)*cos(a+DELTA)*RADIU+DX, sin(b)*cos(a+DELTA)*RADIU+DY,
sin(a+DELTA)*RADIU+DZ);
fprintf(fp, "%f %f %f ", cos(b)*cos(a)*RADIU+DX, cos(b)*sin(a)*RADIU+DY,
sin(b)*RADIU+DZ);
fprintf(fp, "%f %f %f\n", cos(b)*cos(a+DELTA)*RADIU+DX, cos(b)*sin(a+DELTA)*RADIU+DY,
sin(b)*RADIU+DZ);
}
}
fclose(fp);
return 0;
}
3Â÷¿ø ±×·¡ÇÈ ½Ã¿¬ ÇÁ·Î±×·¥ÀÇ ¼Ò½º Äڵ忡¼ ³»ºÎÀûÀ¸·Î ¾²ÀÎ C3dMatrix¿Í C3dPoint Ŭ·¡½º¸¦ ÀÌ¿ëÇÕ´Ï´Ù. »õ °¡ÁöÀÇ À§Ä¡´Â ¿ø·¡ÀÇ °¡ÁöÀÇ ¹æÇâÀ» Çà·Ä·Î º¯È¯ÇÏ¿© ¾ò¾îÁý´Ï´Ù.
void CreateBranch(const C3dMatrix& mat, const C3dPoint& pos, double lengt)
{
if(lengt<50) return;
C3dPoint newpos(0, 0, -lengt); newpos=mat*newpos+pos;
printf("%f %f %f %f %f %f\n", pos.x, pos.y, pos.z, newpos.x, newpos.y, newpos.z);
//»õ Á¤Á¡¿¡¼ ¼±ºÐÀ» ¶Ç ¼¼ °³ ¸¸µé¾î È£Ãâ
C3dMatrix rotY(
cos(M_PI/8), 0, -sin(M_PI/8),
0, 1, 0,
sin(M_PI/8), 0, cos(M_PI/8)
);
C3dMatrix rotZ(
cos(2*M_PI/3), -sin(2*M_PI/3), 0,
sin(2*M_PI/3), cos(2*M_PI/3), 0,
0,0,1
);
C3dMatrix res=mat*rotY; CreateBranch(res, newpos, lengt*4/5);
res=mat*rotZ*rotY; CreateBranch(res, newpos, lengt*4/5);
res=mat*rotZ*rotZ*rotY; CreateBranch(res, newpos, lengt*4/5);
}
À§ÀÇ °æ¿ì, ÇÑ °¡Áö¿¡¼ ¼¼ °³ÀÇ °¡Áö°¡ ¿ø·¡ °¡Áöº¸´Ù 22.5µµ Á¤µµ ±Á¾îÁø ä 120µµ °£°ÝÀ¸·Î ±ÕÀÏÇÏ°Ô »¸¾î ³ª¿É´Ï´Ù. ±æÀÌ´Â ¿ø·¡ °¡ÁöÀÇ 80%°¡ µÇÁö¿ä. Ãʱ⿡´Â
C3dMatrix mat(C3dMatrix::identity); C3dPoint pt(0, 0, 100); CreateBranch(mat, pt, 200);
ÀÌ·¸°Ô ½ÇÇàÀ» ½ÃÀÛÇØ º¸¼¼¿ä.
#define fixtof(p) ( ((double)*((long *)&p))/65536.0 )
int gx, gy;
#define DELTA 0.4
void draw_qspline(POINTFLOAT a, POINTFLOAT b, POINTFLOAT c)
{
//printf("Draw spline from %g %g - (%g %g) - %g %g\n", a.x,a.y, b.x,b.y, c.x,c.y);
float p,q,r,t;
for(t=0.0;t<1.0;t+=DELTA) {
p=(a.x-2*b.x+c.x)*t*t+(2*b.x-2*a.x)*t+a.x;
q=(a.y-2*b.y+c.y)*t*t+(2*b.y-2*a.y)*t+a.y;
printf("0 %g %g ", p+gx,q+gy);
r=t+DELTA; if(r>1) r=1;
p=(a.x-2*b.x+c.x)*r*r+(2*b.x-2*a.x)*r+a.x;
q=(a.y-2*b.y+c.y)*r*r+(2*b.y-2*a.y)*r+a.y;
printf("0 %g %g\n", p+gx,q+gy);
}
}
void draw_line(float a, float b,float c,float d)
{
printf("0 %g %g 0 %g %g\n", a+gx,b+gy, c+gx,d+gy);
}
void MakeDemo(HDC hDC, UINT wr, int mx, int my)
{
MAT2 mat2={{0,5},{0,0},{0,0},{0,-5}}; GLYPHMETRICS gm; PSTR buf; DWORD dwSize;
dwSize=::GetGlyphOutline(hDC, wr, GGO_NATIVE, &gm, 0, 0, &mat2);
buf=new char[dwSize]; gx=mx, gy=my;
::GetGlyphOutline(hDC, wr, GGO_NATIVE, &gm, dwSize, buf, &mat2);
//now, render the glyph data
TTPOLYGONHEADER *ptth; TTPOLYCURVE *ppc; int i,pos=0;
POINTFLOAT pa={-999,-999},pb,pc, totalbegin, totalend;
do {
ppc=(TTPOLYCURVE *)(buf+pos);
if(ppc->wType!=TT_PRIM_LINE && ppc->wType!=TT_PRIM_QSPLINE) {
ptth=(TTPOLYGONHEADER *)(buf+pos);
if(pa.x!=-999)
draw_line(totalbegin.x, totalbegin.y, totalend.x, totalend.y);
pa.x=fixtof(ptth->pfxStart.x); pa.y=fixtof(ptth->pfxStart.y);
totalbegin=pa;
pos+=sizeof(*ptth); ppc=(TTPOLYCURVE *)(buf+pos);
}
switch(ppc->wType) {
case TT_PRIM_QSPLINE:
for(i=0;i<ppc->cpfx-1;i++) {
pb.x=fixtof(ppc->apfx[i].x); pb.y=fixtof(ppc->apfx[i].y);
if(i<ppc->cpfx-2) {
pc.x=(pb.x+fixtof(ppc->apfx[i+1].x))/2;
pc.y=(pb.y+fixtof(ppc->apfx[i+1].y))/2;
} else {
pc.x=fixtof(ppc->apfx[i+1].x);
pc.y=fixtof(ppc->apfx[i+1].y);
}
draw_qspline(pa,pb,pc);
pa=pc; totalend=pa;
}
break;
case TT_PRIM_LINE:
for(i=0;i<ppc->cpfx;i++) {
pb.x=fixtof(ppc->apfx[i].x);; pb.y=fixtof(ppc->apfx[i].y);
draw_line(pa.x,pa.y, pb.x,pb.y);
pa=pb;
}
totalend=pa;
}
pos+=sizeof(*ppc)+sizeof(POINTFX)*(ppc->cpfx-1);
}
while(pos<dwSize);
if(pa.x!=-999) draw_line(totalbegin.x,totalbegin.y, totalend.x,totalend.y);
delete []buf;
}
¿øÇÏ´Â ±Û²Ã ¿ÀºêÁ§Æ®°¡ ¼³Á¤µÇ¾î ÀÖ´Â HDC ÇÚµé°ú, ¸¸µé°í ½ÍÀº ±ÛÀÚÀÇ À¯´ÏÄÚµå ¹øÈ£¸¦ wr¿¡ ÁöÁ¤ÇÏ¿© MakeDemo ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µË´Ï´Ù.
void CCubicBezierCurveOn3D(double t, const C3dPoint *ctrlpt, C3dPoint& o)
{
double _t = 1 - t;
double coef[4] = {
_t * _t * _t,
3 * t * _t * _t,
3 * t * t * _t,
t * t * t
};
for (int q = 0; q < 3; q++) {
double C3dPoint::* mptr = (q == 0 ? &C3dPoint::x : q == 1 ? &C3dPoint::y : &C3dPoint::z);
o.*mptr = ctrlpt[0].*mptr * coef[0] + ctrlpt[1].*mptr * coef[1] + ctrlpt[2].*mptr * coef[2] + ctrlpt[3].*mptr * coef[3];
}
}
void CCubicBezierPlaneOn3D(double ty, double tx, const C3dPoint (*ctrlpt)[4], C3dPoint& o)
{
double _ty = 1 - ty, _tx = 1 - tx;
double C_y[4] = {
_ty * _ty * _ty,
3 * ty * _ty * _ty,
3 * ty * ty * _ty,
ty * ty * ty
};
double C_x[4] = {
_tx * _tx * _tx,
3 * tx * _tx * _tx,
3 * tx * tx * _tx,
tx * tx * tx
};
for (int q = 0; q < 3; q++) {
double C3dPoint::* mptr = (q == 0 ? &C3dPoint::x : q == 1 ? &C3dPoint::y : &C3dPoint::z);
o.*mptr = 0;
for (int y = 0; y < 4; y++)
o.*mptr += ctrlpt[y][0].*mptr * C_y[y] * C_x[0] + ctrlpt[y][1].*mptr * C_y[y] * C_x[1] +
ctrlpt[y][2].*mptr * C_y[y] * C_x[2] + ctrlpt[y][3].*mptr * C_y[y] * C_x[3];
}
}
°î¼± ¹öÀüÀº Á¦¾îÁ¡ 4°³ÀÇ ¹è¿À» ctrlpt¿¡ ³Ö°í 0 ÀÌ»ó 1 ÀÌÇÏÀÇ ¸Å°³º¯¼ö t¸¦ ÁÖ¸é ±× ÁöÁ¡¿¡ ÇØ´çÇÏ´Â ±ËÀû o¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
°î¸é ¹öÀüÀº Á¦¾îÁ¡ 4°³·Î ÀÌ·ïÁø º£Áö¾î °î¼± ÀÚü¸¦ 4°³ ¹Þ½À´Ï´Ù. À̸¦ ÁÖ°í ¸Å°³º¯¼öµµ yÃà°ú xÃà 2°³¸¦ ÁÖ¸é ±× ÁöÁ¡¿¡ ÇØ´çÇÏ´Â ±ËÀû o¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.