□技術メモ - 数学 ※管理人の個人的な技術メモです。 このページの内容は正確であることを保証しておりません。 このページでは主にCADや図形処理等に関連する数学について記述します。 ----------------------------------------------------------- ○公理 定義 定理 公理とは1つの形式体系における議論の前提となるもの。正しいことが自明であることが多い。 定義とは議論におけるルールとして定めたもの。証明の必要なく真である。 公理や定義から求めるのが定理。 -------- ○円周率を取得する ここでは数学ライブラリ等を使用できない場合等に自前でPIを算出する方法について述べています。 円周率を計算する数学的手法も興味深いですが、ここでは扱わないので専門のサイトを御参照ください。 PI = 4 * atan2(1, 1); PI = 4 * atan(1); PI = atan2(-1, 0); PI = acos(-1); -------- ○ベクトルの表記 ベクトル関連の数学記号は本来は正式なものを使いたいのですが、 このページでは以下の記述で代用します。 ・座標、点 座標(X1, Y1, Z1)、点A(X1, Y1, Z1) 座標(X2, Y2, Z2)、点B(X2, Y2, Z2) ・ベクトル 原点から点Aまでのベクトルを以下とする。 vecP = vec(X1, Y1, Z1) 原点から点Bまでのベクトルを以下とする。 vecQ = vec(X2, Y2, Z2) ・2点間のベクトル 点Aから点Bのベクトルを以下とする。 vecR = vec(A→B) = vecQ - vecP = vec(X2-X1, Y2-Y1, Z2-Z1) -------- ○三角形の面積 原点、点P1, 点P2 の3点で構成される三角形について、 vecA = vec(O→P1), vecB = vec(0→P2) とする。 vecA, vecB のなす角をθとするとき、三角形の面積は以下の通り。 面積 = 1/2 * |vecA| * |vecB| * sin(θ) ※sin(θ)が負になる場合は面積は負数になることに注意。 -------- ○sin関数について sin(x)は、xが0に近づく時にxに近づく。(xはラジアン) x≒0の時、sin(x)≒tan(x)≒x 証明: 半径1の円において、 円周の長さが2πの時に、 ラジアンの大きさが2πになるようにラジアンは定義されているので、 x→0の時、 sin(x) ≒ 円弧の長さ/1 = x となる。 -------- ○多角形の面積 上記の三角形の面積の公式から導出できる。 sin(θ)が負の場合は面積も負数になるのがミソ。 多角形の頂点の座標をPiとする。 Oは原点とする。 Piはi=1からnまでで、反時計周りとする。 PiからPi+1の角度をθiとする。 このとき多角形の面積は以下の通り。 多角形の面積 S = 1/2 * Σ(i=1→n) ( |vec(O→Pi)| * |vec(O→Pi+1)| * sin(θi) ) -------- ○ベクトルと行列について ・スカラーが大きさのみを持つのに対して、 ベクトルは大きさだけではなく、方向も持つ量のことを言う。 これを抽象化して、要素を縦、または横に並べたものもベクトルと言う。 ・数や数式を行と列に沿って配したものを、行列という。 複数の縦ベクトルを横に並べたもの、もしくは 複数の横ベクトルを縦に並べたものも行列という。 -------- ○行列と行列式の表記 行列と行列式の記号は本来は正式なものを使いたいのですが、 このページでは以下の記述で代用します。 ・行列(matrix) mat|A B| |C D| ・行列式(determinant) det|A B| |C D| ※あくまでも本来の数学記号は、行列は( ) または[ ]、 行列式は | | で囲まれたものであることに注意して下さい。 -------- 〇内積について vecA と vecB が以下のとき、 vecA = (a1, a2) vecB = (b1, b2) vecA と vecB の内積は vecA・vecB = a1*b1 + a2*b2 = |vecA|*|vecB|*cos(θ) 内積の結果はスカラーになることに注意。 -------- 〇外積について vecP と vecQ が以下のとき、 vecP = (Ax, Ay, Az) vecQ = (Bx, By, Bz) vecP と vecQ の外積は vecP×vecQ |Ex Ey Ez| = det|Ax Ay Az| |Bx By Bz| (Eは単位行列, || で挟まれているのは行列式(下記参照)) = (Ay*Bz - Az*By, Az*Bx - Ax*Bz, Ax*By - Ay*Bx) 外積の結果はベクトルになることに注意。 また、外積のベクトルは2つのベクトルが作る面に垂直となり、 方向は右ネジの方向になる。 このときのベクトルの大きさは以下の通り。 外積のベクトルの大きさ |vecP×vecQ| = |vecP|*|vecQ|*sin(θ) -------- 〇外積について その2 vecP と vecQ が以下のとき、 vecP = (Ax, Ay) vecQ = (Bx, By) vecP と vecQ の外積は vecP×vecQ = |vecP|*|vecQ|*sin(θ) = det|Ax Ay| |Bx By| = Ax*By - Ay*Bx 平面上の場合は外積の結果はスカラーになる。 -------- ○行列式について vecP = vec(Ax, Ay)とする。 vecQ = vec(Bx, By)とする。 このとき、行列式 det|Ax Ay| |Bx By| (det は行列式の記号) = Ax*By - Ay*Bx また、平面上においては Ax*By - Ay*Bx = |vecP|*|vecQ|*sin(θ) が成り立つので、行列式は2つのベクトルのなす角の正負判定に使えることに気が付く。 つまり、上記の行列式が正の場合は、vecPとvecQのなす角は正(つまり左回り)、 負の場合は、vecPとvecQのなす角は負(つまり右回り)となる。 -------- 〇2つの直線の直交判定、平行判定 ・内積の結果は cos(θ)を含むので、 内積 = 0 なら2つの直線は直交と判定できる。 ・平面上において、外積の大きさは sin(θ)を含むので、 外積 = 0、つまり 行列式の値 = 0 なら2つの直線は平行と判定できる。 -------- ※以下、行列について議論を続けます。 http://3rd.geocities.jp/tnoguchislg/math/Math2.txt に続く。