C# 求圆弧和圆弧的交点坐标算法

本文介绍了如何用C#求解圆弧与圆弧的交点坐标,首先求解两圆交点,然后判断交点是否同时属于两个圆弧,并排除(0,0)无效点,最后讨论了代码实现中的关键部分。" 78111359,7338131,Scratch编程挑战:加法速算游戏制作,"['少儿编程', 'Scratch', '编程教学', '游戏设计', '数学教育']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在求圆弧和圆弧的交点坐标的时候,我们同样和我上一个求直线和圆弧交点坐标一样,先来分析一下,主要分为
第一步: 求圆弧和圆弧交点,我们可以先求该圆弧对应的圆和圆的交点。
第二步:通过判断交点是否同时是存在两个圆弧上,注意交点必须同时存在于两个圆弧上,这个交点才是真正的交点(这个地方有点小坑,希望能自己画图理解)。

下面开始展示代码,伸手党有福了,可能有些地方写的不好,望谅解,创作不易,喜欢给个好评吧。

主干

   /// <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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值