神棍節獻禮之——URAL1111 Squares(幾何)

來源:互聯網
上載者:User

題意是有 N 個正方形,每個正方形給出一條對角線的兩個頂點座標,然後判斷他們到指定點的距離的大小關係,按距離從近到遠,升序輸出這些正方形的編號。

注意,正方形的邊可能不和座標軸平行,還有如果指定點在正方形內部的話,距離認為是 0 。

方法很顯然的,根據對角線的兩點座標計算出剩下的兩個點,然後計算指定點到這個正方形(凸四邊形)的距離,也就是計算點到線段的距離,並取最小值。

代碼:

#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;const int N = 51;const double MAX = 1e8;const double eps = 1e-14;struct point{double x,y;};struct square{point p1,p2;int id;double dist;}s[N];int dcmp(double x){    if (x < -eps) return -1; else return x > eps;}int cmp(square a,square b){if(dcmp(a.dist-b.dist)==0)return a.id < b.id;return dcmp(a.dist - b.dist)<0;}double min(double a,double b){if(dcmp(a-b)==1)return b;return a;}double max(double a,double b){if(dcmp(a-b)==1)return a;return b;}double dis(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double crossProduct(point a,point b,point c){//向量 ac 在 ab 的方向 return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y);}int pin_convexh(point a,point p[]){//判斷點a是否在凸多邊形內int n=4;p[n] = p[0]; p[n+1] = p[1];for(int i=0; i<n; i++)if( dcmp(crossProduct(p[i],p[i+1],a)*crossProduct(p[i+1],p[i+2],a))==-1 )return 0;return 1;}double jobs(point p,point l1,point l2){//點 p 到線段 l1l2 的最小距離point t = p;t.x += l1.y - l2.y;  t.y += l2.x - l1.x;if( dcmp( crossProduct(l1,t,p)*crossProduct(l2,t,p) ) != -1 ) //包括點和線段共線 return dcmp(dis(p,l1)-dis(p,l2))==-1 ? dis(p,l1) : dis(p,l2);return fabs( crossProduct(p,l1,l2) )/dis(l1,l2);}point Whirl(double cosl, double sinl, point a, point b){//底邊線段ab 繞a逆時針旋轉角度A,b->b1,sinl是sinA的值   b.x -= a.x; b.y -= a.y;    point c;    c.x = b.x * cosl - b.y * sinl + a.x;    c.y = b.x * sinl + b.y * cosl + a.y;    return c;}double fun(point cent,square ss){point p[10],mid;mid.x=(ss.p1.x+ss.p2.x)/2.0; mid.y=(ss.p1.y+ss.p2.y)/2.0;p[0]=ss.p1;p[1]=Whirl(0,1,mid,p[0]);p[2]=ss.p2;p[3]=Whirl(0,1,mid,p[2]);if(pin_convexh(cent,p)==1)return 0.0;else {double min_dist=MAX;for(int i=0;i<4;i++)min_dist=min(jobs(cent,p[i],p[i+1]),min_dist);return min_dist;}}int main(){point cent;int n,i;double a,b,c,d;while(~scanf("%d",&n)){for(i=1;i<=n;i++){scanf("%lf%lf%lf%lf",&s[i].p1.x,&s[i].p1.y,&s[i].p2.x,&s[i].p2.y);s[i].id=i;}scanf("%lf%lf",¢.x,¢.y);for(i=1;i<=n;i++)s[i].dist=fun(cent,s[i]);sort(s+1,s+n+1,cmp);printf("%d",s[1].id);for(i=2;i<=n;i++)printf(" %d",s[i].id);puts("");}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.