課題
楕円c、および、c内の異なる2点S,Gがある。下図のように、Sから、Gを通る光線を発射し、cの周で反射させる。下図は、6回目の反射が起こる直前の様子である。
(1)GeoGebraにおいて、n回目の反射が起こる直前における、光線がcにぶつかった点を、リストオブジェクトとして取得したい。当該リストオブジェクトの定義を、c,S,G,n,および各種GeoGebraコマンドを用いて表せ。
(2)GeoGebraにおいて、n回目の反射が起こる直前における、光線の経路を、折れ線オブジェクトとして取得したい。当該折れ線オブジェクトの定義を、c,S,G,n,および各種GeoGebraコマンドを用いて表せ。
解答例
(1)
IterationList[Element[Remove[{Intersect[c, Ray[Reflect[α, Tangent[β, c]], β]]}, {β}], 1], α, β, {G, Element[RemoveUndefined[{Intersect[c, Ray[G, Vector[S, G]]]}], 1]}, n]
(2)
PolyLine[Join[{{S}, IterationList[Element[Remove[{Intersect[c, Ray[Reflect[α, Tangent[β, c]], β]]}, {β}], 1], α, β, {G, Element[RemoveUndefined[{Intersect[c, Ray[G, Vector[S, G]]]}], 1]}, n]}]]
function opticalReflectionInEllipse(ellipseName, reflectionTime) {
ggbApplet.deleteObject('USI00');
ggbApplet.deleteObject('USI01');
ggbApplet.evalCommand('USI01 = PointIn(Dilate(' + ellipseName + ', 0.99999, Center(' + ellipseName + ')))');
ggbApplet.evalCommand('USI00 = PointIn((x - x(USI01))² + (y - y(USI01))² > 0.01)');
ggbApplet.evalCommand('USIVECTOR = Vector(USI00,USI01)');
ggbApplet.evalCommand('refList = IterationList(Element(Remove({Intersect(' + ellipseName + ', Ray(Reflect(α, Tangent(β, ' + ellipseName + ')), β))}, {β}), 1), α, β, {USI01, Element(RemoveUndefined({Intersect(' + ellipseName + ', Ray(USI01, Vector(USI00, USI01)))}), 1)}, ' + reflectionTime + ')');
ggbApplet.evalCommand('refPolyLine = PolyLine(Join({{USI00}, IterationList(Element(Remove({Intersect(' + ellipseName + ', Ray(Reflect(α, Tangent(β, ' + ellipseName + ')), β))}, {β}), 1), α, β, {USI01, Element(RemoveUndefined({Intersect(' + ellipseName + ', Ray(USI01, Vector(USI00, USI01)))}), 1)}, ' + reflectionTime + ')}))');
}
楕円の名前、反射回数を指定するだけで、光線反射を描画できます。
関数使用例
Iteration光線反射 – GeoGebra
楕円光線反射_自動ver – GeoGebra