平面幾何基礎

2022-06-26 04:45:14 字數 2357 閱讀 9623

乙個很有資訊量的部落格:

向量p1=(x1, y1), p2 = (x2, y2),內積p1·p2 = x1x2 + y1y2, 外積p1 * p2 = x1y2 - x2y1

先利用外積根據是否有(p1-q)*(p2-q)= 0來判斷點q是否在直線p1-p2上

再利用內積根據是否有(p1-q)*(p2-q)《= 0來判斷點q是否落在p1-p2之間

要求兩直線的交點,通過變數t將直線p1-p2上的點表示為p1+t(p2-p1),交點又在直線q1-q2上,所以有:

(q2-q1)*(p1 + t(p2 - p1) - q1) = 0

求得t = p1 + (q2 - q1) * (q1 - p1) / ((q2 - q1) * (p2 - p1))  (p2 - p1

【注】平行的直線沒有交點, 但平行的線段可能有公共點

double eps = 1e-10;

//考慮誤差的加法運算

double add(double a, double b)

//二維向量結構體

struct p

p(double x, double y): x(x), y(y)

p operator + (p p)

p operator - (p p)

p operator * (double d)

double dot(p p)

double det(p p)

};bool on_seg(p p1, p p2, p q)

//計算直線p1-p2與直線q1-q2的交點

p intersection(p p1, p p2, p q1, p q2)

誤差處理規則

選取合適的足夠小的常數eps 

a < 0 --> a < -eps

a <= 0 --> a < eps

a == 0 --> abs(a) < eps

平面掃瞄

掃瞄線在平面上按給定軌跡移動的同時,不斷根據掃瞄線掃過部分更新資訊,從而得到整體所要求的結果

凸包

包圍原點集的最小凸多邊形的頂點組成的集合,稱為原點集的凸包。不在任意三個點組成的三角形內部,所給點集最外圍的點。

求凸包 基於平面掃瞄法的graham掃瞄演算法

把點集按x座標-->y座標的字典序公升序排序排序後的第乙個和最後乙個點必然是凸包上的頂點,他們之間的部分可以分成上下兩條鏈分別求解。

求下側的鏈時只要從小到大處理排序後的點列,逐步構造凸包

在構造過程中的凸包末尾加上新的頂點後,可能會破壞凸性,此時只要將凹的部分的點從末尾除去就好了。

排序o(nlogn) 剩餘部分處理o(n)

//字典序比較

bool cmp_x(const p &p, const p &q)

//求凸包

vector convex_hull (p *ps, int n)

//構造凸包的上側

for(int i = n - 2, t = k; i >= 0; i--)

qs.resize(k - 1);

return qs;

}

resize(n) 

調整容器的長度大小,使其能容納n個元素。

如果n小於容器的當前的size,則刪除多出來的元素。

否則,新增採用值初始化的元素。

旋轉卡殼法求最遠點

假設最遠點對是p和q, p就是點集中(p-q)方向最遠的點,q是點集中(q-p)方向最遠的點。

按逆時針逐漸改變方向,同時列舉出所有對於某個方向上最遠的點對,稱為對踵點對,那麼最遠點對一定也包含其中。

在逐漸改變方向的過程中,對踵點對只有在方向等於凸包某條邊的法線方向時發生變化,此時點將向凸包上對應的相鄰點移動。

令方向逆時針旋轉一周,那麼對踵點對在凸包上也旋轉了一周,這樣就可以在凸包頂點數的線性時間內求得最遠點對。

//距離的平方

double dists(p p, p q)

void solve()

int i = 0, j = 0;//某個方向上的對踵點對

//求出x軸方向上的對踵點對

for(int k = 0; k < n; k++)

double res = 0;

int si = i, sj = j;

while(i != sj || j != si)

else

}}

平面幾何常用模板

平面幾何常用模板 定義點的類 struct point 定義向量的類 typedef point vector 定義向量的基本運算 vector operator vector a,vector b vector operator vector a,vector b vector operator ...

vijos 1697平面幾何

ac通道 分析 看到這道題目,我最先想到的是bzoj1370,明顯的並查集呀 我們設直線a 為與直線a垂直的直線,而互相平行的直線可以互相合併。若直線a垂直於直線b,則直線a平行於直線b 這樣就可以把垂直轉換為平行。具體實現過程請參考 include include include using na...

UVALive 4650 平面幾何

題意 給出n個點,每個點有點權,要畫兩個圓,每個圓圈中某些點 兩個圓圈中 的點不能相交 兩個圓圈中的點求和再相乘求最大值。有個很關鍵的條件是三點不 共線。相當於一條直線分成兩堆點 兩側 使得兩側和的乘積最大。直接列舉兩個點定下 一條直線,那麼直線上的兩個點有四種情況,同側兩種異側兩種。include...