1. 程式人生 > >計算幾何模板(自己整理)

計算幾何模板(自己整理)

int sgn(double x){return x<-eps?-1:x<eps?0:1;}
struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){
        x=_x;y=_y;
    }
};
struct Seg{
    Point s,e;
    Seg(){}
    Seg(Point _s,Point _e){
        s=_s;e=_e;
    }
    Seg(double a,double b,double c,double d){
        s.x=a;s.y=b;
        e.x=c;e.y=d;
    }
};
double cross(Point a,Point b,Point c){
    return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
double dist(Point a,Point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
/*兩線段交點*/
Point inter(Seg a,Seg b){
    Point p1,p2,p3,p4;
    p1=a.s;p2=a.e;p3=b.s;p4=b.e;
    double a1=p1.y-p2.y;
    double b1=p2.x-p1.x;
    double c1=p1.x*p2.y-p2.x*p1.y;

    double a2=p3.y-p4.y;
    double b2=p4.x-p3.x;
    double c2=p3.x*p4.y-p4.x*p3.y;

    double x=(c2*b1-c1*b2)/(a1*b2-a2*b1);
    double y=(c2*a1-c1*a2)/(a2*b1-a1*b2);

    return Point(x,y);
}
/*線段相交*/
bool jiao(Seg a,Seg b){
    Point p1,p2,p3,p4;
    p1=a.s;p2=a.e;
    p3=b.s;p4=b.e;
    if(min(p1.x,p2.x)<=max(p3.x,p4.x) &&
    min(p3.x,p4.x)<=max(p1.x,p2.x) &&
    min(p1.y,p2.y)<=max(p3.y,p4.y) &&
    min(p3.y,p4.y)<=max(p1.y,p2.y) &&
    sgn(cross(p1,p2,p3))*sgn(cross(p1,p2,p4))<=0 &&
    sgn(cross(p3,p4,p1))*sgn(cross(p3,p4,p2))<=0 ) return true;
    return false;
}
/*凸包graham演算法*/
Point tmp;
bool cmp(const Point &a,const Point &b){
    int ret=sgn(cross(tmp,a,b));
    if(ret==0) return dist(tmp,a)<dist(tmp,b);
    return ret>0;
}
int graham(Point p[],int n,Point convex[]){
    int mi=0;
    for(int i=1;i<n;i++)  if(sgn(p[mi].y-p[i].y)>0 || sgn(p[mi].y-p[i].y)==0  && sgn(p[mi].x-p[i].x)>0) mi=i;
    swap(p[0],p[mi]);
    tmp=p[0];
    sort(p+1,p+n,cmp);
    int top=0;
    convex[top++]=p[0];
    convex[top++]=p[1];
    int k=2;
    while(k<=n){
        while(top>=2 && sgn(cross(convex[top-2],p[k%n],convex[top-1]))>=0) top--;
        convex[top++]=p[k%n];
        k++;
    }
    return top;
}
double pi=acos(-1.0);

相關推薦

計算幾何模板自己整理

int sgn(double x){return x<-eps?-1:x<eps?0:1;} struct Point{ double x,y; Point(){} Point(double _x,double _y){

計算幾何模板點+線段1.0

計算幾何 int cst opera str point col cstring 弧度 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #in

計算幾何模板未完待續

目前基本都是從藍書上摘錄的。 有一部分需要線性代數的知識,但是藍書作者並沒有解釋,個人覺得用數學知識推出來更有助於記憶,死記硬背板子容易忘。以後有機會的話我在這裡寫點註解。 二維基礎操作: 1 struct Point 2 { 3 double x, y; 4 Point(

計算幾何模板白皮書

const double eps=1e-8;//精度 const int INF=0x3f3f3f3f; const double PI=acos(-1.0); inline int dcmp(const double& x) //判斷double等於0或。。

svn理解與編碼規範自己整理

**SVN:**可以看成是一個實現檔案共享管理的軟體,分為伺服器端和客戶端,檔案可以儲存到伺服器端,個人也可以把伺服器端的檔案下載到本地檢視,更新,修改,然後上傳到伺服器端,這樣大家就可以看到最新版的檔案。 一。命名風格 常規的話:包名,專案名全部小寫。 類名採用駝峰命名,首字母大寫。方法名

讀取視訊幀的幾種方法自己整理

1、第一種方法 #include "opencv2/opencv.hpp" using namespace cv; int main(int, char**) { VideoCapture cap(

qt 在linux環境下的搭建 自己整理

想起自己當初剛開始學習Qt的那個苦惱,一開始不知道各個軟體之間的關係和安裝時具體為什麼這麼做,現在就把它總結一下,希望對大家有所幫助。 1. 硬體環境 A. 主機:x86系列PC機。 B. 開發板:博創2410-s。 C. 通訊連線:串列埠和網路。 2. 軟體環境 A. 主

自己的android 專案釋出到jCenter上面去提供給別人整理

參考:https://blog.csdn.net/xuchao_blog/article/details/62893851   註冊Bintray 說到註冊,大家第一時間肯定是想到去官網註冊。但是,現在官網首頁的註冊入口(上面第一張圖)已經變成組織的註冊了,並不是個人註冊。所以

GIS演算法基礎計算幾何基礎

  判斷線段在多邊形內的演算法:   演算法思路: 如果線段與多邊形內交,則線段一定在多邊形外;如果線段和多邊形的每一條邊都不內交,如果有交點,則線段和多邊形的交點一定是線段的端點或者多邊形的頂點,然後只需要判斷交點是否線上段上就可以了 演算法步驟:

GIS演算法基礎計算幾何基礎

地理資料在計算機中表示大致分為兩種,向量資料和柵格資料。 要計算地理資料的空間關係,一般是向量資料之間的比較。例如:點,線,面之間的比較。 如何判斷線段之間是否相交,線段與面的包含關係。點與面的包含關係等等這些空間關係,都用到計算幾何的演算法。   空間關係的判定演算法的內

GIS演算法基礎 計算幾何基礎

最近在學習GIS演算法,在學習過程中,想把一些經典的演算法或者思想記錄下來,分享給大家   計算幾何基礎本來是計算機圖形學的內容,但是GIS在影象處理中是離不開計算機處理的,所以GIS演算法基礎第一個應該是計算幾何基礎。 如何把空間實體的點線面以及他們之間的關係(例如,相交,包

linuxcentos7中安裝mysql,修改密碼,遠端連線,從sqlyog連線一套教程自己整理,筆記

2.開啟MySQL遠端訪問許可權 允許遠端連線 改表法: use mysql; update user set host = '%' where user = 'root'; FLUSH PRIVILEGES; ps:網上還要修改防火牆的方法,我沒成功,

並查集模板&典型例題整理

並查集,並查集是一種樹形結構,又叫“不相交集合”,保持了一組不相交的動態集合,每個集合通過一個代表來識別,代表即集合中的某個成員,通常選擇根做這個代表。 也就是說,並查集是用來處理不相交集合型別問題,如問不相交集合有幾個。給定節點,找到該節點所在集合元素個數,

WebStorm 使用中常用的快捷鍵自己整理,常用的

在使用編輯器webStorm編輯程式碼時,使用一些快捷鍵,能很好的提高我們的開發效率,以下為我整理的平時常用的快捷鍵,(後續會繼續新增) 常用快捷鍵 1、Ctrl + /: 單行註釋 2、Ctrl + Shift + /: 添加註釋文字/塊註釋 3、Ctrl + F: 查詢文字 4、

26、ES中使用mget批量查詢api學習筆記,來自課程資料 + 自己整理

1、批量查詢的好處 就是一條一條的查詢,比如說要查詢100條資料,那麼就要傳送100次網路請求,這個開銷還是很大的,如果批量查詢的話,查詢100條資料,就只要傳送1次網路請求,網路請求的效能開銷縮減100倍。 2、mget的語法 (1)傳統的一條條的查詢的

計算幾何專題計算兩圓相交面積

There are two circles in the plane (shown in the below picture), there is a common area between the

二維計算幾何入門點,直線及簡單練習

精度問題:定義eps比較浮點數大小時需要引入極小值eps,具體多小由題目要求定例如:當eps=0時,0與0.1相等 0與0.9相等向量:既有方向又有大小的量向量的夾角:用<a,b>表示向量a和向量b的夾角表示:1. 點(point) 用(x,y)表示2.線段:可以

一篇文章快速了解 量子計算機 精心整理

難題 表示 學技術 公司 如何實現 lan 文章 區分 核心 好了,下面轉入量子計算機的總結: 有趣的量子理論 量子論的一些基本論點顯得並不“玄乎”,但它的推論顯得很“玄”。我們假設一個“量子”距離也就是最小距離的兩個端點A和B。按照量子論,物體從A不經過A和B中的

迪傑斯特拉/dijkstra 算法模板具體凝視

定義 ostream all popu post 路徑 ret typedef tdi #include <iostream> #include <malloc.h> #include <cstring> #include &l

Powershell計算時間間隔New-TimeSpan

nbsp direct let 時間 times date unicode 計算 nth 在Windows PowerShell裏New-TimeSpan cmdlet提供了一種方法做日期算法。 計算時間間隔: 這個命令告訴你今天的日期與2006年除夕之間的