![見出し画像](https://assets.st-note.com/production/uploads/images/164881416/rectangle_large_type_2_6d48dcc43ba5dd6dfac20ec2182e8fd5.jpeg?width=1200)
高校数学10分プログラミング(数学B編 2.空間のベクトル)10日目「直線の方程式を考える」
マガジンリスト > 数学B編 2.空間のベクトル > 10日目 課題
おはようございます。
本日は、高校数学10分プログラミング(数学B編 2.空間のベクトル)の10日目です。
本日の課題は、直線の方程式を用いて直線を描くプログラムを作成することです。
空間における直線の方程式
$${\vec{d}=(l,m,n) \neq \vec{0}}$$、直線上の任意の点を$${\mathrm{P}(x,y,z)}$$、また$${\mathrm{A}(x_1,y_1,z_1)}$$、$${\mathrm{B}(x_2,y_2,z_2)}$$とします。
① 点$${\mathrm{A}}$$を通り、$${\vec{d}}$$に平行な直線($${\overrightarrow{\mathrm{OP}}=\vec{p}, \overrightarrow{\mathrm{OA}}=\vec{a}}$$とします。)
$$
\begin{array}{lll}
\vec{p}=\vec{a}+t\vec{d} & \Leftrightarrow & x=x_1+lt, y=y_1+mt, z=z_1+nt & \mathrm{(成分表示)} \\ \\
& \Leftrightarrow & lmn \neq 0 \mathrm{のとき} & \\ \\
& & \frac{x-x_1}{l}=\frac{y-y_1}{m}=\frac{z-z_1}{n}(=t) & \mathrm{(} t \mathrm{を消去)}
\end{array}
$$
② 2点$${\mathrm{A,B}}$$を通る直線($${\overrightarrow{\mathrm{OP}}=\vec{p}, \overrightarrow{\mathrm{OA}}=\vec{a}, \overrightarrow{\mathrm{OB}}=\vec{b}}$$とします。)
$$
\vec{p}=\vec{a}+t(\vec{b}-\vec{a})=(1-t)\vec{a}+t\vec{b}
$$
課題
次の点$${\mathrm{A}}$$を通り、$${\vec{d}}$$に平行な直線の方程式を媒介変数$${t}$$を用いて表し、その直線を空間上に描くプログラムを作成してください。
(1) $${\mathrm{A}(1,1,-1), \ \vec{d}=(2,3,1) }$$
(2) $${\mathrm{A}(3,2,1), \ \vec{d}=(0,2,1) }$$
ヒント
直線の方程式による直線の描き方
直線の方程式に基づいて直線を描く方法はいくつかありますが、今回は、媒介変数$${t}$$の範囲を$${−5 \leq t \leq 5}$$として、この$${t}$$の範囲での直線上の両端の点を求めて、これらの2点を結ぶことで直線を描くことにします。
また、プログラムの中での直線の方程式は、上記で求めた成分表示ではなく、$${\vec{p} = \vec{a}+t \vec{d}}$$のようなベクトルの形で利用します。まとめると、$${t_m=-5, \ t_p = 5}$$として、$${\vec{p}_m = \vec{a}+t_m \vec{d}, \ \vec{p}_p = \vec{a}+t_p \vec{d} }$$と直線の両端を表す空間ベクトルを求めて、これらの2点を結ぶ線分を描きます。
プログラム
今回の課題の直線の方程式を用いて直線を描くプログラムをスケッチ「drawLines」として準備しました。以下の zip ファイルをダウンロードして展開または解凍してご利用ください。
展開または解凍して得られるスケッチ「drawLines」の中のpdeファイル「drawLines.pde」をダブルクリックしてスケッチ「drawLines」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawLines」タブを選択すると、そのテキストエリアに以下のソースコードが書かれています。
// 直線を描く
float range; // 座標系での表示範囲-range≦x,y.z≦range
float res; // 座標系のサイズをキャンバスのサイズに変換するパラメータ
float angle = 0.0;
PVector a1, a2; // 問題(1)(2)で直線が通る点Aの座標
PVector d1, d2; // 問題(1)(2)の方向ベクトル
void setup(){
size(400, 400, P3D);
noFill();
ortho();
range = 10.0;
res = width / 2.0 / range;
// 課題(1)の点Aの座標と方向ベクトルn
a1 = new PVector(1.0, 1.0, -1.0);
d1 = new PVector(2.0, 3.0, 1.0);
// 課題(2)の点Aの座標と方向ベクトルn
a2 = new PVector(3.0, 2.0, 1.0);
d2 = new PVector(0.0, 2.0, 1.0);
}
void draw(){
background(204); // 背景をグレーにする
// 視点を設定する
camera(200.0, -200.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0);
// マウスボタンが押されたときの処理
if(mousePressed){
if( mouseButton == LEFT ){ // 左ボタンがおされたときはz軸時計周りに回転
angle = angle + 1.0;
} else if( mouseButton == RIGHT ){ // 右ボタンがおされたときはz軸反時計周りに回転
angle = angle -1.0;
} else {
}
}
// z軸周りに回転
rotateZ(radians(angle));
// 座標軸の設定
strokeWeight(1);
fill(255,0,0);
stroke(255,0,0);
arrow3D(0.0,0.0,0.0,range * res,0.0,0.0); // x軸(赤色)
fill(0,255,0);
stroke(0,255,0);
arrow3D(0.0,0.0,0.0,0.0,range * res,0.0); // y軸(緑色)
fill(0,0,255);
stroke(0,0,255);
arrow3D(0.0,0.0,0.0,0.0,0.0,range * res); // z軸(青色)
noFill();
stroke(0,0,0);
// 以下に、図形を描いていく
// 媒介変数tの範囲
float m_t = -5.0;
float p_t = 5.0;
// tの範囲での直線上の両端の点を表す座標
PVector m_p, p_p;
// 課題(1)の直線(黄色)
// 点Aをプロットする
strokeWeight(5);
stroke(255,255,0);
point_rhs(a1.copy().mult(res));
// 方向ベクトルを描く
strokeWeight(2);
stroke(255,255,0);
fill(255,255,0);
arrow3D(a1.x*res,a1.y*res,a1.z*res,(d1.x+a1.x)*res,(d1.y+a1.y)*res,(d1.z+a1.z)*res);
// 直線を描画
m_p =
p_p =
strokeWeight(1);
stroke(255,255,0);
line_rhs(m_p,p_p);
// 課題(2)の直線(水色)
// 点Aをプロットする
strokeWeight(5);
stroke(0,255,255);
point_rhs(a2.copy().mult(res));
// 方向ベクトルを描く
strokeWeight(2);
stroke(0,255,255);
fill(0,255,255);
arrow3D(a2.x*res,a2.y*res,a2.z*res,(d2.x+a2.x)*res,(d2.y+a2.y)*res,(d2.z+a2.z)*res);
// 直線を描画
m_p =
p_p =
strokeWeight(1);
stroke(0,255,255);
line_rhs(m_p,p_p);
}
ソースコード1 直線の方程式を用いて直線を描くプログラム(未完成)
このソースコード1の draw 関数内の直線の両端の空間ベクトル$${\vec{p}_m = \vec{a}+t_m \vec{d}, \ \vec{p}_p = \vec{a}+t_p \vec{d} }$$を表す変数 m_p, p_p の式
// 直線を描画
m_p =
p_p =
は、演習問題(1),(2)ともに未完成です。ヒントに沿って各値を記述してプログラムを完成させてください。
それでは、よろしくお願いします。
MK's papa