山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他ベクトルによる2D三角形の向きの判定
概要
ベクトルによる2D三角形の向きの判定
ベクトルを使うと三角形の1辺に対して三角形が左右のどちらにあるか判定できます。
単純に2点間のx,y座標のそれぞれの距離を計算しているだけである。
計算すると
外積の大きさ=v1.x * v2.y -v1.y * v2.x = 1612.51 * 1586.81 - 650.53 * 140.58 = 2467295.486 2467693.964 ベクトルで表記すると( 0,0,2467693.9638)となります 外積の符号が正なので、v1ベクトルに対してv2は右向きとわかります。 向きの定義は、外積がしめすベクトル方向にねじを締める方向が右向き、緩める方向が左向きとなります。 良くねじが進む向きとは、右ねじで締める方向のことを言っています。 ベクトル方向へ見ると必ず右回りになるのがみそです。 今回は、外積の方向が下から上方向なので、下からv1に対してv2をみると右回りということになります。
今度は、v2を基準にv1ベクトルの位置を求めてみます。
外積=v1.x * v2.y -v1.y * v2.x
= 140.58 * 650.53 - 1586.81 * 1612.51
= -2467295.486
ベクトルで表記すると( 0,0,-2467295.4857)となります 外積のベクトルは、値が負であることから上から下に向いていることになり、v2に対してv1は 外積の符号が負なので、下から見るとv2ベクトルに対してv1は左側とわかります。 ちなみに外積の値が0の場合、v1とv2ベクトルは重なっています。
左右の判断は、視点の方向(例えば、左手座標系と右手座標系の違い)により変わります。
例えばDirect Xは左手座標なのでZ軸の正方向が画面の奥となります。
OpenGLはZ軸方向が逆になっています。
PDF版
ベクトルを使うと三角形の1辺に対して三角形が左右のどちらにあるか判定できます。
ベクトル
二次元のベクトルは、簡単に言うと方向と長さをxとyの長さで表現したものです。 上図のp3を原点にしてp3・p2とp3・p1の方向と長さをベクトルで表すと下記のとおりとなる。p2x | p3x | p2x-p3x | p2y | p3y | p2y-p3y | |
---|---|---|---|---|---|---|
p3・p2 | 1159 | -453.51 | 1612.51 | -102.66 | -753.19 | 650.53 |
p1x | p3x | p1x-p3x | p1y | p3y | p1y-p3y | |
---|---|---|---|---|---|---|
p3・p1 | -312.93 | -453.51 | 140.58 | 833.62 | -753.19 | 1586.81 |
三角形の向き
上図のようにたとえばv1ベクトルに対してv2ベクトルが左右のどちらにあるかわかれば三角形の向きがわかります。 ベクトルの外積を使うと簡単にできます。外積
ベクトルの外積とは、下図を例にとるとv2の先端からv1へ垂線を下した時のその垂線の長さにv1の大きさを掛けた値、すなわち平行四辺形の面積なります。 ちなみに、二次ベクトルの外積は、大きさが垂線の長さで向きがZ軸方向となります。したがって次元をもっています。 外積を数式で表すと下式のとおりとなります。二次ベクトルの場合、三次ベクトルとなります。 v3=v1×v2 通常の式では掛けるの意味で「・」や「×」を使いますが、ベクトルに対して「・」は、ベクトルの内積を示すのでまったく別物です。 ベクトルでは「×」をcross積、「・」をドット積と表すこともあります。 大きさのみに注目すると下式でも表現できます。 s = |v1| |v2| sin θ | |はベクトルの大きさを表します。|v1| = √(v1.x^2+v1.y^2)x | y | |
---|---|---|
v1ベクトル | 1612.51 | 650.53 |
v2ベクトル | 140.58 | 1586.81 |
外積の大きさ=v1.x * v2.y -v1.y * v2.x = 1612.51 * 1586.81 - 650.53 * 140.58 = 2467295.486 2467693.964 ベクトルで表記すると( 0,0,2467693.9638)となります 外積の符号が正なので、v1ベクトルに対してv2は右向きとわかります。 向きの定義は、外積がしめすベクトル方向にねじを締める方向が右向き、緩める方向が左向きとなります。 良くねじが進む向きとは、右ねじで締める方向のことを言っています。 ベクトル方向へ見ると必ず右回りになるのがみそです。 今回は、外積の方向が下から上方向なので、下からv1に対してv2をみると右回りということになります。
今度は、v2を基準にv1ベクトルの位置を求めてみます。
x | y | |
---|---|---|
v2ベクトル | 140.58 | 1586.81 |
v1ベクトル | 1612.51 | 650.53 |
ベクトルで表記すると( 0,0,-2467295.4857)となります 外積のベクトルは、値が負であることから上から下に向いていることになり、v2に対してv1は 外積の符号が負なので、下から見るとv2ベクトルに対してv1は左側とわかります。 ちなみに外積の値が0の場合、v1とv2ベクトルは重なっています。
左右の判断は、視点の方向(例えば、左手座標系と右手座標系の違い)により変わります。
例えばDirect Xは左手座標なのでZ軸の正方向が画面の奥となります。
OpenGLはZ軸方向が逆になっています。
PDF版
Copyright (C) 2012 山本ワールド All Rights Reserved.