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

投稿

7月, 2019の投稿を表示しています

平面的な台形変形と奥行的な台形変形(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書くのは苦手だけど。。