AIZU OJ 2308 基礎計算幾何學習

2021-09-30 14:04:37 字數 1234 閱讀 1953

傳送門:aoj 2308、

題意:平面上有n個障礙物,給出障礙物的左下角和右上角(矩形),現在要從原點以初速度v向任意角度發射乙隻鳥,射出的鳥將呈拋物線飛出,直到撞到障礙物為止,鳥在飛行的過程中可以下乙個蛋,蛋將豎直下落,直到撞到障礙物為止,問能不能擊中(x,y)位置的豬。

思路:大白例題,主要體現的是計算幾何解題過程中用到的極限轉化思想,我們列舉角度時只需要列舉經過障礙物的左上角或者右上角的曲線就行了,任意解都能通過慢慢減小初射角度轉化成這種極限情況的解。

像這樣在幾何問題中,當可行解可以取一段連續的值時,很多時候只要考慮邊界的極限情況就能夠順利解決問題了。

**:

#includeusing namespace std;

const double eps = 1e-10;

const double g = 9.8;

const int maxn = 55;

double l[maxn],r[maxn],b[maxn],t[maxn];

double n,v,x,y;

// 計算以vy的速度豎直向上射出t秒後的位置

double calc(double vy, double t)

// a相對於l和r的位置

int cmp(double l, double r, double a)// 注意判斷大小的時候的誤差處理

// 判斷當射出路徑經過點(qx,qy)時,卵是否能擊中豬

//設初速度在x方向和y方向的分量為vx和vy,設通過(qx,qy)的時間為t

//求解聯立方程序vx^2 + vy^2 = v^2 , vx * t = qx, vy * t - g * t^2 * 1/2 = qy

bool check(double qx, double qy)

if(flag) return 1;

}return 0;

}int main()

{ cin >> n >> v >> x >> y;

for(int i=0;i> l[i] >> b[i] >> r[i] >> t[i], r[i] = min(r[i], x);//預處理,截掉豬以右的障礙物

bool flag = check(x, y);//直接撞上豬的情況

for(int i=0;i

計算幾何學 3

點的內包 判斷點是否在多邊形內。輸入 乙個多邊形點的序列 問題數各個問題的點的資訊 輸出 2代表在圈內 1代表在圈上 0代表在圈外 只要檢查一p為端點且平行於x的射線與多邊形g的邊的相交次數,我們就能判斷給定的點p是否內包與多邊形g。對於構成多邊形各邊的線段設如果a和b外積大小為0且內積小於等於0,...

計算幾何學簡單的模板

一些定義 include include include include include using namespace std define maxn 1200 define eps 1e 8 struct point po maxn struct line typedef point vecto...

演算法導論之計算幾何學

所屬專欄 演算法導論專欄 計算幾何學是電腦科學的乙個分支,專門研究集合問題的解決的演算法。計算幾何學的問題一般輸入關於一組集合物件的描述,如一組點 一組線段 輸出是對問題的回答,如直線是否相交。三維空間和高維空間很難視覺化,這裡計算幾何學主要基於二維平面,輸入物件用一組點來表示,其中每個pi xi,...