Segment set

#include <stdio.h>

//¸¡µã¼¸ºÎº¯Êý¿â
#include <math.h>
#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)
struct point{double x,y;};
struct line{point a,b;};

//¼ÆËãcross product (P1-P0)x(P2-P0)
double xmult(point p1,point p2,point p0){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double xmult(double x1,double y1,double x2,double y2,double x0,double y0){
return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);
}

//¼ÆËãdot product (P1-P0).(P2-P0)
double dmult(point p1,point p2,point p0){
return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
}
double dmult(double x1,double y1,double x2,double y2,double x0,double y0){
return (x1-x0)*(x2-x0)+(y1-y0)*(y2-y0);
}

//Á½µã¾àÀë
double distance(point p1,point p2){
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double distance(double x1,double y1,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

//ÅÐÈýµã¹²Ïß
int dots_inline(point p1,point p2,point p3){
return zero(xmult(p1,p2,p3));
}
int dots_inline(double x1,double y1,double x2,double y2,double x3,double y3){
return zero(xmult(x1,y1,x2,y2,x3,y3));
}

//ÅеãÊÇ·ñÔÚÏß¶ÎÉÏ,°üÀ¨¶Ëµã
int dot_online_in(point p,line l){
return zero(xmult(p,l.a,l.b))&&(l.a.x-p.x)*(l.b.x-p.x)<eps&&(l.a.y-p.y)*(l.b.y-p.y)<eps;
}
int dot_online_in(point p,point l1,point l2){
return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps;
}
int dot_online_in(double x,double y,double x1,double y1,double x2,double y2){
return zero(xmult(x,y,x1,y1,x2,y2))&&(x1-x)*(x2-x)<eps&&(y1-y)*(y2-y)<eps;
}

//ÅеãÊÇ·ñÔÚÏß¶ÎÉÏ,²»°üÀ¨¶Ëµã
int dot_online_ex(point p,line l){
return dot_online_in(p,l)&&(!zero(p.x-l.a.x)||!zero(p.y-l.a.y))&&(!zero(p.x-l.b.x)||!zero(p.y-l.b.y));
}
int dot_online_ex(point p,point l1,point l2){
return dot_online_in(p,l1,l2)&&(!zero(p.x-l1.x)||!zero(p.y-l1.y))&&(!zero(p.x-l2.x)||!zero(p.y-l2.y));
}
int dot_online_ex(double x,double y,double x1,double y1,double x2,double y2){
return dot_online_in(x,y,x1,y1,x2,y2)&&(!zero(x-x1)||!zero(y-y1))&&(!zero(x-x2)||!zero(y-y2));
}

//ÅÐÁ½µãÔÚÏß¶Îͬ²à,µãÔÚÏß¶ÎÉÏ·µ»Ø0
int same_side(point p1,point p2,line l){
return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)>eps;
}
int same_side(point p1,point p2,point l1,point l2){
return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps;
}

//ÅÐÁ½µãÔÚÏß¶ÎÒì²à,µãÔÚÏß¶ÎÉÏ·µ»Ø0
int opposite_side(point p1,point p2,line l){
return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)<-eps;
}
int opposite_side(point p1,point p2,point l1,point l2){
return xmult(l1,p1,l2)*xmult(l1,p2,l2)<-eps;
}

//ÅÐÁ½Ö±Ï߯½ÐÐ
int parallel(line u,line v){
return zero((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y));
}
int parallel(point u1,point u2,point v1,point v2){
return zero((u1.x-u2.x)*(v1.y-v2.y)-(v1.x-v2.x)*(u1.y-u2.y));
}

//ÅÐÁ½Ö±Ïß´¹Ö±
int perpendicular(line u,line v){
return zero((u.a.x-u.b.x)*(v.a.x-v.b.x)+(u.a.y-u.b.y)*(v.a.y-v.b.y));
}
int perpendicular(point u1,point u2,point v1,point v2){
return zero((u1.x-u2.x)*(v1.x-v2.x)+(u1.y-u2.y)*(v1.y-v2.y));
}

//ÅÐÁ½Ïß¶ÎÏཻ,°üÀ¨¶ËµãºÍ²¿·ÖÖØºÏ
int intersect_in(line u,line v){
if (!dots_inline(u.a,u.b,v.a)||!dots_inline(u.a,u.b,v.b))
return !same_side(u.a,u.b,v)&&!same_side(v.a,v.b,u);
return dot_online_in(u.a,v)||dot_online_in(u.b,v)||dot_online_in(v.a,u)||dot_online_in(v.b,u);
}
int intersect_in(point u1,point u2,point v1,point v2){
if (!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2))
return !same_side(u1,u2,v1,v2)&&!same_side(v1,v2,u1,u2);
return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2);
}

//ÅÐÁ½Ïß¶ÎÏཻ,²»°üÀ¨¶ËµãºÍ²¿·ÖÖØºÏ
int intersect_ex(line u,line v){
return opposite_side(u.a,u.b,v)&&opposite_side(v.a,v.b,u);
}
int intersect_ex(point u1,point u2,point v1,point v2){
return opposite_side(u1,u2,v1,v2)&&opposite_side(v1,v2,u1,u2);
}

//¼ÆËãÁ½Ö±Ïß½»µã,×¢ÒâÊÂÏÈÅжÏÖ±ÏßÊÇ·ñƽÐÐ!
//Ï߶ν»µãÇëÁíÍâÅÐÏß¶ÎÏཻ(ͬʱ»¹ÊÇÒªÅжÏÊÇ·ñƽÐÐ!)
point intersection(line u,line v){
point ret
=u.a;
double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))
/((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));
ret.x
+=(u.b.x-u.a.x)*t;
ret.y
+=(u.b.y-u.a.y)*t;
return ret;
}
point intersection(point u1,point u2,point v1,point v2){
point ret
=u1;
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
ret.x
+=(u2.x-u1.x)*t;
ret.y
+=(u2.y-u1.y)*t;
return ret;
}

//µãµ½Ö±ÏßÉϵÄ×î½üµã
point ptoline(point p,line l){
point t
=p;
t.x
+=l.a.y-l.b.y,t.y+=l.b.x-l.a.x;
return intersection(p,t,l.a,l.b);
}
point ptoline(point p,point l1,point l2){
point t
=p;
t.x
+=l1.y-l2.y,t.y+=l2.x-l1.x;
return intersection(p,t,l1,l2);
}

//µãµ½Ö±Ïß¾àÀë
double disptoline(point p,line l){
return fabs(xmult(p,l.a,l.b))/distance(l.a,l.b);
}
double disptoline(point p,point l1,point l2){
return fabs(xmult(p,l1,l2))/distance(l1,l2);
}
double disptoline(double x,double y,double x1,double y1,double x2,double y2){
return fabs(xmult(x,y,x1,y1,x2,y2))/distance(x1,y1,x2,y2);
}

//µãµ½Ïß¶ÎÉϵÄ×î½üµã
point ptoseg(point p,line l){
point t
=p;
t.x
+=l.a.y-l.b.y,t.y+=l.b.x-l.a.x;
if (xmult(l.a,t,p)*xmult(l.b,t,p)>eps)
return distance(p,l.a)<distance(p,l.b)?l.a:l.b;
return intersection(p,t,l.a,l.b);
}
point ptoseg(point p,point l1,point l2){
point t
=p;
t.x
+=l1.y-l2.y,t.y+=l2.x-l1.x;
if (xmult(l1,t,p)*xmult(l2,t,p)>eps)
return distance(p,l1)<distance(p,l2)?l1:l2;
return intersection(p,t,l1,l2);
}

//µãµ½Ï߶ξàÀë
double disptoseg(point p,line l){
point t
=p;
t.x
+=l.a.y-l.b.y,t.y+=l.b.x-l.a.x;
if (xmult(l.a,t,p)*xmult(l.b,t,p)>eps)
return distance(p,l.a)<distance(p,l.b)?distance(p,l.a):distance(p,l.b);
return fabs(xmult(p,l.a,l.b))/distance(l.a,l.b);
}
double disptoseg(point p,point l1,point l2){
point t
=p;
t.x
+=l1.y-l2.y,t.y+=l2.x-l1.x;
if (xmult(l1,t,p)*xmult(l2,t,p)>eps)
return distance(p,l1)<distance(p,l2)?distance(p,l1):distance(p,l2);
return fabs(xmult(p,l1,l2))/distance(l1,l2);
}

//ʸÁ¿VÒÔPΪ¶¥µãÄæÊ±ÕëÐýתangle²¢·Å´óscale±¶
point rotate(point v,point p,double angle,double scale){
point ret
=p;
v.x
-=p.x,v.y-=p.y;
p.x
=scale*cos(angle);
p.y
=scale*sin(angle);
ret.x
+=v.x*p.x-v.y*p.y;
ret.y
+=v.x*p.y+v.y*p.x;
return ret;
}
line ln[
1024];
int p[1024];
void make_set()
{
for(int i = 0; i < 1024; ++i)
p[i]
= i;
}

int find_set(int x)
{
if(p[x] != x)
p[x]
= find_set(p[x]);
return p[x];
}

void union_set(int x, int y)
{
x
= find_set(x);
y
= find_set(y);
if(x != y)
p[y]
= x;
}

int main()
{
int cas, n, k, count;
char cmd;
double x1, y1, x2, y2;
point a, b;
scanf(
"%d", &cas);
while(cas--)
{
count
= 0;
make_set();
scanf(
"%d", &n);
//getchar();
for(int i = 0; i < n; ++i)
{
getchar();
cmd
= getchar();
if(cmd == 'P')
{
scanf(
"%lf%lf%lf%lf", &(ln[count].a.x), &(ln[count].a.y), &(ln[count].b.x), &(ln[count].b.y));
for(int j = 0; j < count; ++j)
{
if( 1 == intersect_in(ln[count], ln[j]) )
union_set(count, j);
}
count
++;
}
else if(cmd == 'Q')
{
int i, num = 0;
scanf(
"%d", &k);
for(i = 0; i < 1024; ++i)
find_set(i);
for(i = 0; i < 1024; ++i)
if(p[i] == p[k-1])
num
++;
printf(
"%d\n", num);
}
}
if(cas > 0)
printf(
"\n");
getchar();
}

}
/*
3
10
P 1.00 1.00 4.00 2.00
P 1.00 -2.00 8.00 4.00
Q 1
P 2.00 3.00 3.00 1.00
Q 1
Q 3
P 1.00 4.00 8.00 2.00
Q 2
P 3.00 3.00 6.00 -2.00
Q 5

10
P 1.00 1.00 4.00 2.00
P 1.00 -2.00 8.00 4.00
Q 1
P 2.00 3.00 3.00 1.00
Q 1
Q 3
P 1.00 4.00 8.00 2.00
Q 2
P 3.00 3.00 6.00 -2.00
Q 5

10
P 1.00 1.00 4.00 2.00
P 1.00 -2.00 8.00 4.00
Q 1
P 2.00 3.00 3.00 1.00
Q 1
Q 3
P 1.00 4.00 8.00 2.00
Q 2
P 3.00 3.00 6.00 -2.00
Q 5
*/

  

直接套用几何模板算是否相交。。。
貌似这里乱码了。。。
posted @ 2011-07-16 22:03  georgechen_ena  阅读(352)  评论(1)    收藏  举报