Basic operation and arc discretization of poj 1418 circle

Source: Internet
Author: User
Tags acos cos sin x2 y2
Viva confetti
Time limit:1000 ms   Memory limit:10000 K
Total submissions:761   Accepted:319

Description

Do you know confetti? They are small discs of colored paper, and people throw them around during parties or festivals. since people throw lots of confetti, they may end up stacked one on another, so there may be hidden ones underneath.

A handful of various sized confetti have been dropped on a table. Given their positions and sizes, can you tell us how much of them you can see?

The following figure represents the disc configuration for the first sample input, where the bottom disc is still visible.

Input

The input is composed of a number of executions of the following form.

N
X1 Y1 r1
X2 Y2 r2
...
Xn yn Rn

The first line in a configuration is the number of discs in the configuration (a positive integer not more than 100), followed by one line descriptions of each disc: Coordinates of its center and radius, expressed as real numbers in decimal notation, with up to 12 digits after the decimal point. the impresponmargin is +/-5x10 ^ (-13 ). that is, it is guaranteed that variations of less than +/-5x10 ^ (-13) on input values do not change which discs are visible. coordinates of all points contained in discs are between-10 and 10.

Confetti are listed in their stacking order, X1 Y1 R1 being the bottom one and xn yn rn the top one. You are observing from the top.

The end of the input is marked by a zero on a single line.

Output

For each configuration you shoshould output the number of visible confetti on a single line.

Sample Input

30 0 0.5-0.9 0 1.000000000010.9 0 1.0000000000150 1 0.51 1 1.000000000010 2 1.00000000001-1 1 1.000000000010 -0.00001 1.0000000000150 1 0.51 1 1.000000000010 2 1.00000000001-1 1 1.000000000010 0 1.0000000000120 0 1.00000010 0 120 0 10.00000001 0 10

Sample output

35422


Given a heap of circles, there are several visible circles.

Ask other people's ideas;

Discretization an arc.
Volt flea king (497446970) 12:49:02 and then calculate the visible arc
SD. Unintentional Liu plug (450978053) 12:49:02 if a circle has an arc that is not covered by the circle above it, it must be visible
SD. Unintentional plug-in (450978053) 12:49:11, but there is another possibility
SD. Unintentional plug-in (450978053) 12:49:35
SD. Unintentional plug-in (450978053) 12:50:34 is actually a circle covered by a visible arc.
SD. Unintentional plug-in (450978053) 12:50:38 is also visible
Rabbit (1337207267) 12:54:20 is not a visible arc that can only cover one circle.
SD. Unintentional plug-in (450978053) 12:54:55 No
SD. Unintentional Liu plug (450978053) 12:55:11, but it must be the first circle covered from top to bottom.
Code:

/* ***********************************************Author :rabbitCreated Time :2014/7/8 13:49:36File Name :3.cpp************************************************ */#pragma comment(linker, "/STACK:102400000,102400000")#include <stdio.h>#include <iostream>#include <algorithm>#include <sstream>#include <stdlib.h>#include <string.h>#include <limits.h>#include <string>#include <time.h>#include <math.h>#include <queue>#include <stack>#include <set>#include <map>using namespace std;#define INF 0x3f3f3f3f#define eps 1e-14#define pi acos(-1.0)typedef long long ll;int dcmp(double x){if(fabs(x)<eps)return 0;return x>0?1:-1;}struct Point{double x,y;Point(double _x=0,double _y=0){x=_x;y=_y;}};Point operator + (Point a,Point b){return Point(a.x+b.x,a.y+b.y);}Point operator - (Point a,Point b){return Point(a.x-b.x,a.y-b.y);}Point operator * (Point a,double p){return Point(a.x*p,a.y*p);}Point operator / (Point a,double p){return Point(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);}bool operator == (const Point &a,const Point &b){return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;}double Dot(Point a,Point b){return a.x*b.x+a.y*b.y;}double Length(Point a){return sqrt(Dot(a,a));}double Angle(Point a,Point b){return acos(Dot(a,b)/Length(a)/Length(b));}double angle(Point a){return atan2(a.y,a.x);}double Cross(Point a,Point b){return a.x*b.y-a.y*b.x;}Point vecunit(Point a){return a/Length(a);}Point Normal(Point a){return Point(-a.y,a.x)/Length(a);}Point Rotate(Point a,double rad){return Point(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));}Point GetLineIntersection(Point p,Point v,Point q,Point w){Point u=p-q;double t=Cross(w,u)/Cross(v,w);return p+v*t;}struct Line{Point p,v;double ang;Line(){}Line(Point _p,Point _v):p(_p),v(_v){ang=atan2(v.y,v.x);}Point point(double a){return p+(v*a);}bool operator < (const Line &L) const{return ang<L.ang;}};Point GetLineIntersection(Line a,Line b){return GetLineIntersection(a.p,a.v,b.p,b.v);}struct Circle{Point c;double r;Circle(){}Circle(Point _c,double _r):c(_c),r(_r){}Point point(double a){return Point(c.x+cos(a)*r,c.y+sin(a)*r);}};Circle C[200];bool vis[200];vector<double> pp[200];int GetCircleCircleIntersection(int s1,int s2){Circle c1=C[s1],c2=C[s2];double d=Length(c1.c-c2.c);if(dcmp(d)==0){if(dcmp(c1.r-c2.r)==0)return -1;return 0;}if(dcmp(c1.r+c2.r-d)<0)return 0;if(dcmp(fabs(c1.r-c2.r)-d)>0)return 0;double a=angle(c2.c-c1.c);double da=acos((c1.r*c1.r+d*d-c2.r*c2.r)/(2*c1.r*d));Point p1=c1.point(a-da),p2=c1.point(a+da);if(p1==p2)return 1;pp[s1].push_back(a+da);pp[s1].push_back(a-da);return 2;}bool PointInCircle(Point p, Circle C){          double dist = Length(p - C.c);    if(dcmp(dist - C.r) > 0) return 0;          else return 1;}bool CircleInCircle(Circle A, Circle B){           double cdist = Length(A.c - B.c);    double rdiff = B.r - A.r;    if(dcmp(A.r - B.r) <= 0 && dcmp(cdist - rdiff) <= 0) return 1;         return 0;}int main(){     //freopen("data.in","r",stdin);     //freopen("data.out","w",stdout);     int n; while(~scanf("%d",&n)&&n){ memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++)pp[i].clear(); for(int i=0;i<n;i++) scanf("%lf%lf%lf",&C[i].c.x,&C[i].c.y,&C[i].r); for(int i=0;i<n;i++) for(int j=0;j<n;j++){ if(i==j)continue; GetCircleCircleIntersection(i,j); } for(int i=0;i<n;i++){ sort(pp[i].begin(),pp[i].end()); pp[i].resize(unique(pp[i].begin(),pp[i].end())-pp[i].begin()); } for(int i=0;i<n;i++){ if(pp[i].size()==0){ bool ok=1; for(int j=i+1;j<n;j++) if(CircleInCircle(C[i],C[j])){ ok=0;break; } if(ok)vis[i]=1;// cout<<"han->1"<<endl; } else{// cout<<"han->2"<<endl; int sz=pp[i].size(); pp[i].push_back(pp[i][0]); for(int j=0;j<sz;j++){ Point dd=C[i].point((pp[i][j]+pp[i][j+1])/2); bool ok=1; for(int k=i+1;k<n;k++) if(PointInCircle(dd,C[k])){// cout<<dd.x<<" "<<dd.y<<" "<<k<<endl; ok=0;break; } if(ok){ vis[i]=1; for(int k=i-1;k>=0;k--) if(PointInCircle(dd,C[k])){ vis[k]=1;break; } } } } } int ans=0;// cout<<"han  ";for(int i=0;i<n;i++)cout<<vis[i]<<" ";cout<<endl; for(int i=0;i<n;i++) if(vis[i])ans++; cout<<ans<<endl; }     return 0;}


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

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.