グラフィックスで一点鎖線を自力で表示させるのは結構大変ではないけど、めんどい。
まず、線を分解して、線分の集まりにする。
また曲線は直線置換することを前提としとく。
別に、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 += d;
dashL += d;
if(dashL < lineL){
double xx,yy;
getLinePoint(sx,sy,ex,ey,loalDashL,&xx,&yy);
if(w % 2 == 0){
P.type = 1;
}else{
P.type = 0;
}
P.x = xx;
P.y = yy;
pCtenB->setdata(&P);
pCurP = pCtenB->getdata(pCtenB->getCount()-1);
}else{
double delt = dashL - lineL;
loalDashL = delt;
double xx,yy;
if(w % 2 == 0){
P.type = 2;
}else{
P.type = 0;
}
P.x = ex;
P.y = ey;
pCtenB->setdata(&P);
pCurP = pCtenB->getdata(pCtenB->getCount()-1);
p = q;
q = pCtenC->getdata(z%n); z++;
if(z > nn){
bBreak = true;
break;
}
sx = ex;
sy = ey;
ex = q->x;
ey = q->y;
getLinePoint(sx,sy,ex,ey,delt,&xx,&yy);
P.x = xx;
P.y = yy;
if(P.type == 0){
pCurP->x = P.x;
pCurP->y = P.y;
}else{
pCtenB->setdata(&P);
pCurP = pCtenB->getdata(pCtenB->getCount()-1);
}
dx = ex - sx;
dy = ey - sy;
dd = pow(dx * dx + dy * dy, 0.5);
lineL += dd; // 実際の点のTOTAL
if(z > nn){
bBreak = true;
break;
}
}
}
if(bBreak) break;
}
int lastN = pCtenB->getCount()-1;
if(lastN > 0){
if(pCurP->type == 0) pCtenB->deleteData(lastN);
}
で、、できあがったサンプルが以下。
頂点を表示させるとこうなります。

めでたしめでたし。(o^^o)
コメント
コメントを投稿