ということで前回のつづきですが、
3点の消点でやってみます。
●元
●平面的変形(もはや台形じゃないけど^^;)
●立体的変形の平面投影っぽく
●無理やり感満載の3消点
こんな感じとなりますね。
●元
●平面的変形(もはや台形じゃないけど^^;)
●立体的変形の平面投影っぽく
●無理やり感満載の3消点
こんな感じとなりますね。
void getDaikeiPersPos(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double* pX,double* pY,double tx,double ty,double delt){
double xa,ya,xb,yb,xa2,ya2,xb2,yb2;
xa = ya = xb = yb = xa2 = ya2 = xb2 = yb2 = 0;
getDaikeiPersPosX(x1,y1,x2,y2,x3,y3,x4,y4 ,&xa,&ya,&xb,&yb ,tx,delt);
getDaikeiPersPosY(x1,y1,x2,y2,x3,y3,x4,y4 ,&xa2,&ya2,&xb2,&yb2 ,ty,delt);
bool b = vCrossPoint(xa,ya, xb,yb, xa2,ya2, xb2,yb2,pX,pY);
}
void getDaikeiPersPosX(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4
,double* xa,double* ya,double* xb,double* yb,double t,double delt){
if(t<0) t = 0;
if(t>1) t = 1;
<0 if="" t="">
double xa1,ya1,xa2,ya2,xa3,ya3,xa4,ya4,xa5,ya5,xa6,ya6;
double cx,cy,xx,yy;
xa1 = ya1 = xa2 = ya2 = xa3 = ya3 = xa4 = ya4 = xa5 = ya5 = xa6 = ya6 = 0;
cx = cy = xx = yy = 0;
double tA = 0;
double tB = 1;
double tC = 0.5;
xa1 = x1; xa2 = x2; xa3 = x3; xa4 = x4;
ya1 = y1; ya2 = y2; ya3 = y3; ya4 = y4;
bool bCross = vCrossPoint(x1,y1, x2,y2, x3,y3, x4,y4,&cx,&cy);
bool b;
int ct = 0;
while(true){
if(ct++ > 16) break;
tC = (tA + tB)/2;
b = vCrossPoint(xa1,ya1, xa3,ya3, xa2,ya2, xa4,ya4,&xx,&yy);
if(bCross){
b = vCrossPoint(x1,y1, x4,y4, xx,yy, cx,cy,&xa5,&ya5);
b = vCrossPoint(x2,y2, x3,y3, xx,yy, cx,cy,&xa6,&ya6);
}else{
b = vCrossPoint(x1,y1, x4,y4, xx,yy, xx,yy,&xa5,&ya5);
b = vCrossPoint(x2,y2, x3,y3, xx,yy, xx,yy+100,&xa6,&ya6);
}
if(fabs(tC - t) < delt) break;
if(t < tC){xa3 = xa6; xa4 = xa5; ya3 = ya6; ya4 = ya5; tB = tC;}
else{ xa1 = xa5; xa2 = xa6; ya1 = ya5; ya2 = ya6; tA = tC; }
}
double ddt = (t - tC) / (tB - tA);
double _xa = xa5 + (xa4 - xa1) * ddt;
double _ya = ya5 + (ya4 - ya1) * ddt;
double _xb = xa6 + (xa3 - xa2) * ddt;
double _yb = ya6 + (ya3 - ya2) * ddt;
*xa = _xa; *ya = _ya; *xb = _xb; *yb = _yb;
}
0>
コメント
コメントを投稿