うしブログ

うしブログ

趣味で運営する、GeoGebraの専門ブログ。

(作業メモ)StartPoint要検証(2行の場合;テキスト変更時未定義問題)

(要修復)ToggleButton・RollPolygonWithoutSlipping・貯金時計・直感力トレーニング

円を直角で切り取った領域

下図で、Pは、円cの内側の任意の点である。角APBは、常に90度である。AP=BPである。この緑の領域、あなたなら、どうやって作る?

f:id:usiblog:20190420001040g:plain

解説

はじめに

見本アプレットは、こちらからDL可能です。

円と2直線で作られる領域 – GeoGebra

以下に出てくるオブジェクト名(paint1とかoutput1とか)は、この見本アプレットにおける名前と(基本的に)一緒です。

まじめな方法(paint1)

緑の領域をきちんと定義してあげて、領域オブジェクトとして作成する方法です。

前提オブジェクトの作成

f:id:usiblog:20190420004401p:plain

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を含む方

f:id:usiblog:20190420004731p:plain

e : If[IsInRegion[B, RightSide[f] ≤ LeftSide[f]], RightSide[f] ≤ LeftSide[f], RightSide[f] ≥ LeftSide[f]]

 

i:gで分割した半平面のうち、Aを含む方

f:id:usiblog:20190420004838p:plain

i : If[IsInRegion[A, RightSide[g] ≥ LeftSide[g]], RightSide[g] ≥ LeftSide[g], RightSide[g] ≤ LeftSide[g]]

 

a:円cの領域表現

f:id:usiblog:20190420005023p:plain

a : RightSide[c] ≥ LeftSide[c]

 

j:eとiの共通部分

f:id:usiblog:20190420005327p:plain

j : e(x, y) ∧ i(x, y)

 

paint1:aとjの共通部分

f:id:usiblog:20190420005453p:plain

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上の点」をある程度細かく、たくさんとれば、見た目上は円弧に見えるだろう、という、雑な発想。

前提オブジェクトの作成

f:id:usiblog:20190420004401p:plain

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)

f:id:usiblog:20190420010520p:plain

list1 : Sequence[Rotate[A, t Angle[A, A_1, B] / 50, A_1], t, 0, 50]

多角形を作る

f:id:usiblog:20190420010652p:plain

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の外部を白く塗ってしまうことで、余計な部分を隠す方法。

前提オブジェクトの作成

f:id:usiblog:20190420004401p:plain

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]

 多角形の作成

f:id:usiblog:20190420011111p:plain

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の外側部分を隠せる。

f:id:usiblog:20190420011421p:plain

上図では、分かりやすいように、円sの色を灰色にしてある。