定義
[]極角傾斜の角度は以下のように表すことができるので、システムファイ極座標、それが直接、直線の傾きとして見なすことができます
計算幾何学は、実際の値と幾何学的な演算処理をシミュレートするコンピュータコードを使用することであるので、あなたは、対応する要素を作成する必要があり、最も基本的な要素がポイントで、ポイント位置は、2次元空間で表現することができます
同じ2次元空間において、記憶方法およびベクターは、点同様の(しかし、実際には非常に異なる意味を)
構造体V
{
ダブルX、Y。
ダブルANG;
二重角度() {//求取极角松 戻りATAN2(Y、X)。 } V(二重X = 0、二重Y = 0 ){//初始化X = X、Y = Y。ANG = ATAN2(Y、X)。}ブール演算子==(constのV&- (Y - B){戻りCMP(X BX)&& CMP ;によって)}}。
名前を変更することにより、いくつかのポイントを作り、ベクトルは、いくつかの使用に一致
VPのtypedef。
定義された操作(計算点と個々のベクトルが一致を有します)
V演算子+(V AとV B){戻りV(AX + BX、AYの+ によって)。}
V演算子- (V AとV B){戻りV(AX - BX、AY - によって); }
V演算子*(V Aを、ダブルB){戻りV(斧* Bを、AY * B)。}
Vオペレータ/(V Aを、ダブルB){戻りV(AX / B、AY / B)。} //叉积 ダブルクロス(V AとV B) { 戻りAX *によって- AY * BX。} //点积ダブルドット(V AとV B){戻りAX * BX + AY * によって; }
高校での幾何学の知見によれば、我々は2つの点が線分で表現することができます知っています
だから、ある定義されたセグメントは、
構造体L
{
P S、T。
ダブルANG;
L(PX = V()、PYは= V())
{
S = X T = Y、ANG =(Y - X).angle(); } }。
それぞれの操作を介して様々なれる要件交差点、パラレル、クロス積、ドット積は完全取得します
(比較的単純な証明しました)
ラインサイズ//の傾きと比較することによって
BOOL演算子<(CONST A&L、L&CONST Bを)
{
R&LTのa.ang =ダブル- b.ang;
IF(!CMP(R&LT)= 0)CMP(R&LT)を返す== - 1 ;
同じ、より高いデフォルト部分の//極角
リターンCMP(クロス(AT - BT、AS - AS))== -1 ; }
//解析ライン並列 BOOLのis_parallel(L AとL Bの) { リターンCMP(クロス(AT - AS、BT - BS))== 0 ;} //は交点を見つけるPの交点(L AとL Bを )+として{リターン(AT -として)*(クロス(BT - BSなどを- BS))/クロス(AT - AS、BT - BS);}
決定された表面は、複数のセグメント又は決定の複数の点を有していてもよいです
多角形の面積[求めます]
:クロス積は、で表すことができるされている平行四辺形領域に2つの線分
次に一つずつは、ポリゴンエッジと領域囲ま原点することによって得られます
、正と負の両方の外積ため
この原理は、多角形の面積によって得ることができます
二重領域(P *はP、int型N)
{
二重のRES = 0 。
P [N + 1] = P [1 ]。
以下のために(INT i = 1; iが<= N; iは++ ) RES + =クロス(Pは[I]、P [I + 1 ])。 リターンファブ(RES / 2 )。}
あり、これらの要素の間でさまざまな操作が決定され、
ポイントは、直線状の辺であります
BOOLのis_right(L A、P Bの)
//直線の右側の点bか否かを判断する(起点と反対のベクトルの方向と線形ベクトル方向に接続されている){
CMP(クロス(AT - AS、B - AS))を返す<0を;
}
探しているポリゴン内の点か
彼らはその後、多角形内の点等しい場合の辺の数を計算することによって、ポイントの両側に等しいです
一方、点が直線上に計算され、直線点を見つけます。
探している二つのベクトルが交差
上記の二つの知識の点を通ります:
見つけることが可能2つのポリゴンが交差