グラフィックスで一点鎖線を自力で表示させるのは結構大変ではないけど、めんどい。 まず、線を分解して、線分の集まりにする。 また曲線は直線置換することを前提としとく。 別に、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 += ...
ということで前回のつづきですが、 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 = ...