読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

GraphicsPathの処理の方向に悩む1

C#

方向が定まらないので、かなり私的なメモ書きです。

◎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の処理も速いはず。
そうなると、座標値の組み合わせた状態を保持する何かを、作った方が
良いのかなぁ。 悩む。

◎未確認

f:id:kandennti:20160202184806p:plain
画像は "MS P明朝" フォントで "木" の一部。
○曲線-曲線
画像の赤丸の払っている部分。 曲線-曲線で折れを表現するには
どうしているのだろう? 非常に短い直線がある? 同一座標値がある?

○直線-曲線
画像の緑丸部分。 直線-曲線のつながりは接線接続しているのかな?
そうなると、接線ベクトルを考慮したスプラインにしなくてはならなくて
面倒。 逆に接線接続の有無の判断はどうしているのだろう?
ん~折ってしまいたい。