uva 12304点与直线与圆之间的关系
Problem E
2D Geometry 110 in 1!
This is a collection of 110 (in binary) 2D geometry problems.
CircumscribedCircle x1 y1 x2 y2 x3 y3
Find out the circumscribed circle of triangle (x1,y1)-(x2,y2)-(x3,y3). These three points are guaranteed to be non-collinear. The circle is formatted as (x,y,r) where (x,y) is the center of circle, r is the radius.
InscribedCircle x1 y1 x2 y2 x3 y3
Find out the inscribed circle of triangle (x1,y1)-(x2,y2)-(x3,y3). These three points are guaranteed to be non-collinear. The circle is formatted as (x,y,r) where (x,y) is the center of circle, r is the radius.
TangentLineThroughPoint xc yc r xp yp
Find out the list of tangent lines of circle centered (xc,yc) with radius r that pass through point (xp,yp). Each tangent line is formatted as a single real number "angle" (in degrees), the angle of the line (0<=angle<180). Note that the answer should be formatted as a list (see below for details).
CircleThroughAPointAndTangentToALineWithRadius xp yp x1 y1 x2 y2 r
Find out the list of circles passing through point (xp, yp) that is tangent to a line (x1,y1)-(x2,y2) with radius r. Each circle is formatted as (x,y), since the radius is already given. Note that the answer should be formatted as a list. If there is no answer, you should print an empty list.
CircleTangentToTwoLinesWithRadius x1 y1 x2 y2 x3 y3 x4 y4 r
Find out the list of circles tangent to two non-parallel lines (x1,y1)-(x2,y2) and (x3,y3)-(x4,y4), having radius r. Each circle is formatted as (x,y), since the radius is already given. Note that the answer should be formatted as a list. If there is no answer, you should print an empty list.
CircleTangentToTwoDisjointCirclesWithRadius x1 y1 r1 x2 y2 r2 r
Find out the list of circles externally tangent to two disjoint circles (x1,y1,r1) and (x2,y2,r2), having radius r. By "externally" we mean it should not enclose the two given circles. Each circle is formatted as (x,y), since the radius is already given. Note that the answer should be formatted as a list. If there is no answer, you should print an empty list.
For each line described above, the two endpoints will not be equal. When formatting a list of real numbers, the numbers should be sorted in increasing order; when formatting a list of (x,y) pairs, the pairs should be sorted in increasing order of x. In case of tie, smaller y comes first.
Input
There will be at most 1000 sub-problems, one in each line, formatted as above. The coordinates will be integers with absolute value not greater than 1000. The input is terminated by end of file (EOF).
Output
For each input line, print out your answer formatted as stated in the problem description. Each number in the output should be rounded to six digits after the decimal point. Note that the list should be enclosed by square brackets, and tuples should be enclosed by brackets. There should be no space characters in each line of your output.
Sample Input
CircumscribedCircle 0 0 20 1 8 17
InscribedCircle 0 0 20 1 8 17
TangentLineThroughPoint 200 200 100 40 150
TangentLineThroughPoint 200 200 100 200 100
TangentLineThroughPoint 200 200 100 270 210
CircleThroughAPointAndTangentToALineWithRadius 100 200 75 190 185 65 100
CircleThroughAPointAndTangentToALineWithRadius 75 190 75 190 185 65 100
CircleThroughAPointAndTangentToALineWithRadius 100 300 100 100 200 100 100
CircleThroughAPointAndTangentToALineWithRadius 100 300 100 100 200 100 99
CircleTangentToTwoLinesWithRadius 50 80 320 190 85 190 125 40 30
CircleTangentToTwoDisjointCirclesWithRadius 120 200 50 210 150 30 25
CircleTangentToTwoDisjointCirclesWithRadius 100 100 80 300 250 70 50
Output for the Sample Input
(9.734940,5.801205,11.332389)
(9.113006,6.107686,5.644984)
[53.977231,160.730818]
[0.000000]
[]
[(112.047575,299.271627),(199.997744,199.328253)]
[(-0.071352,123.937211),(150.071352,256.062789)]
[(100.000000,200.000000)]
[]
[(72.231286,121.451368),(87.815122,63.011983),(128.242785,144.270867),(143.826621,85.831483)]
[(157.131525,134.836744),(194.943947,202.899105)]
[(204.000000,178.000000)]
Rujia Liu's Present 4: A Contest Dedicated to Geometry and CG Lovers
Special Thanks: Di Tang and Yi Chen
自己的代码不知道哪里错了,看别人的看的头晕。以后有时间再找到底是哪错了吧!
/*#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<vector>
using namespace std; 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);
}
const double eps=1e-10;
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);
}
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));
} Point GetLineIntersection(Point P,Vector v,Point Q,Vector w)//两直线的交点
{
Vector u=P-Q;
double t=Cross(w,u)/Cross(v,w);
return P+v*t;
} double DistanceToLine(Point P,Point A,Point B)//点到直线的距离
{
Vector v1=B-A,v2=P-A;
return fabs(Cross(v1,v2))/Length(v1);
} 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);
} Point GetLineProjection(Point P,Point A,Point B)//P在直线上的投影点
{
Vector v=B-A;
return A+v*(Dot(v,P-A)/Dot(v,v));
} bool SegmentProperIntersection(Point a1,Point a2,Point b1,Point b2)//两线段规范相交(不包括端点)
{
double c1=Cross(a2-a1,b1-a1),c2=Cross(a2-a1,b2-a1),
c3=Cross(b2-b1,a1-b1),c4=Cross(b2-b1,a2-b1);
return dcmp(c1)*dcmp(c2)<0 && dcmp(c3)*dcmp(c4)<0;
} bool OnSegment(Point p,Point a1,Point a2)//点是否在线段上
{
return dcmp(Cross(a1-p,a2-p))==0 && dcmp(Dot(a1-p,a2-p))<0;
} double PolygonArea(Point *p,int n)//多边形的有向面积
{
double area=0;
for(int i=1;i<n-1;i++)
area+=Cross(p[i]-p[0],p[i+1]-p[0]);
return area/2;
} Point read_point()
{
Point p;
scanf("%lf %lf",&p.x,&p.y);
return p;
} double min(double a,double b)
{
if(a-b>0.00000001) return b;
else return a;
} double max(double a,double b)
{
if(a-b>0.00000001) return a;
else return b;
} 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);
}
}; const double PI=3.141592653589793238462;
double angle(Vector v){ return atan2(v.y,v.x);} //求极角 bool mycomp(const Point &a,const Point &b)
{
if(dcmp(a.x-b.x)!=0) return (dcmp(a.x-b.x)<0?1:0);
else
return (dcmp(a.y-b.y)<0?1:0);
} void CircumscribedCircle()//求三点的外接圆(三边垂直平分线的交点)
{
Point A,B,C,D,E,c;
Vector v1,v2;
double r;
A=read_point();
B=read_point();
C=read_point();
D=(B+A)/2;
v1=Rotate(B-A,PI/2);
E=(C+B)/2;
v2=Rotate(C-B,PI/2);
c=GetLineIntersection(D,v1,E,v2);
r=Length(c-B);
printf("(%.6lf,%.6lf,%.6lf)\n",c.x+eps,c.y,r+eps);
} void InscribedCircle()//求三角形内接圆
{
Point A,B,C,c;
Vector v1,v2;
double r,ang;
A=read_point();
B=read_point();
C=read_point();
ang=Angle(C-A,B-A);
v1=Rotate(B-A,ang/2);
ang=Angle(A-B,C-B);
v2=Rotate(C-B,ang/2);
c=GetLineIntersection(A,v1,B,v2);
r=DistanceToLine(c,A,B);
printf("(%.6lf,%.6lf,%.6lf)\n",c.x+eps,c.y+eps,r+eps);
}
void TangentLineThroughPoint()//定圆求过定点的所有切线
{
Point P;
Circle C;
double ang,ang1,ang2;
C.c=read_point();
scanf("%lf",&C.r);
P=read_point();
Vector v,u=C.c-P;
double dist=Length(u);
if(dist<C.r)
{
printf("[]\n");return ;
}
else if(dcmp(dist-C.r)==0)
{
v=Rotate(u,PI/2);
ang1=angle(v);
if(ang1<eps) ang1+=PI;
if(PI-ang1<eps) ang1-=PI;
printf("[%.6lf]\n",ang1*180/PI);return ;
}
else {
ang=asin(C.r/dist);
v=Rotate(u,-ang);
ang1=angle(v);
if(ang1<eps) ang1+=PI;
if(PI-ang1<eps) ang1-=PI;
v=Rotate(u,ang);
ang2=angle(v);
if(ang1<eps) ang2+=PI;
if(PI-ang1<eps) ang2-=PI;
if(ang1-ang2>eps) ang=ang1,ang1=ang2,ang2=ang;
printf("[%.6lf,%.6lf]\n",eps+ang1*180/PI,eps+ang2*180/PI);return ;
}
}
void GetLineCircleIntersection(Point c,double r,Point A,Point B,vector<Point> &cc)
{
double dist=DistanceToLine(c,A,B);
Vector v;
double len,a,len1;
Point temp;
if(dcmp(dist-r)>0) return ;
else if(dcmp(dist-r)==0)
{
cc.push_back(GetLineProjection(c,A,B));return ;
}
else
{
temp=GetLineProjection(c,A,B);
v=B-A;
len=Length(v);
len1=Length(temp-c);
a=sqrt(r*r-len1*len1);
cc.push_back(temp+v/len*a);
cc.push_back(temp+v/-len*a);
}
} void CircleThroughAPointAndTangentToALineWithRadius()//已知定点定直线定半径,求过定点的切与直线相切的圆
{
Point P,A,B,A1,A2,B1,B2;
double r,len;
Vector v,v1;
vector<Point> cc;
P=read_point();
A=read_point();
B=read_point();
scanf("%lf",&r);
v=B-A;
v1=Rotate(v,PI/2);
len=Length(v1);
A1=A+v1/len*r;
B1=B+v1/len*r;
A2=A+v1/-len*r;
B2=B+v1/-len*r;
GetLineCircleIntersection(P,r,A1,B1,cc);
GetLineCircleIntersection(P,r,A2,B2,cc);
sort(cc.begin(),cc.end(),mycomp);
printf("[");
for(int i=0;i<cc.size();i++)
{
if(i==0) printf("(%.6lf,%.6lf)",eps+cc[i].x,eps+cc[i].y);
else printf(",(%.6lf,%.6lf)",eps+cc[i].x,eps+cc[i].y);
}
printf("]\n");
} void CircleTangentToTwoLinesWithRadius()
{
Point A,B,A1,A2,B1,B2,C,D,C1,C2,D1,D2;
double r,len;
Vector v,v1;
vector<Point> cc;
A=read_point();
B=read_point();
C=read_point();
D=read_point();
scanf("%lf",&r);
v=B-A;
v1=Rotate(v,PI/2);
len=Length(v1);
A1=A+v1/len*r;
B1=B+v1/len*r;
A2=A+v1/-len*r;
B2=B+v1/-len*r;
v=C-D;
v1=Rotate(v,PI/2);
len=Length(v1);
C1=C+v1/len*r;
D1=D+v1/len*r;
C2=C+v1/-len*r;
D2=D+v1/-len*r;
if(dcmp(fabs(Dot(A1-B1,C1-D1))-1)!=0)
{
cc.push_back(GetLineIntersection(A1,A1-B1,C1,C1-D1));
}
if(dcmp(fabs(Dot(A1-B1,C2-D2))-1)!=0)
{
cc.push_back(GetLineIntersection(A1,A1-B1,C2,C2-D2));
}
if(dcmp(fabs(Dot(A2-B2,C1-D1))-1)!=0)
{
cc.push_back(GetLineIntersection(A2,A2-B2,C1,C1-D1));
}
if(dcmp(fabs(Dot(A2-B2,C2-D2))-1)!=0)
{
cc.push_back(GetLineIntersection(A2,A2-B2,C2,C2-D2));
}
sort(cc.begin(),cc.end(),mycomp);
printf("[");
for(int i=0;i<cc.size();i++)
{
if(i==0) printf("(%.6lf,%.6lf)",eps+cc[i].x,eps+cc[i].y);
else printf(",(%.6lf,%.6lf)",eps+cc[i].x,eps+cc[i].y);
}
printf("]\n");
}
void CircleTangentToTwoDisjointCirclesWithRadius()
{
Circle C1,C2;
double r,dist,ang,t;
Vector v,v1;
vector<Point> cc;
C1.c=read_point();
scanf("%lf",&C1.r);
C2.c=read_point();
scanf("%lf",&C2.r);
scanf("%lf",&r);
v=C1.c-C2.c;
dist=Length(v);
if(dcmp(dist-(2*r+C1.r+C2.r))==0)
cc.push_back(C2.c+v/dist*(C2.r+r));
else if(dcmp(dist-(2*r+C1.r+C2.r))<0)
{
t= ((C2.r+r)*(C2.r+r)+dist*dist-(C1.r+r)*(C1.r+r)) /(2*(C2.r+r)*dist);
ang=acos(t);
v1=Rotate(v,ang);
cc.push_back(C2.c+v1/Length(v1)*(C2.r+r));
v1=Rotate(v,-ang);
cc.push_back(C2.c+v1/Length(v1)*(C2.r+r));
}
sort(cc.begin(),cc.end(),mycomp);
printf("[");
for(int i=0;i<cc.size();i++)
{
if(i==0) printf("(%.6lf,%.6lf)",eps+cc[i].x,eps+cc[i].y);
else printf(",(%.6lf,%.6lf)",eps+cc[i].x,eps+cc[i].y);
}
printf("]\n");
}
int main()
{
freopen("out.txt","w",stdout);
map<string,int> m;
m["CircumscribedCircle"]=1;
m["InscribedCircle"]=2;
m["TangentLineThroughPoint"]=3;
m["CircleThroughAPointAndTangentToALineWithRadius"]=4;
m["CircleTangentToTwoLinesWithRadius"]=5;
m["CircleTangentToTwoDisjointCirclesWithRadius"]=6;
string s;
while(cin>>s)
{
switch(m[s])
{
case 1:CircumscribedCircle();break;
case 2:InscribedCircle();break;
case 3:TangentLineThroughPoint();break;
case 4:CircleThroughAPointAndTangentToALineWithRadius();break;
case 5:CircleTangentToTwoLinesWithRadius();break;
case 6:CircleTangentToTwoDisjointCirclesWithRadius();break;
default :break;
}
}
return 0;
}*/
#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>
#include <string>
#include <cstdio>
using namespace std; #define PI acos(-1.0)
#define M 100007
#define N 65736 const int inf = 0x7f7f7f7f;
const int mod = ;
const double eps = 1e-; struct Point
{
double x, y;
Point(double tx = , double ty = ) : x(tx), y(ty){}
};
typedef Point Vtor;
//向量的加减乘除
Vtor operator + (Vtor A, Vtor B) { return Vtor(A.x + B.x, A.y + B.y); }
Vtor operator - (Point A, Point B) { return Vtor(A.x - B.x, A.y - B.y); }
Vtor operator * (Vtor A, double p) { return Vtor(A.x*p, A.y*p); }
Vtor operator / (Vtor A, double p) { return Vtor(A.x / p, A.y / p); }
bool operator < (Point A, Point B) { return A.x < B.x || (A.x == B.x && A.y < B.y); }
int dcmp(double x){ if (fabs(x) < eps) return ; else return x < ? - : ; }
bool operator == (Point A, Point B) { return dcmp(A.x - B.x) == && dcmp(A.y - B.y) == ; }
//向量的点积,长度,夹角
double Dot(Vtor A, Vtor B) { return (A.x*B.x + A.y*B.y); }
double Length(Vtor A) { return sqrt(Dot(A, A)); }
double Angle(Vtor A, Vtor B) { return acos(Dot(A, B) / Length(A) / Length(B)); }
//叉积,三角形面积
double Cross(Vtor A, Vtor B) { return A.x*B.y - A.y*B.x; }
double Area2(Point A, Point B, Point C) { return Cross(B - A, C - A); }
//向量的旋转,求向量的单位法线(即左转90度,然后长度归一)
Vtor Rotate(Vtor A, double rad){ return Vtor(A.x*cos(rad) - A.y*sin(rad), A.x*sin(rad) + A.y*cos(rad)); }
Vtor Normal(Vtor A)
{
double L = Length(A);
return Vtor(-A.y / L, A.x / L);
}
//直线的交点
Point GetLineIntersection(Point P, Vtor v, Point Q, Vtor w)
{
Vtor u = P - Q;
double t = Cross(w, u) / Cross(v, w);
return P + v*t;
}
//点到直线的距离
double DistanceToLine(Point P, Point A, Point B)
{
Vtor v1 = B - A;
return fabs(Cross(P - A, v1)) / Length(v1);
}
//点到线段的距离
double DistanceToSegment(Point P, Point A, Point B)
{
if (A == B) return Length(P - A);
Vtor v1 = B - A, v2 = P - A, v3 = P - B;
if (dcmp(Dot(v1, v2)) < ) return Length(v2);
else if (dcmp(Dot(v1, v3)) > ) return Length(v3);
else return fabs(Cross(v1, v2)) / Length(v1);
}
//点到直线的映射
Point GetLineProjection(Point P, Point A, Point B)
{
Vtor v = B - A;
return A + v*Dot(v, P - A) / Dot(v, v);
} //判断线段是否规范相交
bool SegmentProperIntersection(Point a1, Point a2, Point b1, Point b2)
{
double c1 = Cross(a2 - a1, b1 - a1), c2 = Cross(a2 - a1, b2 - a1),
c3 = Cross(b2 - b1, a1 - b1), c4 = Cross(b2 - b1, a2 - b1);
return dcmp(c1)*dcmp(c2) < && dcmp(c3)*dcmp(c4) < ;
}
//判断点是否在一条线段上
bool OnSegment(Point P, Point a1, Point a2)
{
return dcmp(Cross(a1 - P, a2 - P)) == && dcmp(Dot(a1 - P, a2 - P)) < ;
}
//多边形面积
double PolgonArea(Point *p, int n)
{
double area = ;
for (int i = ; i < n - ; ++i)
area += Cross(p[i] - p[], p[i + ] - p[]);
return area / ;
} struct Line
{
Point p, b;
Vtor v;
Line(){}
Line(Point a, Point b, Vtor v) : p(a), b(b), v(v) {}
Line(Point p, Vtor v) : p(p), v(v){}
Point point(double t) { return p + v*t; }
};
struct Circle
{
Point c;
double r;
Circle(Point tc, double tr) : c(tc), r(tr){}
Point point(double a)
{
return Point(c.x + cos(a)*r, c.y + sin(a)*r);
}
};
//判断圆与直线是否相交以及求出交点
int getLineCircleIntersection(Line L, Circle C, double &t1, double &t2, vector<Point> &sol)
{
// printf(">>>>>>>>>>>>>>>>>>>>>>>>\n");
//注意sol没有清空哦
double a = L.v.x, b = L.p.x - C.c.x, c = L.v.y, d = L.p.y - C.c.y;
double e = a*a + c*c, f = * (a*b + c*d), g = b*b + d*d - C.r*C.r;
double delta = f*f - 4.0*e*g;
if (dcmp(delta) < ) return ;
else if (dcmp(delta) == )
{
t1 = t2 = -f / (2.0*e);
sol.push_back(L.point(t1));
return ;
}
t1 = (-f - sqrt(delta)) / (2.0 * e); sol.push_back(L.point(t1));
t2 = (-f + sqrt(delta)) / (2.0 * e); sol.push_back(L.point(t2));
return ;
}
//判断并求出两圆的交点
double angle(Vtor v) { return atan2(v.y, v.x); }
int getCircleIntersection(Circle C1, Circle C2, vector<Point> &sol)
{
double d = Length(C1.c - C2.c);
// 圆心重合
if (dcmp(d) == )
{
if (dcmp(C1.r - C2.r) == ) return -; // 两圆重合
return ; // 包含
} // 圆心不重合
if (dcmp(C1.r + C2.r - d) < ) return ; // 相离
if (dcmp(fabs(C1.r - C2.r) - d) > ) return ; // 包含 double a = angle(C2.c - C1.c);
double da = acos((C1.r*C1.r + d*d - C2.r*C2.r) / ( * C1.r*d));
Point p1 = C1.point(a - da), p2 = C1.point(a + da);
sol.push_back(p1);
if (p1 == p2) return ;
sol.push_back(p2);
return ;
}
//求点到圆的切线
int getTangents(Point p, Circle C, Vtor* v)
{
Vtor u = C.c - p;
double dis = Length(u);
if (dis < C.r) return ;
else if (dcmp(dis - C.r) == )
{
v[] = Rotate(u, PI / 2.0);
return ;
}
else
{
double ang = asin(C.r / dis);
v[] = Rotate(u, -ang);
v[] = Rotate(u, +ang);
return ;
}
}
//求两圆的切线
int getCircleTangents(Circle A, Circle B, Point *a, Point *b)
{
int cnt = ;
if (A.r < B.r) { swap(A, B); swap(a, b); }
//圆心距的平方
double d2 = (A.c.x - B.c.x)*(A.c.x - B.c.x) + (A.c.y - B.c.y)*(A.c.y - B.c.y);
double rdiff = A.r - B.r;
double rsum = A.r + B.r;
double base = angle(B.c - A.c);
//重合有无限多条
if (d2 == && dcmp(A.r - B.r) == ) return -;
//内切
if (dcmp(d2 - rdiff*rdiff) == )
{
a[cnt] = A.point(base);
b[cnt] = B.point(base); cnt++;
return ;
}
//有外公切线
double ang = acos((A.r - B.r) / sqrt(d2));
a[cnt] = A.point(base + ang); b[cnt] = B.point(base + ang); cnt++;
a[cnt] = A.point(base - ang); b[cnt] = B.point(base - ang); cnt++; //一条内切线
if (dcmp(d2 - rsum*rsum) == )
{
a[cnt] = A.point(base); b[cnt] = B.point(PI + base); cnt++;
}//两条内切线
else if (dcmp(d2 - rsum*rsum) > )
{
double ang = acos((A.r + B.r) / sqrt(d2));
a[cnt] = A.point(base + ang); b[cnt] = B.point(base + ang); cnt++;
a[cnt] = A.point(base - ang); b[cnt] = B.point(base - ang); cnt++;
}
return cnt;
}
Circle CircumscribedCircle(Point A, Point B, Point C)
{
Point tmp1 = Point((B.x + C.x) / 2.0, (B.y + C.y) / 2.0);
Vtor u = C - tmp1;
u = Rotate(u, PI / 2.0);
Point tmp2 = Point((A.x + C.x) / 2.0, (A.y + C.y) / 2.0);
Vtor v = C - tmp2;
v = Rotate(v, -PI / 2.0);
Point c = GetLineIntersection(tmp1, u, tmp2, v);
double r = Length(C - c);
return Circle(c, r);
}
Circle work2(Point p1, Point p2, Point p3) {
Vtor v11 = p2 - p1;
Vtor v12 = p3 - p1;
Vtor v21 = p1 - p2;
Vtor v22 = p3 - p2;
double ang1 = (angle(v11) + angle(v12)) / 2.0;
double ang2 = (angle(v21) + angle(v22)) / 2.0;
Vtor vec1 = Vtor(cos(ang1), sin(ang1));
Vtor vec2 = Vtor(cos(ang2), sin(ang2));
Point O = GetLineIntersection(p1, vec1, p2, vec2);
double r = DistanceToLine(O, p1, p2);
return Circle(O, r);
}
vector<Point> solve4(Point A, Point B, double r, Point C)
{
Vtor normal = Normal(B - A);
normal = normal / Length(normal) * r;
vector<Point> ans;
double t1 = , t2 = ;
Vtor tA = A + normal, tB = B + normal;
getLineCircleIntersection(Line(tA, tB, tB - tA), Circle(C, r), t1, t2, ans);
tA = A - normal, tB = B - normal;
getLineCircleIntersection(Line(tA, tB, tB - tA), Circle(C, r), t1, t2, ans);
return ans;
}
vector<Point> solve5(Point A, Point B, Point C, Point D, double r)
{
Line lines[];
Vtor normal = Normal(B - A) * r;
Point ta, tb, tc, td;
ta = A + normal, tb = B + normal;
lines[] = Line(ta, tb, tb - ta);
ta = A - normal, tb = B - normal;
lines[] = Line(ta, tb, tb - ta); normal = Normal(D - C) * r;
tc = C + normal, td = D + normal;
lines[] = Line(tc, td, td - tc);
tc = C - normal, td = D - normal;
lines[] = Line(tc, td, td - tc);
vector<Point> ans;
ans.push_back(GetLineIntersection(lines[].p, lines[].v, lines[].p, lines[].v));
ans.push_back(GetLineIntersection(lines[].p, lines[].v, lines[].p, lines[].v));
ans.push_back(GetLineIntersection(lines[].p, lines[].v, lines[].p, lines[].v));
ans.push_back(GetLineIntersection(lines[].p, lines[].v, lines[].p, lines[].v));
return ans;
}
vector<Point> solve6(Circle C1, Circle C2, double r)
{
vector<Point> vc;
getCircleIntersection(Circle(C1.c, C1.r + r), Circle(C2.c, C2.r + r), vc);
return vc;
} string op;
double x[]; int main()
{
while (cin >> op)
{
if (op == "CircumscribedCircle")
{
for (int i = ; i < ; ++i) cin >> x[i];
Circle ans = CircumscribedCircle(Point(x[], x[]), Point(x[], x[]), Point(x[], x[]));
printf("(%.6lf,%.6lf,%.6lf)\n", ans.c.x, ans.c.y, ans.r);
}
else if (op == "InscribedCircle")
{
for (int i = ; i < ; ++i) cin >> x[i];
// Circle ans = InscribedCircle(Point(x[0],x[1]),Point(x[2],x[3]),Point(x[4],x[5]));
Circle ans = work2(Point(x[], x[]), Point(x[], x[]), Point(x[], x[]));
printf("(%.6lf,%.6lf,%.6lf)\n", ans.c.x, ans.c.y, ans.r);
}
else if (op == "TangentLineThroughPoint")
{
for (int i = ; i < ; ++i) cin >> x[i];
Vtor vc[];
int len = getTangents(Point(x[], x[]), Circle(Point(x[], x[]), x[]), vc);
double tmp[];
for (int i = ; i < len; ++i)
{
double ang = angle(vc[i]);
if (ang < ) ang += PI;
ang = fmod(ang, PI);
tmp[i] = ang * / PI;
}
sort(tmp, tmp + len);
printf("[");
for (int i = ; i < len; ++i)
{
printf("%.6lf", tmp[i]);
if (i != len - ) printf(",");
}
printf("]\n");
}
else if (op == "CircleThroughAPointAndTangentToALineWithRadius")
{
for (int i = ; i < ; ++i) cin >> x[i];
vector<Point> vc = solve4(Point(x[], x[]), Point(x[], x[]), x[], Point(x[], x[]));
sort(vc.begin(), vc.end());
printf("[");
for (size_t i = ; i < vc.size(); ++i)
{
printf("(%.6lf,%.6lf)", vc[i].x, vc[i].y);
if (i != vc.size() - ) printf(",");
}
printf("]\n");
}
else if (op == "CircleTangentToTwoLinesWithRadius")
{
for (int i = ; i < ; ++i) cin >> x[i];
vector<Point> vc = solve5(Point(x[], x[]), Point(x[], x[]), Point(x[], x[]), Point(x[], x[]), x[]);
sort(vc.begin(), vc.end());
printf("[");
for (size_t i = ; i < vc.size(); ++i)
{
printf("(%.6lf,%.6lf)", vc[i].x, vc[i].y);
if (i != vc.size() - ) printf(",");
}
printf("]\n");
}
else
{
for (int i = ; i < ; ++i) cin >> x[i];
vector<Point> vc = solve6(Circle(Point(x[], x[]), x[]), Circle(Point(x[], x[]), x[]), x[]);
sort(vc.begin(), vc.end());
printf("[");
for (size_t i = ; i < vc.size(); ++i)
{
printf("(%.6lf,%.6lf)", vc[i].x, vc[i].y);
if (i != vc.size() - ) printf(",");
}
printf("]\n");
}
}
}
uva 12304点与直线与圆之间的关系的更多相关文章
- 实验12:Problem D: 判断两个圆之间的关系
Home Web Board ProblemSet Standing Status Statistics Problem D: 判断两个圆之间的关系 Problem D: 判断两个圆之间的关系 T ...
- Segments--poj3304(判断直线与线段之间的关系)
http://poj.org/problem?id=3304 给你几条线段 然后 让你找到一条直线让他在这条直线上的映射有一个重合点 如果有这条直线的话 这个重合的部分的两个端点一定是某两条线段的 ...
- poj 3304 Segments(计算直线与线段之间的关系)
Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10921 Accepted: 3422 Descrip ...
- OpenCV 学习笔记03 直线和圆检测
检测边缘和轮廓不仅重要,还经常用到,它们也是构成其他复杂操作的基础. 直线和形状检测与边缘和轮廓检测有密切的关系. 霍夫hough 变换是直线和形状检测背后的理论基础.霍夫变化是基于极坐标和向量开展的 ...
- 【python+opencv】直线检测+圆检测
Python+OpenCV图像处理—— 直线检测 直线检测理论知识: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进 ...
- 简单几何(直线与圆的交点) ZOJ Collision 3728
题目传送门 题意:有两个一大一小的同心圆,圆心在原点,大圆外有一小圆,其圆心有一个速度(vx, vy),如果碰到了小圆会反弹,问该圆在大圆内运动的时间 分析:将圆外的小圆看成一个点,判断该直线与同心圆 ...
- uva 12304
题意:要求解答6个关于圆的问题. 1.给出三角形坐标求外接圆 2.给出三角形坐标求内切圆 3.给出一个圆心和半径已知的圆,求过点(x,y)的所有和这个圆相切的直线 4.求所有和已知直线相切的过定点(x ...
- Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- zznuoj 1540 : 直线与圆
题目描述 给出一个圆的圆心坐标与圆的半径,和一条直线上的两点坐标,求这条直线与圆有多少个交点. 输入 输入3个实数x,y,r值分别表示圆心坐标与圆的半径,输入4个实数x1,y1,x2,y2表示直线上的 ...
随机推荐
- MYSQL 中随机读取一条数据
SELECT * FROM res AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM res) - (SELECT MIN(id) FRO ...
- (四)VMware Harbor 配置文件
VMware Harbor 配置文件 :harbor.yml # Configuration file of Harbor # The IP address or hostname to access ...
- js的正则表达式总结
1.8-20位数字 or 字母 or 特殊字符 var reg = /^[0-9a-zA-Z!@#$%^&*()_+-/.]{8,20}$/; 2.8-20位 数字+字母+特殊字符 //正则 ...
- apache 报413
http://www.hostlift.com/apache/modsecurity-request-body-content-length-is-larger-than-the-configured ...
- java在线聊天项目 客户端登陆窗口LoginDialog的注册用户功能 修改注册逻辑 增空用户名密码的反馈 增加showMessageDialog()提示框
LoginDialog类的代码修改如下: package com.swift.frame; import java.awt.EventQueue; import java.awt.event.Acti ...
- nib、xib、storyboard(故事板)
nib:NeXT Interface Builder的缩写 xib:XML nib的缩写 相同点: nib和xib都是Interface Builder的图形界面设计文档.Interface Buil ...
- CS193p Lecture 7 - Views, Gestures
Views 如何绘制自定义图像 Gestures 如何处理用户手势操作 Views 1.它是基本的构造块,代表屏幕上一块矩形区域,定义了一个坐标空间,在此空间中可以绘制,可以添加触控事件: 2.它是分 ...
- POJ 2255 Tree Recovery——二叉树的前序遍历、后序遍历、中序遍历规则(递归)
1.前序遍历的规则:(根左右) (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 对于图中二叉树,前序遍历结果:ABDECF 2.中序遍历的规则:(左根右) (1)中序遍历左子树 (2)访 ...
- Qt读写excel
今天在利用Qt进行excel操作时,代码总是走到打开excel这一步是总是出现程序崩溃.在网上查找了各种帖子 说法不一,尝试都没有解决.后来猜想是不是excel没有激活影响的.发现自己的excel没 ...
- RN性能
https://facebook.github.io/react-native/docs/performance.html 一个使用RN而不是webView的重要原因是可实现60fps以及更类似原生a ...