// ■陰線消去 #include "myWin.h" #include "math.h" #define numX 51 #define numY 51 static HDC hBuff; static HBITMAP hBM; double PI=3.14159265358979; // π double dlx, dx, dy; // 表示刻み幅、XY軸方向の単位メッシュ幅 double alpha,beta; // X(α)Y(β)軸との水平軸との角度 double Z[52][52]; // 高さデータ 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; // 浮動水平線用配列の大きさ int hiddenDraw(double px, double py,int p, int Visible, int Update){ if((py>=Ymax[p]) ||(py<=Ymin[p])){ if(Update && (py>=Ymax[p])) Ymax[p]=py; if(Update && (py<=Ymin[p])) Ymin[p]=py; if(Visible){ HPEN hpen=CreatePen(PS_SOLID,1,0xFF0000); SelectObject(hBuff, hpen); MoveToEx(hBuff,20+(int) (curX*2), 400 - (int)(curY*2),NULL); LineTo (hBuff,20+(int) (px*2) , 400 - (int)(py*2)); DeleteObject(hpen); } curX=px; curY=py;return true; } else{ curX=px; curY=py;return false; } } 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; } double sinByR(double X, double Y){//高さの値を決める関数 sin(R)/R double R = sqrt(X * X + Y * Y); if(R==0.0) return 1; else return sin(R)/R; } void setData(double (*fun)(double A, double B)){//データを設定 double DNX2=(double) numX / 2.0, DNY2=(double) numY / 2.0, X; for(int j=0;j= p2; p--){ // 補間 PH = (double)(p - p1); fp = Z[j][k] - (Z[j][k + 1] - Z[j][k]) * PH * dlx / dyCosB; px = PH * dlx + GroundX(j, k) + X0; py = -PH * dlxTanB + GroundY(j, k) + fp + Y0; Vflag= hiddenDraw(px, py, p, Vflag, p != p2); } } } free(Ymin); free(Ymax); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc, 0,0,500,500,hBuff,0,0,SRCCOPY); EndPaint(hw,&ps); } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ initialize(); hiddenLine(); InvalidateRect(hw,NULL,FALSE); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ SetWindowText(hw,TEXT("陰線消去")); MoveWindow(hw,0,0,450,300,TRUE); HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,500,400); hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hBM); SelectObject(hBuff,GetStockObject(NULL_PEN)); PatBlt(hBuff,0, 0,500,400,WHITENESS); ReleaseDC(hw,hdc); 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_PAINT : procPaint(hw,wp,lp) ; return 0; case WM_LBUTTONDOWN : procLButtonDown(hw,wp,lp) ; break; } return DefWindowProc(hw,msg,wp,lp); }