#include "myWin.h" #include "stdio.h" #include "math.h" #define swap(type, X,Y) do{type T; T=X;X=Y; Y=T;}while(0) static HDC hBuff; static HBITMAP hBM; static int X, Y ;static int XDT[5], YDT[5]; int IMS=0;double MAT[5][6]; void clearBitmap(){//ビットマップのクリア SelectObject(hBuff,GetStockObject(NULL_PEN)); PatBlt(hBuff,0,0,1000,600,WHITENESS); } void setData(){ for(int i=0;i<4;i++)for(int j=4;j>i;j--)//X座標の小さい順にソート if(XDT[j-1]>XDT[j]){ swap(int, XDT[j-1],XDT[j]);swap(int, YDT[j-1],YDT[j]); } } void initData(){//初期値設定 for(int i=0; i<5;i++){ XDT[i] = YDT[i] = 64*i;} setData(); //matSolve(); } double difference(int i1,int i2){//■微分値(X方向は256で除した値とする) return ((double)(YDT[i2 ]-YDT[i1]))/((double)(XDT[i2]-XDT[i1]))*256.0; } int spline(double X, int i){//■スプライン補間 int i1=i, i2=i+1;double DY1, DY2,DD=256; //X方向の値をそのまま使うと if(abs(X-XDT[i1])<0.1) return (int) YDT[i1]; //誤差が大きくなるので256で除した if(abs(X-XDT[i2])<0.1) return (int) YDT[i2]; //値を用いる if(i1==0) DY1=difference(1,0); else DY1=difference(i2, i-1); if(i2==4) DY2=difference(4,3); else DY2=difference(i2+1,i1); double SG=(double)(XDT[i2]-XDT[i1])/DD, SG2=SG*SG, SG3=SG2*SG; double A1=2.0*((double)(YDT[i1]-YDT[i2]))/SG3+(DY1+DY2)/SG2; double A2=3.0*((double)(YDT[i2]-YDT[i1]))/SG2-(2.0*DY1+DY2)/SG; double A3=DY1, A4=YDT[i1]; double T= (X-(double)XDT[i1])/DD; double T2=T*T; double T3=T2*T; int R=(int) A1*T3+A2*T2+A3*T+A4;if(R<0) R=0; if(R>255)R=255; return R; } int setValue(double X){//カラートーン値を求める関数 if(X<=XDT[0])return 0; if(X>=XDT[4])return 255;//範囲外を除く for(int i=0;i<4;i++) if(X>=XDT[i] && X=255) X=254; if(Y<=0) Y=0; if(Y>=255) Y=255; IMS=ID; XDT[IMS]=X; YDT[IMS]=Y;setData(); drawFig(hw); } } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ initData();MoveWindow(hw,0,0,320,320,TRUE); SetWindowText(hw,TEXT("スプライン補間によるトーンカーブ")); HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,1000,600); hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hBM); viewChange(hw,127,127); drawFig(hw); ReleaseDC(hw,hdc); } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ X=LOWORD(lp)-10; Y=265-HIWORD(lp); viewChange(hw,X,Y); } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ IMS=0;} void procMouseMove(HWND hw, WPARAM wp,LPARAM lp){ if(GetKeyState(VK_LBUTTON)<0 && IMS!=0){ X=LOWORD(lp)-10; Y=265-HIWORD(lp); viewChange(hw,X, Y); } } void procPaint(HWND hw,WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw,&ps); BitBlt(hdc,0,0,1000,600,hBuff,0,0,SRCCOPY); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : DeleteDC(hBuff);DeleteObject(hBM); PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate (hw,wp,lp); return 0; case WM_LBUTTONDOWN: procLButtonDown(hw,wp,lp); return 0; case WM_LBUTTONUP : procLButtonUp (hw,wp,lp); return 0; case WM_MOUSEMOVE : procMouseMove (hw,wp,lp); return 0; case WM_PAINT : procPaint (hw,wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); }