日韩性视频-久久久蜜桃-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 旋转卡壳求不相交凸包最近距离;的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 黄色a级网站| 欧洲毛片 | 亚洲涩综合 | 国产三级免费观看 | av青娱乐 | 美女被猛网站 | 成人小视频免费在线观看 | 热热色av | 成年人黄色免费网站 | 涩久久 | 999久久久免费精品国产 | 欧美视频导航 | 天天躁日日躁狠狠躁av麻豆男男 | 人妻精油按摩bd高清中文字幕 | 日本a在线天堂 | 香蕉视频亚洲一级 | 亚洲国产麻豆 | 九九视频在线 | 国产精品一区二区三区高潮 | 中文字幕有码在线播放 | 亚洲欲色 | 91成人免费 | 日韩在线免费播放 | 天堂久久精品忘忧草 | 毛片88| 丁香婷婷深情五月亚洲 | 国产一在线观看 | 成人免费无码av | 亚洲第一福利视频 | 亚洲淫 | 国产素人在线观看 | 国产精品一区二区三区免费看 | 91成人综合 | 亚洲春色在线观看 | 视频久久 | 亚洲欧洲免费 | 国产精品久久久久久久专区 | 精品视频一区二区三区 | 中文字幕亚洲成人 | 黄色91免费版 | 男女视频在线观看免费 | 免费一区二区三区视频在线 | 国产精品久久久久久久 | 久久aⅴ乱码一区二区三区 亚洲成人18 | 毛片aa| 成人mv | 欧美成人影院 | 久久免费资源 | 久久久艹 | 极品少妇在线观看 | 美女插插 | 久久久久久亚洲av毛片大全 | 天天躁日日躁狠狠躁 | 国产女人18毛片水18精 | 男生和女生靠逼视频 | 日本亲近相奷中文字幕 | 国产一区二区免费电影 | 久热这里只有精品在线 | 欧美一区二区三区在线观看 | 亚洲二区在线播放视频 | 国产成人精品在线观看 | 亚洲制服无码 | jizz色| 亚洲女人被黑人巨大进入 | 久久精品女人毛片国产 | 久久影视一区二区 | 国产美女自拍视频 | 国产一区二区欧美日韩 | 夜夜骚网站 | 潘金莲黄色一级片 | 草草色| 国产精品正在播放 | 亚洲第一页在线 | 欧美在线视频一区 | 手机av在线播放 | 亚洲狼人伊人 | 久久久久国产一区二区三区潘金莲 | 成人日韩视频 | 国产午夜无码精品免费看奶水 | 99精品欧美一区二区三区 | 色呦呦免费观看 | 婷婷激情视频 | 精品国产日本 | 青青草操 | 久草福利在线观看 | 国产二级毛片 | 天堂网av手机版 | 人人艹人人爽 | 牛牛热在线视频 | 国产成人亚洲一区二区 | 午夜影院一区二区三区 | 天天激情| 五月婷婷亚洲综合 | a级在线观看视频 | 少妇被躁爽到高潮无码人狍大战 | 国产午夜精品久久久久久久 | 狐狸视频污 | 日韩第一页在线观看 | 一本大道熟女人妻中文字幕在线 |