スキップしてメイン コンテンツに移動

平面的な台形変形と奥行的な台形変形(2)

ということで前回のつづきですが、
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;
}

コメント

このブログの人気の投稿

Ratchet@PHPで自宅にhttpsでWebsocketするサンプルを動かす

今日のゴールは、外から自宅にhttpsでWebsocket@Rachet@PHP@WindowsServerするサンプルを動かすことです。 ※そのうち、Websocket@libwebsocket@Ubuntuをやりますね。 そもそもRatchetはポートを指定してws:// をうけつけてくれるものなので、 自宅サーバがそもそもNginxでリバースプロキシしてるので、 難しいことはせずに、それに則った形で設定を行います。 要するに、wss://をリバースプロキシで受けて、Ratchetが動作するサーバへ転送するだけです。 もちろん、プロキシにはUpgradeヘッダ(HTTP 1.1)への対応が必要となりますね。 絵にかくと、以下ですね。 自宅のhttpsはletsencryptというのを使用しています。 Windowsで使う場合には、以下が参考になりますね。 https://webbibouroku.com/Blog/Article/letsencrypt-setting ここではHTTPSそのものの設定に関しては記述しませんです。 リバースプロキシしてるNginxのconfの該当部分は以下としました。 ※abcd.comは実際のドメインに。 server { listen 443; include ssl-abcd.com.conf; server_name ws.abcd.com; proxy_set_header Host $http_host; access_log /log/ssl-ws-abcd.com.log main; location / { proxy_pass http://192.168.xxx.xxx:8080; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; } } これによって、javascriptから、 wss://ws.abcd.com が、 http:192.168.xxx.xxx:8080 に転送されることになるので、転送先にRatc...

意外とめんどいPHPからshellとかexecをWindowsでする場合の話。

いや、意外とめんどい話でした。 たとえば、CMD(BAT)ファイルで以下を実行させてみます。 ●TEST.cmd● REM ------------------- start a.exe start b.exe REM ------------------- pause そう、a.exeもb.exeも実行され、終了を待つことなくpause入ります。 そう、じゃぁ、phpで、以下をやってみます。 shell_exec('TEST.cmd' ); あれこれ とか exec('TEST.cmd' ); あれこれ すると、どうでしょう。 このa.exeとb.exeが両方終わるまで、待たされてしまい、 【あれこれ】のとこに来てくれません。 やりっぱなし! ができないのです。 うぅーん。LinuxでPHPならforkとかできる(ハズな)んだけど。 どうなってんだろ。これ(>_<) ここ、トリッキーないかがわしいことやればできるのかもしれないけど (できないかもですが^^;) つきつめるとこじゃないので、 どうせ最後はC++にするつもりなので、Jobコントローラーの部分なので、 素直にC++で描いてしまおうかとも思ったけど、 いろいろ調べた結果、psexecでできそうな感じもしたんだけど、 やってみるとできない。うぅーーん。 できるかぎりPHP という方針、若干、無理があったかな^^; じゃぁ、ってことで、プロセスを立ち上げっぱなしで戻ってくるEXEを作ってみた結果、 CreateProcessだと戻ってこない ShellExecuteなら戻ってくる ということがわかったので、そういうEXEを経由し、 exec("redshell -proc:php.exe z.php"); exec("redshell -proc:php.exe z2.php"); って感じで連続実行させるテストをしてみます。 ●a.php <?php exec("redshell -proc:php.exe z.php"); exec("redshell -proc:php.exe z2.php"); for($...