見出し画像

高校数学10分プログラミング(数学B編 2.空間のベクトル)1日目「空間上の図形について考える」

マガジンリスト > 数学B編 2.空間のベクトル > 1日目 課題

おはようございます。

本日は、高校数学10分プログラミング(数学B編 2.空間のベクトル)の1日目です。

本日の課題は、空間上に三角形を描いてその形状を調べるためのプログラムを作成することです。


空間の座標

まず、空間の座標についてまとめておきます。

空間の点の座標

座標 3つの実数の組$${ (a,b,c) }$$で、空間の点の座標が定まる。
② $${x}$$軸上の点$${(a,0,0)}$$ $${y}$$軸上の点$${(0,b,0)}$$ $${z}$$軸上の点$${(0,0,c)}$$
③ $${xy}$$平面上の点$${(a,b,0)}$$ $${yz}$$平面上の点$${(0,b,c)}$$
 $${zx}$$平面上の点$${(a,0,c)}$$

2点間の距離

$${\mathrm{A}(x_1, y_1, z_1)}$$、$${\mathrm{B}(x_2, y_2, z_2)}$$とする。

$$
\mathrm{AB} = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2+(z_2-z_1)^2}, \mathrm{OA}=\sqrt{x_1^2+y_1^2+z_1^2}
$$


課題

空間上に次の3点を頂点とする$${\triangle \mathrm{ABC}}$$を描いてその形状を調べるためのプログラムを作成してください。

$$
\mathrm{A}(1,1,5),  \mathrm{B}(4,3,-1),  \mathrm{C}(-2,1,2)
$$


ヒント

プログラム

今回の課題の$${\triangle \mathrm{ABC}}$$を描いてその形状を調べるためのプログラムをスケッチ「drawTriangle3D」として準備しました。以下の zip ファイルをダウンロードして展開または解凍してご利用ください。

展開または解凍して得られるスケッチ「drawTriangle3D」の中のpdeファイル「drawTriangle3D.pde」をダブルクリックしてスケッチ「drawTriangle3D」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawTriangle3D」タブを選択すると、そのテキストエリアに以下のソースコードが書かれています。

float range; // 座標系での表示範囲-range≦x,y.z≦range
float res; // 座標系のサイズをキャンバスのサイズに変換するパラメータ
float angle = 0.0;

PVector a,b,c; // 空間の座標

void setup(){
  size(400, 400, P3D);
  noFill();
  ortho();
  range = 10.0; 
  res = width / 2.0 / range;
  
  // 点A,B,Cの座標を表わすベクトル
  a = new PVector(1.0, 1.0, 5.0);
  b = 
  c = 

  // △ABCの各辺の長さ
  float AB = sqrt((b.x-a.x)*(b.x-a.x) + (b.y-a.y)*(b.y-a.y) + (b.z-a.z)*(b.z-a.z));
  float BC = 
  float CA = 

  println("AB:", AB);
  println("BC:", BC);
  println("CA:", CA);

}

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);
  // 以下に、図形を描いていく

  // △ABCの頂点をプロットする
  strokeWeight(5);
  stroke(0,0,0);
  point_rhs(a.copy().mult(res));
  point_rhs(b.copy().mult(res));
  point_rhs(c.copy().mult(res));
  
  // △ABCを描く
  strokeWeight(1);
  triangle_rhs(a.copy().mult(res),b.copy().mult(res),c.copy().mult(res));
  
}

ソースコード1 $${\triangle \mathrm{ABC}}$$を描いてその形状を調べるためのプログラム(未完成)

このソースコード1の、点$${\mathrm{A,B,C}}$$の座標を表わすベクトルを与える部分

  // 点A,B,Cの座標を表わすベクトル
  a = new PVector(1.0, 1.0, 5.0);
  b = 
  c = 

や、$${\triangle \mathrm{ABC}}$$の各辺の長さを与える部分

  // △ABCの各辺の長さ
  float AB = sqrt((b.x-a.x)*(b.x-a.x) + (b.y-a.y)*(b.y-a.y) + (b.z-a.z)*(b.z-a.z));
  float BC = 
  float CA = 

は未完成です。

前者については、点$${\mathrm{A}}$$の座標を表す PVector クラスの変数 a の定義を記載していますので、これを参考に、残りの点$${\mathrm{B}}$$と$${\mathrm{C}}$$の座標を表す PVector クラスの変数 b と c の定義も記載してください。
なお、PVector クラスについては、以前の課題『高校数学10分プログラミング(数学B編 1.平面上のベクトル)1日目「ベクトルの演算を考える」解説』で平面ベクトルとして解説しましたが、$${z}$$成分を増やすだけで空間ベクトルとしても利用することができます。

後者については、辺$${\mathrm{AB}}$$の長さを表す変数 AB を上記の2点間の距離で与えた式で表していますので、これを参考に、残りの辺$${\mathrm{BC}}$$と$${\mathrm{CA}}$$の長さを表す変数 BC と CA の式も記載してください。
なお、こちらも平面ベクトルのときと同様に、PVector クラスで定義した空間ベクトルの成分を

a.x
a.y
a.z

として利用することができます。


それでは、よろしくお願いします。

MK's papa

いいなと思ったら応援しよう!