C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

CATIAでベジェ曲線(2次・3次)を描きたい

こちらの続きです。
CATIAで2次ベジエ曲線を描きたい2 - C#ATIA

前回の結果がイマイチ過ぎて、無かった事にさえしてしまいたい
ぐらい、モチベーションを失いましたが、最近になりちょっと
わかってきました。

前回の"くたびれた八角形"は、こんな解釈をしていました。
(外周のみで考え ◎の点が始点 ■の点が終点 ×の点は制御点)
f:id:kandennti:20160122173343p:plain
始点-2点目-3点目を利用し、パラメータ0.5の2次ベジェ曲線の
通過点を作成する。 こんな感じで通過点は米印の水色の点。
f:id:kandennti:20160122173351p:plain

次に 2点目-3点目-4点目で同様の処理をする。
f:id:kandennti:20160122173400p:plain
で、こんな感じ
f:id:kandennti:20160122173406p:plain

これを1周分処理する。こんな感じ。
f:id:kandennti:20160122173412p:plain

ここから、始点は通過させその後は、求めた通過点を通り
閉じたスプラインを作成すると、"くたびれた八角形" の
出来上がりです。
f:id:kandennti:20160122173418p:plain

でも、この解釈は大間違いです。

解釈の間違いは2つありました。
まず、通過点の求め方でした。1ヶ所目は始点-2点目-3点目で
通過点求めるのは良いのですが、2ヶ所目は3点目-4点目-5点目
で通過点を求めなければいけなかったようです。
(赤-1点目 オレンジ-2点目)
f:id:kandennti:20160122173423p:plain
つまり2点目以降は、"前の最後の点が最初の点になる" って
ことのようです。(=その点は通過点になる)

そこで、その解釈で再度スプラインを作ろうと思った時に、
もう一つの間違いに気が付きました。
f:id:kandennti:20160122173434p:plain
水色は大まかに描いた円です。先程の解釈を元に考えると
2次ベジェ曲線であれば、始点から3点2点毎に通過点が存在
することになるのですが、明らかに4点3点毎に通過点が
存在しています。 ・・・と言うことは3次ベジェ曲線?

こちらに記載しましたが、
CATIAで2次ベジエ曲線を描きたい1 - C#ATIA
フォント "MS Gothic" は、TrueTypeフォントで、間違いなく
2次ベジェ曲線です。 でも何故?

ソースコードが公開できるレベルでは無かった為、前回記載しません
でしたが、こんな感じです。

//cs
            string str = "○";

            System.Drawing.Drawing2D.GraphicsPath gp =
                new System.Drawing.Drawing2D.GraphicsPath();

            gp.AddString(str, new FontFamily("MS Gothic"),
                            (int)FontStyle.Regular, 150.0F,
                            new Point(3, 3), StringFormat.GenericDefault);

GraphicsPathクラスのAddString関数に文字を突っ込んでいるのですが、
疑わしいのは、ここではないかと。

色々とWeb上で探したのですが、AddString関数を利用したものは
Form等に表示する為、DrawPathにGraphicsPathを放り込んでいる
ものばかりで、AddString関数を利用すると中身がどんな風に
なっているか説明されているサイトが見つかりませんでした。
(確かに、DrawPathが勝手に処理するので考える必要ないです)

確信が持てぬまま、どうしようかと困惑していたらMSDN
GraphicsPath.PathTypesプロパティの Value "3" の所に
サラッと書いてありましたよ、3次元ベジェスプラインって。
GraphicsPath.PathTypes プロパティ (System.Drawing.Drawing2D)
f:id:kandennti:20160122173626p:plain

ここ何度も見たのに気が付かなかった・・・。AddStringメソッド
の所には何も記載されていないし。

推測ですが、AddString関数で文字を取り込むと
TrueTypeフォント等でも、3次ベジェ曲線として
GraphicsPathが作成されるのでは
なかろうか?
と。
(その方が、フォントのタイプで処理を変えなくても良いので好都合)

2つの解釈を改めスプラインを作成してみると、こんな感じ。
(赤い点は求めた通過点)
f:id:kandennti:20160122173638p:plain
かなり円になりました。
大まかな円と重ねると、こんな感じ。
f:id:kandennti:20160122173644p:plain
パラメータ0.5のみなので、この程度であれば十分でしょう。(多分)


モチベーション回復。ファイル間リンクが出来たら再び取り組もう。