在求圆弧和圆弧的交点坐标的时候,我们同样和我上一个求直线和圆弧交点坐标一样,先来分析一下,主要分为
第一步: 求圆弧和圆弧交点,我们可以先求该圆弧对应的圆和圆的交点。
第二步:通过判断交点是否同时是存在两个圆弧上,注意交点必须同时存在于两个圆弧上,这个交点才是真正的交点(这个地方有点小坑,希望能自己画图理解)。
下面开始展示代码,伸手党有福了,可能有些地方写的不好,望谅解,创作不易,喜欢给个好评吧。
主干
/// <summary>
/// 计算圆弧和圆弧的交点方法
/// </summary>
/// <param name="arc">第一个圆</param>
/// <param name="arcTwo">第二个圆</param>
/// <param name="ht">用于存放交点,和error信息</param>
/// <returns>返回交点和error信息</returns>
internal static Hashtable ArcIntersectArc(Arc arc, Arc arcTwo, Hashtable ht)
{
//得到弧心坐标
Vector2 vector = arc.center;
Vector2 vectorTwo = arcTwo.center;
//起始角度
double startAngle = arc.startAngle;
double startAngleTwo = arcTwo.startAngle;
//终止角度
double endAngle = arc.endAngle;
double endAngleTwo = arcTwo.endAngle;
//得到半径
double rad = arc.radius;
double radTwo = arcTwo.radius;
//圆弧的顺逆
bool _direction = arc.direction;
bool _directionTwo = arcTwo.direction;
Vector2[] points = new Vector2[2];
CircleInsect(arc, arcTwo, points);
//用于判断是否有交点
bool judgeNode = false;
//用于第一次存储交点
List<Vector2> node = new List<Vector2>();
//存储的版本号
int version = 0;
//用于第二次存储交点
List<Vector2> nodeTwo = new List<Vector2>();
if (Zero(points[0]))
{
if (vector.y == vectorTwo.y)
{
//当两个弧心坐标的y坐标相等时,以x坐标小的为中心弧心
if (vector.x < vectorTwo.x)
{
//vector 做中心弧心
JudgeDotQualified(vector, points[0], startAngle, endAngle, node, _direction);
if (node.Count == 1)
{
if (node[0] != null)
{
JudgeDotQualified(vectorTwo, points[0], startAngleTwo, endAngleTwo, nodeTwo, _directionTwo);
//表示第一次有一个值
version = 1;
}
}
}
else
{
//vectorTwo 做中心弧心
JudgeDotQualified(vectorTwo, points[0], startAngleTwo, endAngleTwo, node, _directionTwo);
if (node.Count == 1)
{
if (node[0] != null)
{
JudgeDotQualified(vector, points[0], startAngle, endAngle, nodeTwo, _direction);
//表示第一次有一个值
version = 1;
}
}
}
}
else if (vector.y < vectorTwo.y)
{
//取用弧心坐标的y坐标小的做为中心弧心 vector
JudgeDotQualified(vector, points[0], startAngle, endAngle, node, _direction);
if (node.Count == 1)
{
if (node[0] != null)
{
JudgeDotQualified(vectorTwo, points[0], startAngleTwo, endAngleTwo, nodeTwo, _directionTwo);
//表示第一次有一个值
version = 1;
}
}
}
else
{
//取用弧心坐标的y坐标小的做为中心弧心vectorTwo
JudgeDotQualified(vectorTwo, points[0], startAngleTwo, endAngleTwo, node, _directionTwo);
if (node.Count == 1)
{
if (node[0] != null)
{
JudgeDotQualified(vector, points[0], startAngle, endAngle, nodeTwo, _direction)