//■3D座標変換例 #include "myWin.h" #include "my3Dmat.h" #include "stdio.h" #include "stdlib.h" #include "locale.h" #define LWIDTH 4 //線幅 #define AWIDTH 2 //軸の線幅 // ラベル #define LB_1 1001 // 方位角 #define LB_2 1002 // 仰角 #define LB_3 1003 // 距離 // エディットボックス #define ED_1 2001 // 方位角 #define ED_2 2002 // 仰角 #define ED_3 2003 // 距離 // ボタン #define BT_1 3001 // 平行移動 #define BT_2 3002 // 回転移動 #define BT_3 3003 // スケーリング #define BT_4 3004 // 対称変換 #define BT_5 3005 // 任意軸回転 #define BT_6 3006 // 透視変換 float mu=-1, a=0.008F, b=0.05F,dm= 0.0005F;//写像用変数 static HWND btPara, btRota, btScale, btMirror, btAxis, btView; static HWND editA, editB, editC;//透視変換用 static HDC hbuf; static HBITMAP hBM;//ビットマップ描画用 // 立体表示用 Point org; TMatrix t; Point v0; double size_x; double size_y; void clearBitmap(){ SelectObject(hbuf,GetStockObject(NULL_PEN)); PatBlt(hbuf,0,0,2000,1000,WHITENESS); } void setView(double a,double e, double d)//視点設定 { Point P1=setPoint(0,0,1); TMatrix PP=perspect(d), RX=rot_x(e-90), RZ=rot_z(-90-a); t=mlt(mlt(perspect(d),rot_x(e-90)),rot_z(-90-a)); v0=mlt(mlt(rot_z(90+a),rot_x(90-e)),mlt(P1,d)); } Point screen(Point p){ Point a=mlt(t,p); double s=(t.mat[3][0]*p.X+t.mat[3][1]*p.Y+t.mat[3][2]*p.Z+t.mat[3][3]); return setPoint(org.X+a.X/s,org.Y-a.Y/s,a.Z); } void init2D(int x, int y){ size_x=x; size_y=y; org.X=size_x/2-0.5; org.Y=size_y/2-1.5; org.Z=0; setView(30,30,1000); } void drawLine(double X1, double Y1, double X2, double Y2){ MoveToEx(hbuf,(int)(X1+0.5),(int)(Y1+0.5),NULL); LineTo(hbuf,(int)(X2+0.5),(int)(Y2+0.5)); } void drawString(double X1, double Y1, TCHAR AX[]){ TextOut(hbuf, (int)(X1+0.5),(int)(Y1+0.5),AX, lstrlen(AX)); } void drawAxis(TCHAR AX[], Point P1, Point P2){ Point PP1 = screen(P1); Point PP2 = screen(P2); drawLine(PP1.X, PP1.Y, PP2.X, PP2.Y); drawString(PP2.X+4, PP2.Y, AX); } void drawAxis(){ HPEN pen = CreatePen(PS_SOLID,AWIDTH, 0);SelectObject(hbuf,pen); HBRUSH brush=CreateSolidBrush(0xFF0000);SelectObject(hbuf,brush); HFONT font=CreateFont(10, 0,0,0,FW_NORMAL,TRUE,FALSE,FALSE,SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FIXED_PITCH |FF_MODERN,NULL);SelectObject(hbuf,font); drawAxis(TEXT("X"),setPoint(-size_x/2,0,0), setPoint(size_x/2,0,0)); drawAxis(TEXT("Y"),setPoint(0,-size_x/2,0), setPoint(0,size_x/2*0.9,0)); drawAxis(TEXT("Z"),setPoint(0,0,-size_y/2), setPoint(0,0,size_y/2)); DeleteObject(brush);DeleteObject(pen);DeleteObject(font); } void drawLine(Point P1, Point P2, int C) { HPEN pen = CreatePen(PS_SOLID,LWIDTH, C);SelectObject(hbuf,pen); Point PP1 = screen(P1), PP2 = screen(P2); drawLine( PP1.X, PP1.Y, PP2.X, PP2.Y); DeleteObject(pen); } void drawLineDot(Point P1, Point P2, int C) { HPEN pen = CreatePen(PS_DOT,1, C);SelectObject(hbuf,pen); Point PP1 = screen(P1), PP2 = screen(P2); drawLine( PP1.X, PP1.Y, PP2.X, PP2.Y); DeleteObject(pen); } void drawLine(Line LDT,int C){ Point P1=LDT.p[0]; for(int i=1;i