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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,点到线段距离,点在多边形内

發布時間:2024/10/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,点到线段距离,点在多边形内 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ACM博客_kuangbin

POJ 1584 A Round Peg in a Ground Hole(判斷凸多邊形,點到線段距離,點在多邊形內)

A Round Peg in a Ground Hole

Time Limit:?1000MS?Memory Limit:?10000K
Total Submissions:?4438?Accepted:?1362

Description

The DIY Furniture company specializes in assemble-it-yourself furniture kits. Typically, the pieces of wood are attached to one another using a wooden peg that fits into pre-cut holes in each piece to be attached. The pegs have a circular cross-section and so are intended to fit inside a round hole.?
A recent factory run of computer desks were flawed when an automatic grinding machine was mis-programmed. The result is an irregularly shaped hole in one piece that, instead of the expected circular shape, is actually an irregular polygon. You need to figure out whether the desks need to be scrapped or if they can be salvaged by filling a part of the hole with a mixture of wood shavings and glue.?
There are two concerns. First, if the hole contains any protrusions (i.e., if there exist any two interior points in the hole that, if connected by a line segment, that segment would cross one or more edges of the hole), then the filled-in-hole would not be structurally sound enough to support the peg under normal stress as the furniture is used. Second, assuming the hole is appropriately shaped, it must be big enough to allow insertion of the peg. Since the hole in this piece of wood must match up with a corresponding hole in other pieces, the precise location where the peg must fit is known.?
Write a program to accept descriptions of pegs and polygonal holes and determine if the hole is ill-formed and, if not, whether the peg will fit at the desired location. Each hole is described as a polygon with vertices (x1, y1), (x2, y2), . . . , (xn, yn). The edges of the polygon are (xi, yi) to (xi+1, yi+1) for i = 1 . . . n ? 1 and (xn, yn) to (x1, y1).

Input

Input consists of a series of piece descriptions. Each piece description consists of the following data:?
Line 1 < nVertices > < pegRadius > < pegX > < pegY >?
number of vertices in polygon, n (integer)?
radius of peg (real)?
X and Y position of peg (real)?
n Lines < vertexX > < vertexY >?
On a line for each vertex, listed in order, the X and Y position of vertex The end of input is indicated by a number of polygon vertices less than 3.

Output

For each piece description, print a single line containing the string:?
HOLE IS ILL-FORMED if the hole contains protrusions?
PEG WILL FIT if the hole contains no protrusions and the peg fits in the hole at the indicated position?
PEG WILL NOT FIT if the hole contains no protrusions but the peg will not fit in the hole at the indicated position

Sample Input

5 1.5 1.5 2.0 1.0 1.0 2.0 2.0 1.75 2.0 1.0 3.0 0.0 2.0 5 1.5 1.5 2.0 1.0 1.0 2.0 2.0 1.75 2.5 1.0 3.0 0.0 2.0 1

Sample Output

HOLE IS ILL-FORMED PEG WILL NOT FIT

Source

Mid-Atlantic 2003

題意:

給出N個點,一個圓的半徑和圓心坐標:

  • 如果N個點構成的多邊形不是凸多邊形,輸出:HOLE IS ILL-FORMED
  • 如果N個點構成凸多邊形,圓在凸多邊形內,輸出:PEG WILL FIT
  • 如果N個點構成凸多邊形,圓不在凸多邊內,輸出:PEG WILL NOT FIT
  • 分析:

    首先是判斷給出了多邊形是不是凸多邊形。然后判斷圓包含在凸多邊形中。

    一定要保證圓心在凸多邊形里面,然后判斷圓心到每條線段的距離要大于等于半徑。

    #include <stdio.h> #include <math.h> #include <algorithm> #include <string.h> #include <math.h> using namespace std;const double eps = 1e-8; int sgn(double x) {if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1; } struct Point {double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}Point operator -(const Point &b)const{return Point(x - b.x,y - b.y);}//叉積double operator ^(const Point &b)const{return x*b.y - y*b.x;}//點積double operator *(const Point &b)const{return x*b.x + y*b.y;}void input(){scanf("%lf%lf",&x,&y);} }; struct Line {Point s,e;Line(){}Line(Point _s,Point _e){s = _s;e = _e;}//兩直線相交求交點//第一個值為0表示直線重合,為1表示平行,為0表示相交,為2是相交//只有第一個值為2時,交點才有意義pair<int,Point> operator &(const Line &b)const{Point res = s;if(sgn((s-e)^(b.s-b.e)) == 0){if(sgn((s-b.e)^(b.s-b.e)) == 0)return make_pair(0,res);//重合else return make_pair(1,res);//平行}double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));res.x += (e.x-s.x)*t;res.y += (e.y-s.y)*t;return make_pair(2,res);} };//*判斷線段相交 bool inter(Line l1,Line l2) {returnmax(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) <= 0 &&sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) <= 0; }//兩點距離 double dist(Point a,Point b) {return sqrt((a-b)*(a-b)); }//判斷凸多邊形,允許共線邊 //點的編號0~n-1,可以是順時針和逆時針 bool isConvex(Point poly[],int n){bool s[3];memset(s,false,sizeof s);for(int i=0;i<n;i++){s[sgn( (poly[(i+1)%n]-poly[i])^(poly[(i+2)%n]-poly[i]) )+1]=true;if(s[0]&&s[2]) return false;}return true; }//點到線段的距離,返回點到線段最近的點 Point NearestPointToLineSeg(Point p,Line L) {Point result;double t=((p-L.s)*(L.e-L.s))/((L.e-L.s)*(L.e-L.s));if(t>=0&&t<=1){result.x=L.s.x+(L.e.x-L.s.x)*t;result.y=L.s.y+(L.e.y-L.s.y)*t;}else{if(dist(p,L.s)<dist(p,L.e))result=L.s;elseresult=L.e;}return result; }//判斷點在線段上 bool OnSeg(Point P,Line L) {returnsgn((L.s-P)^(L.e-P)) == 0 &&sgn((P.x - L.s.x) * (P.x - L.e.x)) <= 0 &&sgn((P.y - L.s.y) * (P.y - L.e.y)) <= 0; }//*判斷點在凸多邊形內 //點形成一個凸包,而且按逆時針排序(如果是順時針把里面的<0改為>0) //點的編號:0~n-1 //返回值: //-1:點在凸多邊形外 //0:點在凸多邊形邊界上 //1:點在凸多邊形內 int inConvexPoly(Point a,Point p[],int n) {for(int i = 0;i < n;i++){if(sgn((p[i]-a)^(p[(i+1)%n]-a)) < 0)return -1;else if(OnSeg(a,Line(p[i],p[(i+1)%n])))return 0;}return 1; }//*判斷點在任意多邊形內 //射線法,poly[]的頂點數要大于等于3,點的編號0~n-1 //返回值 //-1:點在凸多邊形外 //0:點在凸多邊形邊界上 //1:點在凸多邊形內 int inPoly(Point p,Point poly[],int n) {int cnt;Line ray,side;cnt = 0;ray.s = p;ray.e.y = p.y;ray.e.x = -100000000000.0;//-INF,注意取值防止越界for(int i = 0;i < n;i++){side.s = poly[i];side.e = poly[(i+1)%n];if(OnSeg(p,side))return 0;//如果平行軸則不考慮if(sgn(side.s.y - side.e.y) == 0)continue;if(OnSeg(side.s,ray)){if(sgn(side.s.y - side.e.y) > 0)cnt++;}else if(OnSeg(side.e,ray)){if(sgn(side.e.y - side.s.y) > 0)cnt++;}else if(inter(ray,side))cnt++;}if(cnt % 2 == 1)return 1;else return -1; }int n; Point o;//圓心 double R;//半徑 Point p[110]; int main() {while(scanf("%d",&n)!=EOF){if(n<3) break;scanf("%lf%lf%lf",&R,&o.x,&o.y);for(int i=0;i<n;i++)p[i].input();if(!isConvex(p,n)){//不是凸多邊形printf("HOLE IS ILL-FORMED\n");continue;}//圓心不在凸多邊形內if(inPoly(o,p,n)<0){printf("PEG WILL NOT FIT\n");continue;}bool flag=false;for(int i=0;i<n;i++){if(sgn(dist(o,NearestPointToLineSeg(o,Line(p[i],p[(i+1)%n]))) -R ) <0 ){flag=true;break;}}if(flag) printf("PEG WILL NOT FIT\n");else printf("PEG WILL FIT\n");}return 0; }

    ?

    總結

    以上是生活随笔為你收集整理的POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,点到线段距离,点在多边形内的全部內容,希望文章能夠幫你解決所遇到的問題。

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