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

投稿

POLYLINEで一点鎖線を生成する。

グラフィックスで一点鎖線を自力で表示させるのは結構大変ではないけど、めんどい。 まず、線を分解して、線分の集まりにする。 また曲線は直線置換することを前提としとく。 別に、1/10000ミリの精度を必要とする工作機械じゃないんだから^^; ということで、こんなことをするわけです。 で、まず、一点鎖線の定義ですが、 ここはよくあるlineTYpeの設定のように、繰り返す単位で定義します。 そうですね。データとしては、 double D[] = { 3,1,1,1 }; みたいなことです。 一般的に定義は偶数個、即ち、 描画部分の長さで始まり、 ブランクの長さで終わります。 だから、破線とかであれば、、 double D[] = {1,1}; みたいな定義となりますね。 それを実際のPOLYLINEに当てはめていく作業となりますよ。 さて問題は、、プログラミング上で、 どんなLOOPにするかっていうことです。 そう、図形の頂点としてのArrayの繰り返しと、 LINETYPEのパターンの繰り返しとなります。 2重LOOPというわけでは無いとこが、めんどいとこです。 要するに、LOOPが入れ子じゃないので、 別々に進んでいく感じとなります。 一般的には、直線の長さのほうがパターンの長さより長いことが多く、 頂点のLOOPの方が良いようなきもしますが、 曲線を直線置換すると、ひとうひとつの直線が短くなるし、 長かろうが短かろうが、 LINETYPEのパターンの長さと直線の長さが必ず一致するわけではないので、 それを踏まえた上で、こうしてみました。 while(1){ for(w=0;w<dashN;w++){ } break条件でbreak } まぁ、よくわからないかもですが、、まず無限LOOPのwhileをまわし、 その中でLINETYPEのARRAYをまわします。 主体をLINETYPEの方にもってきます。 それで、そのなかで、頂点の生成をしたり削ったりという謎のことをやります。 while(1){ for(w=0;w<dashN;w++){ double d = dashAR[w]; loalDashL += ...
最近の投稿

平面的な台形変形と奥行的な台形変形(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; 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 = ...

平面的な台形変形と奥行的な台形変形

何がやりたいかと言うと、 文字とか図形とかを台形変形、即ち、 奥行を考慮した、即ち、 パース的に表示させたいってことです。 今回は1点透視または2点透視の場合を考えます。 3点透視もそんなに難しくないけど、それは次にしときます。 簡単な概要は以下の図。 さて、どんな関数を作ればいいかというと、 平面的にn分割した点が、台形的にどの位置に位置するかを算定したいんです。 もしかして、、便利な数式とかあるんでしょうか? きっとあるとは思うのですが、やりたいことは所詮ディスプレイ上なので、 テーブル+直線補完程度でもいいのかな。速度的にも有利だし。 そーでなければ、透視図的な計算をしなくちゃならなくなるんで。 さて、どんな関数を作ればよいかというと、 実際には下図のように、 対角線の交点はちょうど2分割の位置にあるということだけで これをだんだん狭めていって、求める位置に近づけるようにします。 10回やれば1024分割、24回やれば16777216分割できるわけなので、 計算量は大して増えません。 で、、10分割する座標を出して表示させてみました。 で、codeはどうなるかというと、 while(true){ tC = (tA + tB)/2; vCrossPoint(xa1,ya1, xa4,ya4, xa2,ya2, xa3,ya3,&xx,&yy); vCrossPoint(xa1,ya1, xa3,ya3, xx,0, xx,100,&xa5,&ya5); vCrossPoint(xa2,ya2, xa4,ya4, xx,0, xx,100,&xa6,&ya6); if(fabs(tC - t) こんな感じで。

マイタージョイントあたりの微妙なバグ修正中

なんかマイターあたりの微妙なバグのために、 あいかわらずこんな絵を描く。 もう、、何年書いてんだ!こんな絵! 1 ABCDEは元の直線の座標なのでそのまま設定する。 2 交点②を算定 3 交点②が直線上にあれば内部の巾なので、直線の終点と始点を交点に修正して終了。 ------------------------ マイターの場合 ------------------------ 4 長さlを算定 5 長さlからマイターリミットを超えてるかどうか算定(マイターの場合) 6 超えて無ければ、直線の終点と始点を交点に修正して終了。 7 超えていればリミットの長さから5aを算定。 8 5aを通る直線Lの算定 9 直線Lと直線B-②、D-②の交点5b、5cを算定 10 B-5b-5c-Dのポリラインを追加して終了 ------------------------ 切り落とす場合 ------------------------ 11 角度dを算定→半分にしてd1を算定 12 π/2-d1からd2を算定、さらに半分にしてd3を算定 13 点Bをd2回転した点5を算定 14 点5を通る通る直線Mを」算定 15 直線Mと直線B-②、D-②の交点として点③④を算定 16 B-3-4-Dのプロラインを追加して終了 ------------------------ 丸角の場合 ------------------------ 17 点⑥⑦⑧⑨のベジェ制御点を算定 18 B-⑥-⑦-⑤、⑤-⑧-⑨-Dのベジェを追加 ※ベジェ制御点は魔法の係数(0.552284749)を使う

自前のクラスライブラリをLINUXに移植する問題。

そう、LINUX移植真っ最中です。 正直、Windows版で完成させてから10年以上の歳月は流れてるわけで、 縮小方向市場ではあるけれど、自分の専門でもある、 画像処理+組版という、もういーーだろ。これ。 そして専門性を理解してくれている取引先等はWindowsServerでも何の問題もなく、 いや、むしろ押し通してやってきたけれど、 ここへきてなんで移植なんだろーなんて考えつつ。 でも問題はFONTまわりくらい。 グラフィック系もほぼ自前だけど、FONTだけはWindowsAPIとかがささやかに残ってて。 まぁライフワークっちゃぁそうだけど、これがライフワークだったのはもう何年も前。 最近はC++と戯れない日がつづいたり。 今回は仕事で仕方なくって部分もあるけれど、 そんなことが無いと重い腰もあがらないことだし。 あ、でも64ビット前提にするから、ささやかな工夫とか、 固定小数点の16:16を32:32でもするか。 あぁあと、longのバイト数問題とか、地味にあるな。 さて、、グラフィック系の自前ライブラリの見直しから入ってますね。 いやぁー地味な記事だ。これ。 誰も読まないな。。 あーー この本ももう15年近く前 か。。 まぁでもそこらへんは『美しく』プログラムしてるから、それほどの問題でもないか。 とはいえ、200以上の自前クラスライブラリ、10万行の見直しはしんどいな-。 でもきっと半分は使ってないと思うので、、断捨離っすかねー。 ということで、2か月を目途に、プログラミングおたく少年しますよ。 いい年だけどね。 あー、makefile書くのは苦手だけど。。

意外とめんどい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($...

USBカメラで撮影して、WebSocketで転送する

シナリオとして、USBカメラで静止画を連続撮影してそれを送り付けるように考えたときに、どのように実行されるかを考えます。 まぁ、この点、さすがにPHPで作成するわけではないので、 WindowsとRaspberyyPiと作り方は大分違うことになります。 Windowsでは、OpenCVを使うとラクなので、 ここらへん  あたりを参考に、画面表示なんかを取り除いてプログラムを作成します。 作成したのが、 これです。 そして1枚撮影して転送する場合と、 例えば1秒毎に撮影して転送しつづける場合を考えます。 今回は、プログラムを作りこむことに主眼を置いてないので、 撮影するプログラムと転送するプログラムを別に考えます。 そうすると、以下の通り、 1枚のときはシーケンシャルに処理を2つつづける 転送しつづける場合には、処理を並列に処理する。 な感じで考えてみます。 つづく