家紋: 二つ巴
家紋の二つ巴。円を巧みに組みあわせて作られる美しい曲線。右は地抜き紋。
参考書籍等:
- うた - 森羅万象【デザインあ×NHK1.5ch】https://youtu.be/SSIGiBblgd8
- もん - 巴 【デザインあ×NHK1.5ch】https://youtu.be/QOreO8zBQ04
- 卍の魔力、巴の呪力 / 泡坂妻夫 / 新潮選書
- 家紋の話 ―上絵師が語る紋章の美― / 泡坂妻夫 / 新潮選書
主な使用関数: Partcrv, Joincrvs, Reflectdata, Shade, Circledata.
Cinderella 2での作図(二つ巴)
KeTCindyのスクリプトを利用したいので、templete1basic.cdyなどを開いて、これを別名に保存します。
円ツールと線分ツールを使って、図のように円ABと直線ABを作り、さらに、線分ABよりわずかに小さい直径をもった円Cを作図します。点Cを動かすときに、グリッドに吸着されないようにスナップはオフにしたほうがよいでしょう。ずれないように点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を対称移動したプロットデータを描画します。これで素描きは完成です。
cr2の点Pから点Dまでの部分曲線をpart3とし、点Aに関して対称移動した曲線はReflectdata("3","part3",[A])です。
Partcrv("3",P,D,"cr2",["nodisp"]);
Reflectdata("3","part3",[A]);
part1とpart3、re1、re3でつなげて閉曲線join1を作ります:
Joincrvs("1",["part1","Invert(part3)","re1","Invert(re3)"]);
Shade(["join1"]);
ただし、part3とre3は曲線の向きを逆にしないとうまくつながらないので注意します: Invert(part3)この閉曲線join1で囲まれる領域をShadeで塗りつぶしますと、下図のようになります。
これを黒地に白丸の中に描きたいので、次のようにスクリプトを書き込みます。順番通り塗りつぶされていくので、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"]);
[このページのトップへ]
二つ巴・地抜き紋のサンプルファイルと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();
[このページのトップへ]