這是學習《
acm-icpc
程式設計系列
—計算幾何》自己
ac的第乙個計算幾何的問題。題目是比較簡單的,但還是花了我很久的時間。
題目可以抽象成:乙個長方形被
n條不相交的線段分隔成
n+1個區間,給定
m個點的座標,計算出每個區間裡各有多少個點。
需要注意的是:輸入時,分隔長方形的線段已經排序。(這意味著可以用二分查詢)
我的思路很簡單:把區間構造起來,(這裡我把長方形比喻為盒子,中間加入的線段我稱作隔板。)然後,每個點去二分搜尋,找到自己處在的區間就
ok了。最後輸出結果。
這裡面的難點就在於:我們怎麼去判斷乙個點在一條線段的左側還是右側呢?這就要用到向量叉積。叉積的乙個非常重要的性質是通過它的符號判斷兩向量相互之間的順逆時針關係:設向量p
=(x1,y1),q=(x2,y2)
如果p*q>0則p
在q的順時針方向;
如果p*q=0則p
與q共線,可能同向,與可能反向;
如果p*q<0則p
在q的逆時針方向。
(請注意這裡是叉乘)
這道題在幾何上就考了這乙個知識點,如果我們一步一步來,理清關係,其實是很簡單的!
**:
/** poj_2318.cpp
** created on: 規定上面是起點,下面是終點;左面是起點,右面是終點
* author: administrator
*/#include
#include
#define m 5005
struct point;
struct segment;
int bin[m];
segment box[m];//表示盒子
int n,m;
double x1,y1,x2,y2;//表示盒子最外面的邊框
/**點p置於線段s的哪一側:0 左側,1 右側
* */
int isleft(const point &p,const segment &s)
} //檢查這個點是否在盒子裡面
bool inside(point p)
//盒子中加入隔板
void add(const
double &x1,const
double &y1,const
double &x2,const
double &y2, int i)
//查詢玩具對應的格仔:因為已經排序,所以可以用二分查詢
int solve(int left,int right,const point &p)
if(isleft(p,box[mid])==1)else
} int main()
memset(bin,0,(n+1)*sizeof(int));
for(int i=0;iscanf("%lf %lf",&toy.x,&toy.y);
if(inside(toy))
} //print result
for(int i=0;i<=n;i++)
printf("\n");
} return 0; }
ACM計算幾何 叉積應用
目錄 定義性質 應用判斷點與直線的相對位置 判斷線段與直線的位置關係 判斷直線與直線的位置關係 判斷線段與線段的位置關係 判斷多邊形是否是凸包 判斷點是否在凸多邊形內 若 oa x1,y1 o b x2,y 2 定義叉積 oa 如圖是一種簡單情況,叉積表示的面積即最大的矩形面積減去p1 p2t3 所...
演算法筆記 計算幾何之點積叉積的應用
模板 const double eps 1e 10 考慮誤差的加法 double add double a,double b 考慮誤差的與0比較 int dcmp double x struct p p double x,double y x x y y bool operator p p p op...
caioj 計算幾何 面積 計算幾何 叉積
題意 在乙個平面座標系上隨意畫一條有n個點的封閉折線 按畫線的順序給出點的座標 保證封閉折線的任意兩條邊都不相交。最後要計算這條路線包圍的面積。用叉積有關知識解決。重要結論 abs 三點的叉積 2為這三點圍成的三角形的面積。簡要證明 上圖中,黑色的三角形面積為矩形 三個三角形,設數,計算,合併同類項...