日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 3608 旋转卡壳求不相交凸包最近距离;

發布時間:2025/3/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 3608 旋转卡壳求不相交凸包最近距离; 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://poj.org/problem?id=3608

#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<queue> using namespace std; const int maxn = 10500; const int maxe = 100000; const int INF = 0x3f3f3f; const double eps = 1e-8; const double PI = acos(-1.0);struct Point{double x,y;Point(double x=0, double y=0) : x(x),y(y){ } //構造函數 }; typedef Point Vector;Vector operator + (Vector A , Vector B){return Vector(A.x+B.x,A.y+B.y);} Vector operator - (Vector A , Vector B){return Vector(A.x-B.x,A.y-B.y);} Vector operator * (Vector A , double p){return Vector(A.x*p,A.y*p);} Vector operator / (Vector A , double p){return Vector(A.x/p,A.y/p);}bool operator < (const Point& a,const Point& b){return a.x < b.x ||( a.x == b.x && a.y < b.y); }int dcmp(double x){if(fabs(x) < eps) return 0;else return x < 0 ? -1 : 1; } bool operator == (const Point& a, const Point& b){return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0; }///向量(x,y)的極角用atan2(y,x); double Dot(Vector A, Vector B){ return A.x*B.x + A.y*B.y; } double Length(Vector A) { return sqrt(Dot(A,A)); } double Angle(Vector A, Vector B) { return acos(Dot(A,B) / Length(A) / Length(B)); } double Cross(Vector A, Vector B) { return A.x*B.y - A.y * B.x; }Vector Rotate(Vector A, double rad) { return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad)); }///求點P到線段AB的距離,先看Q點在線段外還是內;利用點積就可以, double DistanceToSegment(Point P,Point A,Point B){if(A == B) return Length(P-A);Vector v1 = B - A,v2 = P - A,v3 = P - B;if(dcmp(Dot(v1,v2)) < 0) return Length(v2);else if(dcmp(Dot(v1,v3) > 0)) return Length(v3);else return fabs(Cross(v1,v2))/Length(v1); } ///求線段AB與線段CD的距離; double DistanceBetweenSegment(Point A,Point B,Point C,Point D){return min(min(DistanceToSegment(A,C,D),DistanceToSegment(B,C,D)),min(DistanceToSegment(C,A,B),DistanceToSegment(D,A,B))); }//凸包: /**Andrew算法思路:首先按照先x后y從小到大排序(這個地方沒有采用極角逆序排序,所以要進行兩次掃描),刪除重復的點后得到的序列p1,p2.....,然后把p1和p2放到凸包中。從p3開始,當新的 點在凸包“前進”方向的左邊時繼續,否則依次刪除最近加入凸包的點,直到新點在左邊;**///Goal[]數組模擬棧的使用; int ConvexHull(Point* P,int n,Point* Goal){sort(P,P+n);int m = unique(P,P+n) - P; //對點進行去重;int cnt = 0;for(int i=0;i<m;i++){ //求下凸包;while(cnt>1 && dcmp(Cross(Goal[cnt-1]-Goal[cnt-2],P[i]-Goal[cnt-2])) <= 0) cnt--;Goal[cnt++] = P[i];}int temp = cnt;for(int i=m-2;i>=0;i--){ //逆序求上凸包;while(cnt>temp && dcmp(Cross(Goal[cnt-1]-Goal[cnt-2],P[i]-Goal[cnt-2])) <= 0) cnt--;Goal[cnt++] = P[i];}if(cnt > 1) cnt--; //減一為了去掉首尾重復的;return cnt; }double solve(Point* P1,Point* Q1,int Minid,int Maxid,int N,int M){double temp,ret = 1e5;P1[N] = P1[0]; Q1[M] = Q1[0];for(int i=0;i<N;i++){while(temp = dcmp(Cross(Q1[Maxid]-Q1[Maxid+1],P1[Minid+1]-P1[Minid]))> 0) //這一步最難理解:要理解怎樣才能使Q1[Maxid]Q1[Maxid+1]這條線段最接近線段P1[Minid+1]P1[Minid];Maxid = (Maxid+1)%M; // 先以P1[Minid]為定點,旋轉Q1[Maxid];if(temp < 0) ret = min(ret,DistanceToSegment(Q1[Maxid],P1[Minid],P1[Minid+1]));else ret = min(ret,DistanceBetweenSegment(P1[Minid],P1[Minid+1],Q1[Maxid],Q1[Maxid+1]));\Minid = (Minid + 1)%N; //再旋轉P1[Minid]; }return ret; } Point read_point(){Point A;scanf("%lf %lf",&A.x,&A.y);return A; }/*******************************分割線******************************/ Point P[maxn],Q[maxn]; Point P1[maxn],Q1[maxn]; //利用凸包算法使坐標逆時針化后的存儲; int N,M; int Maxid,Minid;void GetMaxandMin(int& Maxid,int& Minid){Maxid = 0; Minid = 0;for(int i=1;i<N;i++){if(P1[i].y < P1[Minid].y) Minid = i;}for(int i=1;i<M;i++){if(Q1[i].y > Q1[Maxid].y) Maxid = i;} }int main() {//freopen("E:\\acm\\input.txt","r",stdin);while(cin>>N>>M && N+M){for(int i=0;i<N;i++) P[i] = read_point();N = ConvexHull(P,N,P1);for(int i=0;i<M;i++) Q[i] = read_point();M = ConvexHull(Q,M,Q1);GetMaxandMin(Maxid,Minid);double ans = solve(P1,Q1,Minid,Maxid,N,M);printf("%.5f\n",ans);} } View Code

?

轉載于:https://www.cnblogs.com/acmdeweilai/p/3258673.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的poj 3608 旋转卡壳求不相交凸包最近距离;的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: n0659极腔濑亚美莉在线播放播放 | 色婷婷婷婷 | 欧美色图一区二区 | 久久久不卡国产精品一区二区 | 播播成人网| 日韩精品一区二 | 欧美色999 | 手机免费看av | 综合色亚洲 | 亚洲综合在线五月 | 亚洲国产精品久久久久久 | 色哟哟日韩精品 | 亚洲五月六月 | 欧美一级性片 | 91视频亚洲 | 国产十区 | 边添小泬边狠狠躁视频 | 国产欧美精品一区二区三区app | 日韩精品人妻一区二区三区免费 | 国产另类在线 | 色狠狠一区二区 | 911av| 成人免费看类便视频 | 亚洲色图14p | 蜜桃中文字幕 | 岛国午夜视频 | 国产婷婷色综合av蜜臀av | 特黄大片又粗又大又暴 | 天天干,天天操,天天射 | 伊人激情在线 | 日本免费专区 | 欧美色亚洲色 | 干干天天 | 福利视频在线播放 | 色人阁婷婷 | 欧美日韩激情一区 | 亚洲av无码成人精品国产 | 精品国产网 | 抽插丰满内射高潮视频 | 日本在线第一页 | 亚洲黄色在线视频 | 欧美操老女人 | 少妇熟女一区二区 | 免费在线国产 | 欧美一卡二卡三卡 | 精品无码人妻一区二区免费蜜桃 | 网友自拍咪咪爱 | 久久午夜神器 | 18禁裸男晨勃露j毛免费观看 | a免费视频 | 91精品国产综合久久香蕉922 | 欧美极品一区 | 日韩不卡在线播放 | 国产日韩欧美在线观看视频 | 丝袜av网站 | 日本a在线 | 国产av成人一区二区三区 | 制服丝袜av在线 | 黄色网免费 | 尤物在线免费观看 | 婷婷综合精品 | 国产网站无遮挡 | 九九色| 男生裸体视频 | 碧蓝之海动漫在线观看免费高清 | 国产视频福利在线 | 国产小视频免费观看 | 国产一区二区激情视频 | www.久久国产 | 国产精品久久久久久久一区二区 | 一区二区三区xxx | 成人片黄网站色大片免费毛片 | 18成人免费观看视频 | 涩涩视频网址 | 伊人久久久久噜噜噜亚洲熟女综合 | 精品一区二区免费视频 | 国内视频精品 | 自拍偷拍欧美视频 | 九九九九精品九九九九 | 性xxxxx大片免费视频 | 都市激情 亚洲 | 日本变态折磨凌虐bdsm在线 | 少妇熟女一区 | 亚洲免费色视频 | 五月深爱婷婷 | 日本亚洲国产 | 国产91在线观看丝袜 | 天堂精品视频 | 国产区精品在线观看 | 97香蕉超级碰碰久久免费软件 | 欧美不卡 | 国产精品丝袜黑色高跟 | av天天有 | 亚洲av无码专区在线 | www.三级.com | 高潮av在线| 精品亚洲国产成人av制服丝袜 | 日韩一区二区三区免费在线观看 | 狠狠天天 |