二維幾何基礎

2021-08-04 13:54:10 字數 3244 閱讀 7402

模板(from 紫書):

#includeusing namespace std;

typedef long double ld;

const ld eps=1e-10

;const ld pi=acos((ld)(-1.0));

struct point

};typedef point vector;

vector operator + (vector a, vector b)

vector operator - (vector a, vector b)

vector operator * (vector a, ld p)

vector operator / (vector a, ld p)

bool operator < (const point& a, const point &b)

int dcmp(ld x)

bool operator == (const point &a, const point &b)

// vector a

; 的極角是 atan2(a.y,a.x);

ld operator * (vector a, vector b)

ld operator ^ (vector a, vector b)

ld length(vector a)

ld angle(vector a, vector b)

ld area3(point a, point b, point c)

vector rotate(vector a, ld rad)

vector normal(vector a)

//直線(p+tv)和(q+tw)的交點

//呼叫前用求兩條直線有唯一交點,當且僅當v^w!=0 。

point getlineinserction(point p, vector v, point q, vector w)

//求p到直線ab的距離,a和b是直線上的任意兩點。

ld distancetoline(point p, point a, point b)

//求p到線段ab的距離,a和b是線段的端點。

ld distancetosegment(point p, point a, point b)

//求出p在直線ab上的投影

point getlineprojection(point p, point a, point b)

// 判斷線段a1a2與線段b1b2是否相交

bool issegmentproperintersection(point a1, point a2, point b1, point b2)

//判斷點是否在一條線段上

bool onsegment(point p, point a1, point a2)

int main()

例題:

uva 11178 morley定理:

用到了直線旋轉,直線交點和直線夾角

point a,b,c;

point solve(point a, point b, point c)

int main()

return

0;}

la 3263 :一筆畫。

這裡有乙個常用的公式叫做尤拉定理 :

在平面圖(在圖論中,平面圖是可以畫在平面上並且使得不同的邊可以互不交疊的圖。而如果乙個圖無論怎樣都無法畫在平面上,並使得不同的邊互不交疊,那麼這樣的圖不是平面圖,或者稱為非平面圖。)上,v+

f−e=

2 ,其中

v 是頂點數,

f是面數,

e 是邊數。

所以這題求出頂點數和麵數就行了。頂點數分為原有的點和相交生成的點,相交生成的點可以在沿著筆畫的時候判斷是否與之前的邊相交就行了。這部分複雜度是 o(

n2)。

邊數可以列舉每條邊,然後列舉每個點,如果點在邊上,那麼邊數+1。複雜度為 o(

n3) 。

const int n=307;

point p[n],v[n*n];

int main()

--n;

int c=n,e=n;

for(int i=0;ifor(int j=i-2;j>=0;--j)

if(issegmentproperintersection(p[i],p[i+1],p[j],p[j+1]))

v[c++]=getlineintersection(p[i],p[i+1]-p[i],p[j],p[j+1]-p[j]);

sort(v,v+c);

c=unique(v,v+c)-v;

for(int i=0;ifor(int j=0;jif(onsegment(v[j],p[i],p[i+1])) ++e;

printf("case %d: there are %d pieces.\n",kase++,2+e-c);

}return

0;}

uva 11796 :狗的距離。

題意是給定兩條折線,兩條狗分別從起點開始勻速跑,到終點的時間一樣。要求兩條狗的最大距離減去最小距離的差值。

假如狗在兩條線段上跑,假設一條狗靜止不動,另一條狗的相對運動形成一條線段,很容易算出點到線段的距離:

假設a和b是a狗和b狗走的線段。可以看出兩條紅線是起始ab相對位置向量和終點ab相對位置向量。後面那條紅線可以用子線描述,所以b的相對運動路徑為sb->sb+b-a。因此就能算了。

然後擴充套件到這題。將每次到拐點前的線段畫出來,然後用上述過程算就行了。上圖顏色相同的部分是要一起計算的段。複雜度是 o(

2n) 。

int t,n,m;

point pa[57],pb[57];

ld max,min;

point read_point()

void update(point p, point a, point b)

int main()

printf("case %d: %d\n",kase++,(int)lround(max-min));

}return

0;}

二維幾何模板 二維幾何基礎

二維幾何模板 include include include include include include include include include using namespace std 二維幾何基礎 struct point typedef point vector const doub...

二維幾何基礎

在幾何中,向量是乙個炒雞重要的東西,像空氣對於人,水對於魚 qaq 在這裡就不詳細介紹向量了,大家在高中數學中會學到,數學毒瘤,貌似資訊也是哈哈哈 下面是他們的常用定義 struct point 建構函式,方便 編寫 typedef point vector 從程式實現上,vector只是point...

二維幾何 圓 球

圓是任意一點擁有唯一的圓心角。所以在定義圓的時候,可以加乙個圓心角求座標的函式。首先是輔助巨集 const double eps 1e 10 const double pi acos 1 const double two pi 2 pi const int maxn 100 5 const int ...