// ■2次元波動方程式 #include "myWin.h" #include "stdio.h" #include "math.h" #define numX 100 //X方向メッシュ数 #define numY 100 //Y方向メッシュ数 static int drawStart; static HDC hBuff; //ビットマップ用デバイスコンテキストハンドラ static HBITMAP hBM; //ビットマップハンドラ double PI=3.14159265358979; // π double dlx, dx, dy; // 表示刻み幅、XY軸方向の単位メッシュ幅 double alpha,beta; // X(α)Y(β)軸との水平軸との角度 double Z[numX+1][numY+1]; // 高さデータ double *Ymax, *Ymin; // 上下浮動水平線 double Xlen, Ylen; // 表示上のXY方向長さ double curX, curY; // 現在ペン位置 double dxCosA; // dx*cos(α) double dyCosB; // dy*cos(β) double dxSinA; // dx*sin(α) double dySinB; // dy*sin(β) double dlxTanA; // dlx*tan(α) double dlxTanB; // dlx*tan(β) int NR; // 浮動水平線用配列の大きさ double ZS[2][numX+1][numY+1]; double V [2][numX+1][numY+1]; int ID1, ID2; double Myu; double simTime, counter; double GroundX(int j, int k){// X0=Y0=0のときのX座標 return ((double)j * dxCosA-(double)k * dyCosB); } double GroundY(int j, int k){// X0=Y0=0のときのX座標 return ((double)j * dxSinA+(double)k * dySinB); } int DrawPos(int j, int k){// 表示位置 return (int)(0.5+(Ylen+GroundX(j,k)/dlx)); } double setPx(int j, int k,double X0, double PH){ return PH* dlx + GroundX(j,k)+X0; } double setPy(int j, int k,double Y0, double PH, double fp){ return PH* dlxTanA + GroundY(j,k) + fp + Y0; } void initialize(){ dlx = 0.1; alpha = PI / 8; beta = PI / 6; dx = 2; dy = 1.4; dxCosA = dx * cos(alpha) ; dyCosB = dy * cos(beta); dxSinA = dx * sin(alpha) ; dySinB = dy * sin(beta); Xlen = (numX-1) * dxCosA; Ylen = (numY-1) * dyCosB; dlxTanA = dlx * tan(alpha) ; dlxTanB = dlx * tan(beta); NR=(int)((Xlen+Ylen)/dlx)+2; curX=0; curY=0; } double getZ(int j, int k){ if(Z[j][k]>=-999) return Z[j][k]; double R=1000, N=0; for(int jj = j - 1; jj <= j + 1; jj += 2) for(int kk = k - 1; kk <= k + 1; kk += 2){ if(Z[jj][kk]>-999 && Z[jj][kk]0; k--) for(int j = numX-1; j >0; j--) if(Z[j][k]>-999 || Z[j-1][k]>-999 || Z[j][k-1]>-999 || Z[j-1][k-1]>-999){ setSquareXYZ(X0, Y0, j, k, AX, AY, AZ); //-------------------------------------------------------- // 四角形で表示する方法 //drawPoly(AX,AY,4, setColor(AZ, 4)); //-------------------------------------------------------- // 三角形に分ける方法(その1) //double TX[3], TY[3], TZ[3]; //TX[0]=AX[0]; TY[0]=AY[0]; TZ[0]=AZ[0]; //TX[1]=AX[2]; TY[1]=AY[2]; TZ[1]=AZ[2]; //TX[2]=AX[1]; TY[2]=AY[1]; TZ[2]=AZ[1]; //drawPoly(TX,TY,3, setColor(TZ, 3)); //TX[2]=AX[3]; TY[2]=AY[3]; TZ[2]=AZ[3]; //drawPoly(TX,TY,3, setColor(TZ, 3, CC)); //-------------------------------------------------------- // 三角形に分ける方法(その2) double TX[3], TY[3], TZ[3]; double CX = 0, CY = 0, CZ=0; for(int i=0;i<4; i++) { CX+=AX[i]; CY+=AY[i]; CZ+=AZ[i];} CX /= 4; CY /= 4; CZ /=4; TX[0]=CX; TY[0]=CY; TZ[0]=CZ; int IB=3; SelectObject(hBuff,GetStockObject(NULL_PEN)); for(int i=0; i<4;i++) { TX[1]=AX[IB]; TX[2]= AX[i]; TY[1]=AY[IB]; TY[2]= AY[i]; TZ[1]=AZ[IB]; TZ[2]= AZ[i]; drawPoly(TX,TY,3, 0xFFFFFF); IB=i; } SelectObject(hBuff,pen);SetROP2(hBuff,R2_MASKPEN);// 画面とAndで線を描く drawPoly(AX,AY,4, 0xFFFFFF);SetROP2(hBuff,R2_COPYPEN); } DeleteObject(pen); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc, 0,0,700,400,hBuff,0,0,SRCCOPY); EndPaint(hw,&ps); } void setData(){//データを設定 for(int j=0;j 3) A=0; else A = sin(R) / R; ZS[0][ i][ j] = -A; V[0][ i][ j] = 0; } } int waveEquation(int SaveN, double Alfa, double DX, double DT){//■ 波動方程式2次元 double Beta = Alfa * Alfa / (DX * DX); for(int k=0;k=50000) {KillTimer(hw,1); drawStart=true; return;} waveEquation(100, 0.05, 0.05, 0.01); setData();clearBitmap(); strDE(str, simTime);TextOut(hBuff,2,2,str, lstrlen(str)); hiddenLine(); InvalidateRect(hw,NULL,FALSE); } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ TCHAR str[128]; if(drawStart){ initWave(); setData();clearBitmap(); strDE(str, simTime);TextOut(hBuff,2,2,str, lstrlen(str)); hiddenLine(); InvalidateRect(hw,NULL,FALSE); drawStart=false; } //画面キャプチャするときは以下のコメントを外して、SetTimer(…)をコメントにする //waveEquation(200, 0.05, 0.05, 0.01); setData();clearBitmap(); //strDE(str, simTime);TextOut(hBuff,2,2,str, lstrlen(str)); //hiddenLine(); InvalidateRect(hw,NULL,FALSE); SetTimer(hw,1,1,NULL); } void procRButtonDown(HWND hw, WPARAM wp,LPARAM lp){ KillTimer(hw,1);drawStart=true; } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ SetWindowText(hw,TEXT("2次元波動方程式")); MoveWindow(hw,0,0,700,450,TRUE); HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,700,450); hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hBM); SelectObject(hBuff,GetStockObject(NULL_PEN)); PatBlt(hBuff,0, 0,700,450,WHITENESS); ReleaseDC(hw,hdc); initialize();drawStart=true; procLButtonDown(hw,wp,lp); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate(hw,wp,lp) ; return 0; case WM_TIMER : procTimer(hw,wp,lp) ; return 0; case WM_PAINT : procPaint(hw,wp,lp) ; return 0; case WM_LBUTTONDOWN : procLButtonDown(hw,wp,lp) ; break; case WM_RBUTTONDOWN : procRButtonDown(hw,wp,lp) ; break; } return DefWindowProc(hw,msg,wp,lp); }