// ■リフラクションマッピング #include "myView.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 myBitmap txt; //--------------------------------------------------------------------- //■リフラクションマッピング // 以下の係数を用いる //  diffuse:拡散反射係数, specular: 鏡面反射係数, ambient: 環境光, // reflect: 反射率, refract: 屈折率, matColor: 物体色。 // Point mapping(Point V, int dir) { //(注意)言語によってasin, acosで求まる値の範囲が異なるので // 適宜 a, e の値を調整すること double a=0, e = (asin((double)dir*(double)V.Z)+PI/2)/PI; double XX=V.X, YY=V.Y; double aa=acos((double)dir*XX/sqrt(XX*XX+YY*YY))/PI/2; double wi=txt.b.bmWidth, hi=txt.b.bmHeight; a=aa; if(V.Y>0) a= aa; //C#のときは不要, VC++, VB用 else if(V.Y<0) a=-aa; //C#のときは不要, VC++, VB用 return setPoint(a*wi+ txt.b.bmWidth/2, e*hi);//VC++用 //return setPoint(a*wi, e*hi); //C#, VBのときはこちら } Point mapping(Point V){return mapping(V, 1);} double mixPixel(HDC hdc, int X1, int Y1){ return 0.5*((double)RED (GetPixel(hdc,X1,Y1))+ (double)GREEN(GetPixel(hdc,X1,Y1))+ (double)BLUE (GetPixel(hdc,X1,Y1)))/3; } void drawBall(){ //球体 HCURSOR hc=LoadCursor(NULL,IDC_WAIT); SetCursor(hc); HDC hdctx =startBitmap(txt); Ball Ba=setBall(setPoint(0,0,0),100); double n=refract; init2D(500,400); origin(250,200); Point L0 = setPoint(0,400,1000); //照明光 Point V0 = mlt(200,(unit(0,5))); //視点 setview(V0); for(int x=0;x