方向が定まらないので、かなり私的なメモ書きです。
◎GraphicsPath.PathTypesプロパティ
○value0
・始点として登録
・通過点として登録
・ラインの作成は行わない
○value1
・通過点として登録
・前の通過点と直線作成
○value3(何で2じゃないんだよ・・・)
・スタックとして登録
・スタックが3つ積まれた時点で、通過点計算し曲線作成
・スタックが3つ積まれた時点で、3つ目を通過点として登録
○value0x20
・一文字ずつの処理なので今回無視?
(終了はチェックすべき?)
○value0x80
・始点と座標値が異なる場合は、始点と直線作成
・始点と同座標値の場合はそのまま終了(曲線として終わっている)
・始点をクリア
・通過点クリア
こんな解釈。
コード的にはこんな感じを考えてはいるけど、voidじゃないな・・・。
//cs class FontOutLineFactory { const int StartFg = 0x0; const int LineFg = 0x1; const int CurveFg = 0x2;//2バイト目チェック const int TypeMask = 0x7; //const int MarkerFg = 0x20;//今回は一文字づつの処理なので不要 const int EndFg = 0x80; public static void SetGraphicsPath(System.Drawing.Drawing2D.GraphicsPath gp) { var sp = new StatePos(); for(int i = 0; i < gp.PointCount; i++) { if(CheckFg(gp.PathTypes[i], TypeMask, StartFg)) { //始点処理 //始点として登録 //通過点として登録 continue; } if(CheckFg(gp.PathTypes[i], CurveFg)) { //曲線処理 //スタックとして登録 //スタックが3つ積まれた時点で、通過点計算し曲線作成 //スタックが3つ積まれた時点で、3つ目を通過点として登録 } else { //直線処理 //通過点として登録 //前の通過点と直線作成 } if(CheckFg(gp.PathTypes[i], EndFg)) { //終点処理 //始点と座標値が異なる場合は、始点と直線作成 //始点と同座標値の場合はそのまま終了(曲線として終わっている) //始点をクリア //通過点クリア } } } private static bool CheckFg(int v, int fg, int c = int.MaxValue) { c = (c == int.MaxValue) ? fg : c; return (v & fg) == c ? true : false; } }
continueの使用の賛否はあるけど、深いif文が出来るよりましだと解釈。
if文連発も何とかしたいのだけれど、他に思いつかない。
前後の関係が必要だから、Linqじゃ書けないと思うのだが・・・。
"直線(曲線)作成" と記載したが、実際にはこのタイミングでは作成したくない。
連続した直線であれば折れ線を作成した方が、CATIAの処理時間が速い。
連続した曲線であれば単一のスプラインとした方が、曲線同士の接線接続を
維持しやすいし、恐らくCATIAの処理も速いはず。
そうなると、座標値の組み合わせた状態を保持する何かを、作った方が
良いのかなぁ。 悩む。
◎未確認
画像は "MS P明朝" フォントで "木" の一部。
○曲線-曲線
画像の赤丸の払っている部分。 曲線-曲線で折れを表現するには
どうしているのだろう? 非常に短い直線がある? 同一座標値がある?
○直線-曲線
画像の緑丸部分。 直線-曲線のつながりは接線接続しているのかな?
そうなると、接線ベクトルを考慮したスプラインにしなくてはならなくて
面倒。 逆に接線接続の有無の判断はどうしているのだろう?
ん~折ってしまいたい。