#include"Point.h" #include"MatrixGauss.h" #include #define PI 3.14159265358979323846 // 円周率 static Point g_ptSrc[5]; // 変形元 static Point g_ptDst[5]; // 変形先 static double g_a[4]={0},g_b[4]={0},g_c[4]={0},g_d[4]={0},g_e[4]={0},g_f[4]={0}; // 変形パラメータ static double g_radian[4]={0}; // 角度 static int g_max_num=0; // 最大と最小の角度に挟まれた領域の番号 static int g_min_num=0; // 最小と最大の角度に挟まれた領域の番号 static bool g_src=false,g_dst=false; // フラグ static unsigned char g_param=0; // フラグ // 変形パラメータを計算する void ComputeParam(void) { double matrix[3*4]; double w,h,max=0,min=2*PI; for(int i=0;i<4;i++) { int k=(i+1)%4; matrix[ 0]=g_ptSrc[i].x; matrix[ 1]=g_ptSrc[i].y; matrix[ 2]=1; matrix[ 3]=g_ptDst[i].x; matrix[ 4]=g_ptSrc[k].x; matrix[ 5]=g_ptSrc[k].y; matrix[ 6]=1; matrix[ 7]=g_ptDst[k].x; matrix[ 8]=g_ptSrc[4].x; matrix[ 9]=g_ptSrc[4].y; matrix[10]=1; matrix[11]=g_ptDst[4].x; MatrixGauss(matrix,3); g_a[i]=matrix[ 3], g_b[i]=matrix[ 7], g_c[i]=matrix[11]; matrix[ 0]=g_ptSrc[i].x; matrix[ 1]=g_ptSrc[i].y; matrix[ 2]=1; matrix[ 3]=g_ptDst[i].y; matrix[ 4]=g_ptSrc[k].x; matrix[ 5]=g_ptSrc[k].y; matrix[ 6]=1; matrix[ 7]=g_ptDst[k].y; matrix[ 8]=g_ptSrc[4].x; matrix[ 9]=g_ptSrc[4].y; matrix[10]=1; matrix[11]=g_ptDst[4].y; MatrixGauss(matrix,3); g_d[i]=matrix[ 3], g_e[i]=matrix[ 7], g_f[i]=matrix[11]; w=g_ptSrc[i].x - g_ptSrc[4].x; h=g_ptSrc[i].y - g_ptSrc[4].y; g_radian[i]=atan2(h,w); // -π 〜 π if(maxg_radian[i]){ min=g_radian[i]; g_min_num=i; } // 最小と最大の角度に挟まれた領域を探す } g_param=0; } // 変形元の座標を設定する // 引数:左回りの頂点座標 pt5は中心 void SetSrcPoint(Point pt1,Point pt2,Point pt3,Point pt4,Point pt5) { g_ptSrc[0]=pt1; g_ptSrc[1]=pt2; g_ptSrc[2]=pt3; g_ptSrc[3]=pt4; g_ptSrc[4]=pt5; g_src=true; if(++g_param>=2) ComputeParam(); } // 変形先の座標を設定する // 引数:左回りの頂点座標 pt5は中心 void SetDstPoint(Point pt1,Point pt2,Point pt3,Point pt4,Point pt5) { g_ptDst[0]=pt1; g_ptDst[1]=pt2; g_ptDst[2]=pt3; g_ptDst[3]=pt4; g_ptDst[4]=pt5; g_dst=true; if(++g_param>=2) ComputeParam(); } // 所属する領域の番号を返す // bool leftTurn:参照点は左回りか static int GetAreaNum(Point pt,bool leftTurn) { double w=pt.x - g_ptSrc[4].x; double h=pt.y - g_ptSrc[4].y; double radian=atan2(h,w); // -π 〜 π if(leftTurn) { for(int i=0;i<4;i++) { int k=(i+1)%4; if(radian<=g_radian[i] && radian>g_radian[k]) return i; } return g_min_num; // 最小と最大の角度に挟まれた領域 } else { for(int i=0;i<4;i++) { int k=(i+1)%4; if(radian>=g_radian[i] && radian