高校数学10分プログラミング(数学B編 2.空間のベクトル)6日目「空間の位置ベクトルを考える1」
マガジンリスト > 数学B編 2.空間のベクトル > 6日目 課題
おはようございます。
本日は、高校数学10分プログラミング(数学B編 2.空間のベクトル)の6日目です。
本日の課題は、空間上の線分の内分点や外分点の位置ベクトルを計算して空間に描くプログラムを作成することです。
空間の位置ベクトルと内分点・外分点
$${\mathrm{A} ( \vec{a} )}$$、$${\mathrm{B} ( \vec{b} )}$$、$${\mathrm{C} ( \vec{c} )}$$とします。
① $${ \overrightarrow{ \mathrm{AB} } = \vec{b} - \vec{a} }$$
② 内分点・外分点
線分$${\mathrm{AB}}$$を$${m:n}$$に内分または外分する点について
$$
\mathrm{内分点} \mathrm{P} ( \vec{p} ) : \vec{p} = \frac{n \vec{a} + m \vec{b}}{m+n} \\
\mathrm{外分点} \mathrm{Q} ( \vec{q} ) : \vec{q} = \frac{-n \vec{a} + m \vec{b}}{m-n} \\
\mathrm{中点} \mathrm{M} ( \vec{m} ) : \vec{m} = \frac{ \vec{a} + \vec{b}}{2}
$$
③ 重心
$$
\mathrm{△ABCの重心} \mathrm{G} ( \vec{g} ) : \vec{g} = \frac{ \vec{a} + \vec{b} + \vec{c} }{3}
$$
課題
4つの点$${ \mathrm{A}(\vec{a}) }$$、$${ \mathrm{B}(\vec{b}) }$$、$${ \mathrm{C}(\vec{c}) }$$、$${ \mathrm{D}(\vec{d}) }$$
$$
\vec{a} = (-1,1,4), \ \vec{b} = (3,1,-1), \ \vec{c} = (-2,2,-2), \ \vec{d} = (-1,-3,0)
$$
を頂点とする四面体を考えます。このとき、次の点の位置ベクトルをキャンバス上に描くプログラムを作成してください。
(1) 線分$${\mathrm{BC}}$$を$${1:2}$$に内分する点$${ \mathrm{P}( \vec{p} ) }$$
(2) 線分$${\mathrm{DP}}$$を$${3:2}$$に外分する点$${ \mathrm{Q}( \vec{q} ) }$$
(3) 線分$${\mathrm{AQ}}$$の中点$${ \mathrm{R}( \vec{r} ) }$$
ヒント
今回の課題は空間の位置ベクトルの内分点・外分点を定義通りにプログラミングしていくだけです。
プログラム
今回の課題の線分の内分点や外分点の位置ベクトルを計算して空間に描くプログラムをスケッチ「drawPositionVector3D」として準備しました。以下の zip ファイルをダウンロードして展開または解凍してご利用ください。
展開または解凍して得られるスケッチ「drawPositionVector3D」の中のpdeファイル「drawPositionVector3D.pde」をダブルクリックしてスケッチ「drawPositionVector3D」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawPositionVector3D」タブを選択すると、そのテキストエリアに以下のソースコードが書かれています。
// 四面体を描く、各位置ベクトルを描く
float range; // 座標系での表示範囲-range≦x,y.z≦range
float res; // 座標系のサイズをキャンバスのサイズに変換するパラメータ
float angle = 0.0;
PVector a, b, c, d; // 四面体の各頂点を表す位置ベクトル
PVector p; // 辺BCを1:2に内分する点の位置ベクトル
PVector q; // 線分DPを3:2に外分する点の位置ベクトル
PVector r; // 線分AQの中点の位置ベクトル
void setup(){
size(400, 400, P3D);
noFill();
ortho();
range = 10.0;
res = width / 2.0 / range;
// 四面体の頂点を表わす4つの空間ベクトル
a = new PVector(-1.0, 1.0, 4.0);
b = new PVector(3.0, 1.0, -1.0);
c = new PVector(-2.0, 2.0, -2.0);
d = new PVector(-1.0, -3.0, 0.0);
// 辺BCを1:2に内分する点の位置ベクトル
float m = 1.0;
float n = 2.0;
p = b.copy().mult(n).add( c.copy().mult(m) ).mult(1.0/(m+n));
// 線分DPを3:2に外分する点の位置ベクトル
m =
n =
q =
// 線分AQの中点の位置ベクトル
m =
n =
r =
println("点Pの位置ベクトル:", p);
println("点Qの位置ベクトル:", q);
println("点Rの位置ベクトル:", r);
}
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));
// 座標軸の設定
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);
// 以下に、図形を描いていく
// 空間ベクトルa,b,c,dを描く
fill(0,0,0);
stroke(0,0,0);
arrow3D(0.0,0.0,0.0, a.x*res,a.y*res,a.z*res);
fill(0,0,0);
stroke(0,0,0);
arrow3D(0.0,0.0,0.0, b.x*res,b.y*res,b.z*res);
fill(0,0,0);
stroke(0,0,0);
arrow3D(0.0,0.0,0.0, c.x*res,c.y*res,c.z*res);
fill(0,0,0);
stroke(0,0,0);
arrow3D(0.0,0.0,0.0, d.x*res,d.y*res,d.z*res);
// 四面体ABCDを描く
//fill(128,128,128);
noFill();
stroke(128,128,128);
triangle_rhs(a.copy().mult(res),b.copy().mult(res),c.copy().mult(res));
triangle_rhs(a.copy().mult(res),c.copy().mult(res),d.copy().mult(res));
triangle_rhs(a.copy().mult(res),d.copy().mult(res),b.copy().mult(res));
triangle_rhs(b.copy().mult(res),c.copy().mult(res),d.copy().mult(res));
// 空間ベクトルpを描く(黄色)
fill(255,255,0);
stroke(255,255,0);
arrow3D(0.0,0.0,0.0, p.x*res,p.y*res,p.z*res);
// 空間ベクトルqを描く(水色)
fill(0,255,255);
stroke(0,255,255);
arrow3D(0.0,0.0,0.0, q.x*res,q.y*res,q.z*res);
// 空間ベクトルrを描く(桃色)
fill(255,0,255);
stroke(255,0,255);
arrow3D(0.0,0.0,0.0, r.x*res,r.y*res,r.z*res);
}
ソースコード1 線分の内分点や外分点の位置ベクトルを計算して空間に描くプログラム(未完成)
このソースコード1の setup 関数内の内分点や外分点の位置ベクトルを計算する部分
// 辺BCを1:2に内分する点の位置ベクトル
float m = 1.0;
float n = 2.0;
p = b.copy().mult(n).add( c.copy().mult(m) ).mult(1.0/(m+n));
// 線分DPを3:2に外分する点の位置ベクトル
m =
n =
q =
// 線分AQの中点の位置ベクトル
m =
n =
r =
は未完成です。課題(1)については例示していますので、それを参考に、課題(2),(3)の式も記述してプログラムを完成させてください。
それでは、よろしくお願いします。
MK's papa