一つ分作ってみたんだけど…違うようなきがするネギ…。
Q
いいえ、4つの線分は「z」のような形になります。具体的には、中央の1/3を残して、残りを取り除いた線分の両端に、長さL/√2の線分を描くことによって、「z」の形になります。また、この「z」の形が、次の再帰的なステップで、さらに複雑な形状を生み出すことになります。
Q
すみません、説明不足でした。中央の1/3を残す線分は元の線分の中央にありますが、その方向は元の線分の方向を引き継いでいます。具体的には、元の線分の中点に垂直な方向をとり、その方向から元の線分の方向に向かって線分を引くことになります。次に、その残った部分の両端に長さl/√2の線分を描く際には、その残った部分の線分の方向を引き継いで、それぞれの端点を決定します。このようにして、元の線分の方向を引き継いだ線分を4つ描くことになり、それらは「z」のような形を作ることになります。
Q
もとの線分の中点に垂直な方向を求めるには、まずもとの線分の傾きを求めます。もとの線分の2つの端点の座標から傾きを求めることができます。そして、その傾きに対して、直角になる傾きを求めます。これは、もとの線分の傾きに-1をかけて、その逆数をとることで求めることができます。
求めた直角になる傾きを元に、もとの線分の中点を通り、元の線分の方向に向かって線分を引きます。具体的には、中点を始点とし、傾きを方向ベクトルとして、元の線分の長さの1/3をスカラー倍したベクトルを加えた点を終点とする線分を引くことになります。
Q
最初の直線は水平な線分で、「─」のような形です。二番目の直線は、最初の直線の中点から垂直に上向きに伸びる線分と、その線分の終点から元の方向に向かって伸びる線分の合わせて「T」のような形になります。
Q
はい、そうです。最初の直線と二番目の直線の間の水平な線が最初の線です。そして、その線の上下に長さl/√2の直線が描かれます。
Q
「Z」の斜めの線は、最初の線分と二番目の線分の間の線分になります。具体的には、最初の線分の中点から、二番目の線分の中点に向かって引いた垂線と、二番目の線分の中点から最初の線分の中点に向かって引いた垂線の交点を結んだ線分になります。
Q
はい、最初の線と二番目の線は交差します。具体的には、最初の線は左下から右上に向かう斜めの線分であり、二番目の線は右下から左上に向かう斜めの線分であるため、中央で交差します。そして、最初の線と二番目の線を合わせると十字の形になります。
Q
はい、おっしゃるとおりの手順であっています。
以下に回答をまとめます。
・最初の線と二番目の線の間の角度は、90度です。
・二番目の線と三番目の線の間の角度は、60度です。
・三番目の線と四番目の線の間の角度は、-60度(つまり、60度の反対方向)です。
また、描かれる図形は、「Z」の形になります。
Q
すみません、「Z」は三本の線でした。最初の線と二番目の線の間の角度は90度で、二番目の線と三番目の線の間の角度も90度です。そして、Z字型の図形を描く際に、四本の線が描かれるわけではなく、最初の線、二番目の線、三番目の線の三本の線で構成されます。
Q
すみません、説明が不十分でした。四番目の線は、二番目の線の下端点から、二番目の線と垂直な方向に描かれます。具体的には、二番目の線の下端点から、下に向かって長さl/√2の直線を描き、その直線の下端点から、右に向かって長さL/3の直線を描くことで、四番目の線が完成します。
------------------------------------------------------------------------------------------------------------------------------------------------------
試しに作ったネギけど…。Zが並んでいるだけのグラフックねぎ…。
------------------------------------------------------------------------------------------------------------------------------------------------------
Q
プログラミングでZ曲線を描く場合、曲線の座標を計算して描画する必要があります。以下は、PythonでZ曲線を描画する例です。
import turtle
import math
def draw_z_curve(t, length, depth):
if depth == 0:
t.forward(length)
else:
l = length / math.sqrt(2)
draw_z_curve(t, l, depth-1)
t.left(90)
draw_z_curve(t, l, depth-1)
t.right(90)
draw_z_curve(t, l, depth-1)
t.right(90)
draw_z_curve(t, l, depth-1)
draw_z_curve(t, l, depth-1)
t.left(90)
draw_z_curve(t, l, depth-1)
t.left(90)
draw_z_curve(t, l, depth-1)
t.right(90)
draw_z_curve(t, l, depth-1)
t = turtle.Turtle()
t.speed('fastest')
t.hideturtle()
draw_z_curve(t, 200, 3)
turtle.done()
このプログラムは、Pythonのturtleモジュールを使用しています。depthは再帰の深さを表しており、数が大きいほど細かい曲線が描画されます。ここでは、depth=3でZ曲線を描画しています。
Q
はい、そうですね。再帰的にゴスパー曲線を描く場合、次の線分の始点と終点の座標を引数として再帰関数に渡していく必要があります。
具体的には、最初の線分の始点と終点の座標を引数として再帰関数を呼び出し、その中で二番目の線分、三番目の線分、四番目の線分を計算し、それぞれの始点と終点の座標を再帰関数に渡す、といった処理を繰り返すことになります。
Q
はい、再帰関数に渡す前に座標系を回転する必要があります。具体的には、与えられた線分の中点を原点として、その線分の方向に垂直な軸を中心に回転させます。これにより、回転後の座標系で次の線分を描画できます。
---------------------------------------------------------------------------------------------------------------------------------------------------------
そして、出来上がったグラフィックがこれネギ…。
やはりZがいっぱいいる図にしか見えないネギ…。
---------------------------------------------------------------------------------------------------------------------------------------------------------