(國服挺住啊q^q)
計算幾何基礎
基本運算
基礎類點積叉積線
直線與線段的表示
直線求交
線段判交
多邊形求多邊形的重心
判定點在多邊形內
求多邊形的面積
常用演算法
凸包半平面交
基礎類struct vec
};vec operator+(const vec &a, const vec &b)
vec operator-(const vec &a, const vec &b)
vec operator*(double s, const vec &a)
vec operator/(const vec &a, double s)
點積
正負:正,夾角小於90° 負,夾角大於90°
double dot(const
vec &x, const
vec &s)
叉積
幾何意義:兩向量所形成的平行四邊形的面積
正負:正,→y在→x左邊 負,右邊
double cross(const
vec &x, const
vec &y)
點積與叉積結合起來,可以判斷兩向量的位置(指如圖)關係
|
|--------------
||
直線與線段的表示
直線:乙個其上的點p,及方向向量→u來表示
線段:1、兩個端點 2、乙個端點,乙個向量(準確指向另一端點)
直線求交
兩個直線(p,→u),(q,→v),可知交點s=p+t*→u。求出t可用等面積法
很直觀吧【滑稽
至於正負問題,討論一下就發現沒問題了。但是要千萬記得順序,可以用圖來輔助記憶
線段判交
跨立實驗
這裡主要運用了叉積判斷左右的性質。我們可以感性的理解到,若線段相交,自己的端點肯定在對方的兩側,不相交則至少有乙個不滿足。
求多邊形的重心
我們需要兩個基礎
1、三角形的重心求法(數學課上學過啦)
2、(∑→v * m0)/m (找乙個點為原點,則多邊形內每乙個點都有乙個向量和質量)
感性理解一下,我們可以通過分治的思想,發現已知圖形兩個部分的重心和質量(面積)→p1、s1和→p2、s2,則→p=(→p1 * s1 + →p2 * s2)/(s1+s2)
因為任意乙個多邊形可以拆分成若干個三角形,所以根據以上兩個基礎就可以進行兩兩合併知道求出重心為止。
判定點在多邊形內
如果乙個點在多邊形內,從這個點拉一條射線出去,必定會穿過邊。然而點不在多邊形內,也有可能穿過邊,但是它必定還會穿出去,所以經過的邊數必為偶數,在內部的必為奇數。
這裡把模型稍微改一下。我們給多邊形的每一條邊乙個方向,統一順時針或逆時針(存的時候就是有方向的啊)。向上+1,向下-1(反之也行)
看**理解一下
bool point_on_line (const point &p, const point &a, const point &b)
bool in_polygon (const point &p, const
vector
&poly)
return counter != 0;
}
畫圖理解一下就記住了,畫圖現推也行
求多邊形的面積
主要利用了叉積的幾何意義及正負
很直觀吧
double area(const
vector
&poly)
return
fabs(rt / 2.0);
}
凸包
凸包的定義:將一堆點包括進去的最小的凸多邊形
求凸包:模擬繩子繞釘子的模型
void get_convex()
int tmp = top;
for(int i = cntp-1; i >= 1; i--)
if(cntp > 1) top--;
}
半平面交
(還在學習中。。。)
計算幾何基礎(學習中)
國服挺住啊q q 計算幾何基礎 基本運算 基礎類點積叉積線 直線與線段的表示 直線求交 線段判交 多邊形求多邊形的重心 判定點在多邊形內 求多邊形的面積 常用演算法 凸包半平面交 基礎類struct vec vec operator const vec a,const vec b vec opera...
計算幾何 幾何基礎
這章早在2017年寒假就在培訓的時候由來自清華的hta老師上過了 但是本蒟蒻那時候並不是懂的太多 所以這週ww老師又上了一遍 大概記錄一下 大概就跟高中必修4的平面向量差不多 有上過的應該都會 a x1,y1 b x2,y2 a b x1x2 y1y2 a b a b cos a,b 運用 若a與b...
計算幾何基礎
1 向量叉積 ab ac 0 ac在ab的 逆時針方向,否則順時針 0 a b c 共線 class point p q 為向量 a,b,c為點 p q x1 y2 x2 y1 p a b q c a 即 x1 x0 y2 y0 x2 x0 y1 y0 計算 ab ac 的叉積 double cor...