うしブログ

うしブログ

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

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

円が通過しない領域

問題

f:id:usiblog:20181110052507p:plain

放物線y=x^2上に、点Pをとる。aを実数として、点Pの座標を、(a,a^2)と表すことにする。

また、点A(0,5)をとる。

点Qは、線分APを2:1に内分する点である。

点Rは、線分APを2:1に外分する点である。

点Pが放物線y=x^2上を動くことによって、線分QRを直径とする円(以下、単に「円」という)が通過する領域を図示すると、下図のようになる。

f:id:usiblog:20181110053606g:plain

このとき、円が通過しない領域のうち、点Aを含むもの(下図の赤い領域。以下、この領域を「A-間隙」という)について考える。

f:id:usiblog:20181110054513p:plain

具体的には、以下のことを、GeoGebraで調べてみたい。すなわち、(1)A-間隙の輪郭を、aを媒介変数とする曲線として記述することは可能か、(2)A-間隙の上端・下端のy座標をaで表すとどうなるか、(3)A-間隙の面積はいくらか。

なお、下記の結果は、あくまでGeoGebraによる観察に基づいて得られた結果であり、証明を行ったわけではない点に留意されたい。

準備作業として、 Q、R、円の中心(Cとする)の座標、および円の方程式を、aで表しておく。

f:id:usiblog:20181110055618p:plain

(1)A-間隙の輪郭の媒介変数表示

f:id:usiblog:20181110060805p:plain

(追記)上記②の直線は、放物線y=x^2の、点Pにおける法線と一致することが分かりました。

f:id:usiblog:20181110061628p:plain

(2)A-間隙の上端・下端のy座標

f:id:usiblog:20181110064252p:plain

f:id:usiblog:20181110064333p:plain

f:id:usiblog:20181110065207p:plain

以下のアプレットでは、aの値または点Pの座標を変化させたときの動きを確認することができる。

アプレットのダウンロードは、下記リンクより可能です。

 

ブラウザ上で開く

https://www.geogebra.org/m/cjrxjukk

 

ggbファイルをダウンロード

https://www.geogebra.org/material/download/format/file/id/cdvxxxnt

 

(3)A-間隙の面積

f:id:usiblog:20181110050857p:plain

KaleidoPen

※PC専用です。画面をドラッグすることで、万華鏡のような形を描くことができます。

 

動作例

f:id:usiblog:20181106173047g:plain

 

仕組みの概説

オブジェクト

自由な点A

点Aをy軸について対称移動した点(A')

A' = Reflect[A, y軸]

数値オブジェクトoffX = 0, offY = 0

点Aおよび点A'を、原点を中心に12°刻みで回転移動させたリスト(list1)

list1 = Flatten[{Sequence[Rotate[A, (k 12)°], k, 1, 30], Sequence[Rotate[A', (k 12)°], k, 1, 30]}]

描画

list1の残像によって描画する。

制御

JavaScript を用いて、以下のように制御する。

getOffset 関数:グラフィックスビューにおいて、pointermove イベントが発生したときに、ポインタの座標情報(pointermove.offsetX, pointermove.offsetY)を取得して、点Aを同座標に移動させる。

startDraw 関数:グラフィックスビューにおいて、pointerdown イベントが発生したときに、list1の表示および残像描画をオンにする。

endDraw 関数:pointerup イベントが発生したときに、list1の表示および残像描画をオフにする。

「グローバルJavaスクリプト」に記述したコードは、以下の通りである。

function ggbOnInit() {
  var canvas = document.getElementsByTagName('canvas')[0];
  canvas.addEventListener('pointermove', getOffset);
  canvas.addEventListener('pointerdown', startDraw);
  canvas.addEventListener('pointerup', endDraw);
  ggbApplet.setVisible('list1', false);
  ggbApplet.setTrace('list1', false);
}

function getOffset(e){
  var offX = e.offsetX;
  var offY = e.offsetY;
  ggbApplet.setValue('offX', offX);
  ggbApplet.setValue('offY', offY);
  ggbApplet.evalCommand('SetValue[A,PixelPoint[offX, offY]]');
}

function startDraw(){
  ggbApplet.setVisible('list1', true);
  ggbApplet.setTrace('list1', true);
}

function endDraw(){
  ggbApplet.setVisible('list1', false);
  ggbApplet.setTrace('list1', false);
}
バージョン情報

以下のバージョンで動作確認済みです。

Version: 6.0.509.0-w (04 November 2018)