円を直角で切り取った領域
下図で、Pは、円cの内側の任意の点である。角APBは、常に90度である。AP=BPである。この緑の領域、あなたなら、どうやって作る?
解説
はじめに
見本アプレットは、こちらからDL可能です。
以下に出てくるオブジェクト名(paint1とかoutput1とか)は、この見本アプレットにおける名前と(基本的に)一緒です。
まじめな方法(paint1)
緑の領域をきちんと定義してあげて、領域オブジェクトとして作成する方法です。
前提オブジェクトの作成
A_1 : (2,2)
c : Circle[A_1, 3]
P : PointIn[c]
A' : Rotate[A_1, 135°, P]
A'_1 : Rotate[A_1, -135°, P]
f : Ray[P, A']
g : Ray[P, A'_1]
A : Intersect[c, f]
B : Intersect[c, g]
各種領域の作成
e:fで分割した半平面のうち、Bを含む方
e : If[IsInRegion[B, RightSide[f] ≤ LeftSide[f]], RightSide[f] ≤ LeftSide[f], RightSide[f] ≥ LeftSide[f]]
i:gで分割した半平面のうち、Aを含む方
i : If[IsInRegion[A, RightSide[g] ≥ LeftSide[g]], RightSide[g] ≥ LeftSide[g], RightSide[g] ≤ LeftSide[g]]
a:円cの領域表現
a : RightSide[c] ≥ LeftSide[c]
j:eとiの共通部分
j : e(x, y) ∧ i(x, y)
paint1:aとjの共通部分
paint1 : a(x, y) ∧ j(x, y)
(参考)paint1を、cとPだけで表した場合の定義式(output1)
(RightSide[c] ≥ LeftSide[c]) ∧ If[IsInRegion[Intersect[c, Ray[P, Rotate[Center[c], -135°, P]]], RightSide[Ray[P, Rotate[Center[c], 135°, P]]] ≤ LeftSide[Ray[P, Rotate[Center[c], 135°, P]]]], RightSide[Ray[P, Rotate[Center[c], 135°, P]]] ≤ LeftSide[Ray[P, Rotate[Center[c], 135°, P]]], RightSide[Ray[P, Rotate[Center[c], 135°, P]]] ≥ LeftSide[Ray[P, Rotate[Center[c], 135°, P]]]] ∧ If[IsInRegion[Intersect[c, Ray[P, Rotate[Center[c], 135°, P]]], RightSide[Ray[P, Rotate[Center[c], -135°, P]]] ≥ LeftSide[Ray[P, Rotate[Center[c], -135°, P]]]], RightSide[Ray[P, Rotate[Center[c], -135°, P]]] ≥ LeftSide[Ray[P, Rotate[Center[c], -135°, P]]], RightSide[Ray[P, Rotate[Center[c], -135°, P]]] ≤ LeftSide[Ray[P, Rotate[Center[c], -135°, P]]]]
雑な方法(paint2)
P→A→弧AB上の点→B→Pという順に、点をつないで、多角形を作成する方法。「弧AB上の点」をある程度細かく、たくさんとれば、見た目上は円弧に見えるだろう、という、雑な発想。
前提オブジェクトの作成
A_1 : (2,2)
c : Circle[A_1, 3]
P : PointIn[c]
A' : Rotate[A_1, 135°, P]
A'_1 : Rotate[A_1, -135°, P]
f : Ray[P, A']
g : Ray[P, A'_1]
A : Intersect[c, f]
B : Intersect[c, g]
弧AB上の点を細かくとる(list1)
list1 : Sequence[Rotate[A, t Angle[A, A_1, B] / 50, A_1], t, 0, 50]
多角形を作る
paint2 : Polygon[Flatten[{P, A, list1, B, P}]]
(参考)paint2を、cとPだけで表した場合の定義式(output2)
Polygon[Flatten[{P, Intersect[c, Ray[P, Rotate[Center[c], 135°, P]]], Sequence[Rotate[Intersect[c, Ray[P, Rotate[Center[c], 135°, P]]], t Angle[Intersect[c, Ray[P, Rotate[Center[c], 135°, P]]], Center[c], Intersect[c, Ray[P, Rotate[Center[c], -135°, P]]]] / 50, Center[c]], t, 0, 50], Intersect[c, Ray[P, Rotate[Center[c], -135°, P]]], P}]]
その場しのぎの方法(output3)
A,P,Bともう一つの点で正方形を作り、「塗りを反転」機能で、円cの外部を白く塗ってしまうことで、余計な部分を隠す方法。
前提オブジェクトの作成
A_1 : (2,2)
c : Circle[A_1, 3]
P : PointIn[c]
A' : Rotate[A_1, 135°, P]
A'_1 : Rotate[A_1, -135°, P]
f : Ray[P, A']
g : Ray[P, A'_1]
A : Intersect[c, f]
B : Intersect[c, g]
多角形の作成
poly1 : Polygon[P, A, A + B - P, B]
(参考)poly1を、Pとcだけで表した場合の定義式(output3)
Polygon[P, Intersect[c, Ray[P, Rotate[Center[c], 135°, P]]], Intersect[c, Ray[P, Rotate[Center[c], 135°, P]]] + Intersect[c, Ray[P, Rotate[Center[c], -135°, P]]] - P, Intersect[c, Ray[P, Rotate[Center[c], -135°, P]]]]
円cと同じ位置、スタイルの円sを作成
s : CopyFreeObject[c]
円sの色を白、透過率100、プリファレンス→スタイルで塗りを反転。
レイヤーの高さを、poly1 < s < c になるように設定する。
これで、poly1のうち、円cの外側部分を隠せる。
上図では、分かりやすいように、円sの色を灰色にしてある。