// ■透明のシミュレーション #include "myWin.h" #include "mySmodel.h" #include "stdio.h" #include "stdlib.h" #include "locale.h" // ラベル #define LB_1 1001 // 方位角 #define LB_2 1002 // 仰角 #define LB_3 1003 // 距離 #define LB_4 1004 // 反射率 #define LB_5 1005 // 屈折率 #define LB_6 1006 // 物体色 // エディットボックス #define ED_1 2001 // 方位角 #define ED_2 2002 // 仰角 #define ED_3 2003 // 距離 #define ED_4 2004 // 反射率 #define ED_5 2005 // 屈折率 // ボタン #define BT_1 3001 // ボタン1 #define BT_2 3002 // ボタン2 #define BT_3 3003 // ボタン3 static HWND bt1, bt2, bt3; // 実行指定用ボタン static HWND editA, editB, editC, editD, editE;//変換用係数を指定するeditBox static HDC hbuf; static HBITMAP hBM;//ビットマップ描画用 // 立体表示用 Point org, v0; //原点、視点位置 TMatrix t, it; //変換マトリックス double dv; //Z方向にずらす量 double size_x, 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)); } void setview(Point p){//■視点位置による方向設定 Point P1=setPoint(0,0,1); dv=len(p); Point wa=unit(p); v0=p; if((wa.X==0) &&(wa.Y==0)){ t=perspect(dv);return;} double wd=sqrt(wa.X*wa.X+wa.Y*wa.Y); t=mlt(mlt(perspect(dv),rot_x(-wd,wa.Z)),rot_z(-wa.X/wd,-wa.Y/wd)); it=mlt(rot_z(wa.X/wd,-wa.Y/wd),rot_x(wd,wa.Z)); } 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); } Point world(Point p){ //■View座標をWorld座標に変換 double sz=-p.Z/dv; return mlt(it,(setPoint((p.X-org.X)*sz,(-p.Y+org.Y)*sz,p.Z+dv))); } 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 origin(int x, int y){ org = setPoint(x+0.5F , y-0.5F,0); }//■原点設定 void drawPoint(double x,double y, int C){//■点を描く SetPixel(hbuf,(int)(x+0.5), (int)(y+0.5),C); } //--------------------------------------------------------------------- //■透明のシミュレーション // 以下の係数を用いる //  diffuse:拡散反射係数, specular: 鏡面反射係数, ambient: 環境光, // reflect: 反射率, refract: 屈折率, matColor: 物体色 // void drawBall(){ //球体 Scene sc=setScene(0x191900); Attr Ac=setAttr(matColor,diffuse,specular,ambient,reflect ,refract ); sc=regist(sc, setBall(setPoint(0,0,70),70),Ac); Poly Wp=setPoly(setPoint(200,200,-50),setPoint(-200,200,-50),setPoint(-200,-200,-50),setPoint(200,-200,-50)); sc=regist(sc,setWall(Wp),setAttr(RGB(100,100,150))); init2D(500,400); origin(250,200); Point L0 = setPoint(0,400,1000); //照明光源位置 Point V0 = setPoint(500,500,500); //視点 setview(V0); HCURSOR hc=LoadCursor(NULL,IDC_WAIT); SetCursor(hc); for(int x=0;x