家紋: 二つ巴

Last modified: 2019 年 03 月 13 日 09 時

家紋の二つ巴。円を巧みに組みあわせて作られる美しい曲線。右は地抜き紋。

参考書籍等:

主な使用関数: Partcrv, Joincrvs, Reflectdata, Shade, Circledata.

二つ巴 二つ巴(地抜き紋)

Cinderella 2での作図(二つ巴)

KeTCindyのスクリプトを利用したいので、templete1basic.cdyなどを開いて、これを別名に保存します。
円ツールと線分ツールを使って、図のように円AB直線ABを作り、さらに、線分ABよりわずかに小さい直径をもった円Cを作図します。点Cを動かすときに、グリッドに吸着されないようにスナップ36x28(1317bytes)はオフにしたほうがよいでしょう。ずれないように点A点Bは固定(pinning)したほうがいいかもしれません。

基本の形

先程描いた小円上に点Dを取り、点Bの近くに移動させます。直線CDを引き、その上に点Eを取ります。円EDを描いて、円ABと交差しないように2点D,Eの位置を調整します。

円の作図

点Dを通る、直線ABの垂線を引き、円EDとの交点交点ツールを求めます。巴の尾は外円と交わらないのが正しいようです。

巴の尾

円CD円ED点Aについて反転反転ツールして(紫色)、図のように交点交点ツールを求めます。

反転と交点を求める

巴の形が出来上がったので、CindyScript(KeTCindy)を書き込んでいきます。

Circledata("0",[A,B],["Num=600"]);
Circledata("1",[C,A],["nodisp","Num=600"]);
Circledata("2",[E,D],["nodisp","Num=600"]);
Partcrv("1",M,D,"cr1");
Partcrv("2",P,F,"cr2");
Reflectdata("1","part1",[A]);
Reflectdata("2","part2",[A]);

Circledataは反時計回りの円弧のプロットデータを渡すので、Partcrv("1",M,D,"cr1")cr1点Mから点Dまでの部分曲線(ただし、反時計回りにMからDをたどる)のプロットデータpart1を表します。Reflectdata("1","part1",[A])で、点Aに関してpart1を対称移動したプロットデータを描画します。これで素描きは完成です。

CindyScriptの書き込み

cr2点Pから点Dまでの部分曲線をpart3とし、点Aに関して対称移動した曲線はReflectdata("3","part3",[A])です。

Partcrv("3",P,D,"cr2",["nodisp"]);
Reflectdata("3","part3",[A]);

part1part3re1re3でつなげて閉曲線join1を作ります:

Joincrvs("1",["part1","Invert(part3)","re1","Invert(re3)"]);
Shade(["join1"]);

ただし、part3re3は曲線の向きを逆にしないとうまくつながらないので注意します: Invert(part3)
この閉曲線join1で囲まれる領域をShadeで塗りつぶしますと、下図のようになります。

join1領域の塗りつぶし

これを黒地に白丸の中に描きたいので、次のようにスクリプトを書き込みます。順番通り塗りつぶされていくので、Shadeのタイミングがポイントです。

Framedata("1",[T,R],["corner"]);
Shade(["fr1"]);
Shade(["cr0"],["Color=white"]);
Joincrvs("1",["part1","Invert(part3)","re1","Invert(re3)"]);
Shade(["join1"]);

基本の形

これで二つ巴の紋は出来上がりです。

[このページのトップへ]

二つ巴のサンプルファイルとCindyScriptコード

二つ巴のサンプルファイル(.cdy)出力されたPDFファイルのダウンロード
Ketinit();

Addax(0);
Setpen(2);
Circledata("0",[A,B],["Num=600"]);
Circledata("1",[C,A],["nodisp","Num=600"]);
Circledata("2",[E,D],["nodisp","Num=600"]);
Partcrv("1",M,D,"cr1");
Partcrv("2",P,F,"cr2");
Reflectdata("1","part1",[A]);
Reflectdata("2","part2",[A]);

Partcrv("3",P,D,"cr2",["nodisp"]);
Reflectdata("3","part3",[A]);

Framedata("1",[T,R],["corner"]);
Shade(["fr1"]);
Shade(["cr0"],["Color=white"]);
Joincrvs("1",["part1","Invert(part3)","re1","Invert(re3)"]);
Shade(["join1"]);
Windispg();

[このページのトップへ]

Cinderella 2での作図(二つ巴・地抜き紋)

作画した二つ巴を利用して、地抜き紋を作ってゆきます。点E点Dの位置を調整して、巴の尾が外円と交差するようにします。交点ツール交点ツール点Q、点Rを求めます。

巴の尾と交差

わかりやすくするため、対称移動した円を消してます。線分DC上に点Mを取り、円CDより半径の小さい円DMを描きます。

小さくした円を描く

点M点Cに近づけて、円DM円DCよりわずかに小さい円になるようにします。同様に、円EDよりわずかに大きい円ENを描きます。そして、外円との交点を点O、点Pとなりました。

わずかに大きな円を描く

円MD円ED、円EN点Aに関して対称移動反転ツールさせた円を描きます。ちなみに、点Mのラベルは、移動ツールを選択してShift+ドラッグすると動かせます(-> tips | Cinderella2でラベルの位置を変える Shift + ドラッグ)。

対称移動

図のように、円DMとの交点Y,Zを求めます。

交点を求める

交点Y,Z点Aに関して対称移動した点を描く。

交点を対称移動

これで地抜き紋の形ができました。次の図のようにつなげます。

部分曲線をつなげる

スクリプトはこう書きます。

Circledata("0",[A,B],["nodisp","Num=600"]);
Circledata("1",[M,D],["nodisp","Num=600"]);
Circledata("2",[E,D],["nodisp","Num=600"]);
Circledata("3",[E,N],["nodisp","Num=600"]);
Partcrv("0",Q,P0,"cr0",["nodisp"]);
Partcrv("1",Y,D,"cr1",["nodisp"]);
Partcrv("2",D,Q,"cr2",["nodisp"]);
Partcrv("3",X,O,"cr3",["nodisp"]);
//Reflectdata("0","part0",[A],["nodisp"]);
//Reflectdata("1","part1",[A],["nodisp"]);
//Reflectdata("2","part2",[A],["nodisp"]);
Reflectdata("3","part3",[A],["nodisp"]);

//Shade(["cr0"]);
Joincrvs("1",["part0","Invert(re3)","part1","part2"]);

曲線Join1点Aに関して対称移動した曲線を描いて、それぞれをShadeで塗りつぶします。

Reflectdata("join1","join1",[A]);
Shade(["join1","rejoin1"]);

Shadeで塗りつぶし [このページのトップへ]

二つ巴・地抜き紋のサンプルファイルとCindyScriptコード

二つ巴・地抜き紋のサンプルファイル(.cdy)出力されたPDFファイルのダウンロード
Ketinit();

Addax(0);
Setpen(2);
Circledata("0",[A,B],["nodisp","Num=600"]);
Circledata("1",[M,D],["nodisp","Num=600"]);
Circledata("2",[E,D],["nodisp","Num=600"]);
Circledata("3",[E,N],["nodisp","Num=600"]);
Partcrv("0",Q,P0,"cr0",["nodisp"]);
Partcrv("1",Y,D,"cr1",["nodisp"]);
Partcrv("2",D,Q,"cr2",["nodisp"]);
Partcrv("3",X,O,"cr3",["nodisp"]);
//Reflectdata("0","part0",[A],["nodisp"]);
//Reflectdata("1","part1",[A],["nodisp"]);
//Reflectdata("2","part2",[A],["nodisp"]);
Reflectdata("3","part3",[A],["nodisp"]);

//Shade(["cr0"]);
Joincrvs("1",["part0","Invert(re3)","part1","part2"]);
Reflectdata("join1","join1",[A]);
Shade(["join1","rejoin1"]);
//Shade(["join1"],["Color=white"]);
Windispg();

[このページのトップへ]