using
System;
namespace
ConsoleZ
{
struct
Point
{
public
double
X;
public
double
Y;
public
override
string
ToString()
{
return
string
.Format(
"({0},{1})"
,X,Y);
}
}
struct
Circle
{
public
Point Center;
public
double
X {
get
{
return
Center.X; }
set
{ Center.X = value; } }
public
double
Y {
get
{
return
Center.Y; }
set
{ Center.X = value; } }
public
double
Radius;
};
class
Program
{
const
double
ZERO = 1e-9;
static
bool
double_equals(
double
a,
double
b)
{
return
Math.Abs(a - b) < ZERO;
}
static
double
distance_sqr(Point a, Point b)
{
return
(a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y);
}
static
double
distance(Point a, Point b)
{
return
Math.Sqrt(distance_sqr(a, b));
}
static
int
insect(Circle[] circles, Point[] points)
{
double
d, a, b, c, p, q, r;
double
[] cos_value =
new
double
[2], sin_value =
new
double
[2];
if
(double_equals(circles[0].Center.X, circles[1].Center.X)
&& double_equals(circles[0].Center.Y, circles[1].Center.Y)
&& double_equals(circles[0].Radius, circles[1].Radius))
{
return
-1;
}
d = distance(circles[0].Center, circles[1].Center);
if
(d > circles[0].Radius + circles[1].Radius
|| d < Math.Abs(circles[0].Radius - circles[1].Radius))
{
return
0;
}
a = 2.0 * circles[0].Radius * (circles[0].Center.X - circles[1].Center.X);
b = 2.0 * circles[0].Radius * (circles[0].Center.Y - circles[1].Center.Y);
c = circles[1].Radius * circles[1].Radius - circles[0].Radius * circles[0].Radius
- distance_sqr(circles[0].Center, circles[1].Center);
p = a * a + b * b;
q = -2.0 * a * c;
if
(double_equals(d, circles[0].Radius + circles[1].Radius)
|| double_equals(d, Math.Abs(circles[0].Radius - circles[1].Radius)))
{
cos_value[0] = -q / p / 2.0;
sin_value[0] = Math.Sqrt(1 - cos_value[0] * cos_value[0]);
points[0].X = circles[0].Radius * cos_value[0] + circles[0].Center.X;
points[0].Y = circles[0].Radius * sin_value[0] + circles[0].Center.Y;
if
(!double_equals(distance_sqr(points[0], circles[1].Center),
circles[1].Radius * circles[1].Radius))
{
points[0].Y = circles[0].Center.Y - circles[0].Radius * sin_value[0];
}
return
1;
}
r = c * c - b * b;
cos_value[0] = (Math.Sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
cos_value[1] = (-Math.Sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
sin_value[0] = Math.Sqrt(1 - cos_value[0] * cos_value[0]);
sin_value[1] = Math.Sqrt(1 - cos_value[1] * cos_value[1]);
points[0].X = circles[0].Radius * cos_value[0] + circles[0].Center.X;
points[1].X = circles[0].Radius * cos_value[1] + circles[0].Center.X;
points[0].Y = circles[0].Radius * sin_value[0] + circles[0].Center.Y;
points[1].Y = circles[0].Radius * sin_value[1] + circles[0].Center.Y;
if
(!double_equals(distance_sqr(points[0], circles[1].Center),
circles[1].Radius * circles[1].Radius))
{
points[0].Y = circles[0].Center.Y - circles[0].Radius * sin_value[0];
}
if
(!double_equals(distance_sqr(points[1], circles[1].Center),
circles[1].Radius * circles[1].Radius))
{
points[1].Y = circles[0].Center.Y - circles[0].Radius * sin_value[1];
}
if
(double_equals(points[0].Y, points[1].Y)
&& double_equals(points[0].X, points[1].X))
{
if
(points[0].Y > 0)
{
points[1].Y = -points[1].Y;
}
else
{
points[0].Y = -points[0].Y;
}
}
return
2;
}
static
void
Main(
string
[] args)
{
Circle[] circles =
new
Circle[2];
Point[] points =
new
Point[2];
Console.Write(
"请输入两圆x,y,半径(以逗号分开):"
);
char
[] sep =
new
char
[] {
' '
,
','
,
','
};
string
[] tempstr;
while
(
true
)
{
tempstr=Console.ReadLine().Split(sep,StringSplitOptions.RemoveEmptyEntries);
if
(tempstr.Length!=6)
{
Console.Write(
"输入有误\n按任意键退出..."
);
Console.ReadKey();
Environment.Exit(0);
}
circles[0].X =
double
.Parse(tempstr[0]);
circles[0].Y=
double
.Parse(tempstr[1]);
circles[0].Radius=
double
.Parse(tempstr[2]);
circles[1].X =
double
.Parse(tempstr[3]);
circles[1].Y =
double
.Parse(tempstr[4]);
circles[1].Radius =
double
.Parse(tempstr[5]);
switch
(insect(circles, points))
{
case
-1:
Console.Write(
"两圆相同\n"
);
break
;
case
0:
Console.Write(
"不相交\n"
);
break
;
case
1:
Console.WriteLine(points[0]);
break
;
case
2:
Console.WriteLine(
string
.Join(
" "
, points));
break
;
}
}
}
}
}