#include"Point.h" #include"MatrixGauss.h" static Point g_ptSrc[3]; // 変形元 static Point g_ptDst[3]; // 変形先 static double g_a=0,g_b=0,g_c=0,g_d=0,g_e=0,g_f=0; // 変形パラメータ static bool g_src=false,g_dst=false; // フラグ static unsigned char g_param=0; // フラグ // 変形パラメータを計算する void ComputeParam(void) { double matrix[3*4]; matrix[ 0]=g_ptSrc[0].x; matrix[ 1]=g_ptSrc[0].y; matrix[ 2]=1; matrix[ 3]=g_ptDst[0].x; matrix[ 4]=g_ptSrc[1].x; matrix[ 5]=g_ptSrc[1].y; matrix[ 6]=1; matrix[ 7]=g_ptDst[1].x; matrix[ 8]=g_ptSrc[2].x; matrix[ 9]=g_ptSrc[2].y; matrix[10]=1; matrix[11]=g_ptDst[2].x; MatrixGauss(matrix,3); g_a=matrix[ 3], g_b=matrix[ 7], g_c=matrix[11]; matrix[ 0]=g_ptSrc[0].x; matrix[ 1]=g_ptSrc[0].y; matrix[ 2]=1; matrix[ 3]=g_ptDst[0].y; matrix[ 4]=g_ptSrc[1].x; matrix[ 5]=g_ptSrc[1].y; matrix[ 6]=1; matrix[ 7]=g_ptDst[1].y; matrix[ 8]=g_ptSrc[2].x; matrix[ 9]=g_ptSrc[2].y; matrix[10]=1; matrix[11]=g_ptDst[2].y; MatrixGauss(matrix,3); g_d=matrix[ 3], g_e=matrix[ 7], g_f=matrix[11]; g_param=0; } // 変形元の座標を設定する // 引数:左回りor右回りの頂点座標 void SetSrcPoint(Point pt1,Point pt2,Point pt3) { g_ptSrc[0]=pt1; g_ptSrc[1]=pt2; g_ptSrc[2]=pt3; g_src=true; if(++g_param>=2) ComputeParam(); } // 変形先の座標を設定する // 引数:左回りor右回りの頂点座標 void SetDstPoint(Point pt1,Point pt2,Point pt3) { g_ptDst[0]=pt1; g_ptDst[1]=pt2; g_ptDst[2]=pt3; g_dst=true; if(++g_param>=2) ComputeParam(); } // 3点アフィン変換 // Point pt:変形元の座標 // 戻り値:変形先の座標 Point TransformAffine3(Point pt) { if(g_src==false || g_dst==false) return Point(-1,-1); // 変形元または変形先の座標を設定していない double x=g_a*pt.x + g_b*pt.y + g_c; double y=g_d*pt.x + g_e*pt.y + g_f; return Point(x,y); }