已知两圆的圆心半径,求交点坐标——CAD VBA 解决

news2024/9/21 12:41:23

如下图, dwg图中若干图形,运行代码后提示选择两个圆,然后判断两个圆位置关系和相交点坐标:

本例难点在于通过几何知识求出交点坐标。

几何背景

假设有两个圆:
- 圆1:圆心 ( O_1(x_1, y_1) ),半径 ( r_1 )
- 圆2:圆心 ( O_2(x_2, y_2) ),半径 ( r_2 )

圆心 ( O_1 ) 和 ( O_2 ) 之间的距离为 d ,交点位于两圆的公共弦上。我们的目标是通过代数推导找到公共弦与两圆圆心的几何关系,并证明 a 的代数式。

几何分析

两个圆的交点(如果有两个)在公共弦上,且公共弦的中垂线经过两个圆心 O_1  和O_2 的连线。我们定义  P_0 为公共弦的中点,且它在两个圆心连线 O_1O_2 上。定义:
 a 是圆心 O_1到点 P_0  的距离。
h 是P_0 到交点的垂直距离。

因此,我们可以将 a 定义为从 O_1到公共弦 即  P_0 的距离。

利用余弦定理推导 a 

利用两圆的交点与圆心的几何关系,首先计算 \( a \) 的代数表达式。

1. 定义圆心距离 d:

   d = sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2

   
2. **两圆相交**:假设两个圆有两个交点,公共弦 \( AB \) 将连线 \( O_1O_2 \) 分成两部分:从 \( O_1 \) 到公共弦的距离 \( a \),和从 \( O_2 \) 到公共弦的另一段距离。

3. **两圆的关系**:根据几何原理,有:

   r_1^2 = a^2 + h^2

   r_2^2 = (d - a)^2 + h^2 

   其中,h 是从 P_0 到交点的垂直距离。

4. 消去  h^2:从公式 (1) 和 (2) 可以消去 \( h^2 \),得到:

   r_1^2 - a^2 = r_2^2 - (d - a)^2

   
5. **展开并整理**:

   r_1^2 - a^2 = r_2^2 - (d^2 - 2ad + a^2)

   r_1^2 - a^2 = r_2^2 - d^2 + 2ad - a^2

   r_1^2 - r_2^2 + d^2 = 2ad

   
6. 解出  a :

         a = (r1 ^ 2 - r2 ^ 2 + d ^ 2) / (2 * d)
         h = Sqr(r1 ^ 2 - a ^ 2)
       

通过这个公式,我们可以进一步计算出交点的坐标,根据三角函数,详见代码。

附部分计代码如下:

#If VBA7 Then
  ' 64位系统声明
  Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
  ' 32位系统声明
  Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
#If VBA7 Then
    ' 64位系统声明
    Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#Else
    ' 32位系统声明
    Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#End If
Sub SelectTwoCircles()
'yngqq@2024年9月10日21:40:46
    Dim escapePressed As Boolean
    escapePressed = False
    Dim ent As AcadEntity
    Dim circle1 As AcadCircle
    Dim circle2 As AcadCircle
    Dim selectionCount As Integer
    Dim center1 As Variant
    Dim center2 As Variant
    Dim x1 As Double, y1 As Double, r1 As Double
    Dim x2 As Double, y2 As Double, r2 As Double
    selectionCount = 0

2000:
    Do While selectionCount < 2
        ' 如果按下ESC键,退出循环
        If GetAsyncKeyState(vbKeyEscape) <> 0 Then
        If GetAsyncKeyState(vbKeyEscape) <> 0 Then
            ThisDrawing.Utility.Prompt "检测到ESC键,退出循环 " & vbCrLf
            MsgBox "已按下Esc键,退出程序", , "CopyRight@yngqq"
                GoTo errocontrol
        End If
        End If
        DoEvents
        ThisDrawing.Utility.Prompt "请选择第" & (selectionCount + 1) & "个圆: "
'        If Err Then
'            Err.Clear
'            GoTo 2000
'        End If
        On Error Resume Next
        ThisDrawing.Utility.GetEntity ent, basePnt, " "
        If Err Then
            Err.Clear
            GoTo 2000
        End If
        ' 判断用户是否选择了一个圆
        If TypeOf ent Is AcadCircle Then
            selectionCount = selectionCount + 1
            If selectionCount = 1 Then
                ' 第一个圆
                Set circle1 = ent
            ElseIf selectionCount = 2 Then
                ' 第二个圆
                Set circle2 = ent
            End If
        Else
            ThisDrawing.Utility.Prompt "选择的不是圆,请重新选择。" & vbCrLf
        End If
        
    Loop
    ' 获取圆心坐标和半径
   ' On Error GoTo 0
    center1 = circle1.Center
    center2 = circle2.Center
    x1 = center1(0): y1 = center1(1): r1 = circle1.Radius
    x2 = center2(0): y2 = center2(1): r2 = circle2.Radius
    Call FindCircleIntersection(x1, y1, r1, x2, y2, r2)
errocontrol:
End Sub

Public Function FindCircleIntersection(x1 As Double, y1 As Double, r1 As Double, x2 As Double, y2 As Double, r2 As Double) As Variant
   
    Dim d As Double
    d = Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
    
    ' 判断圆的关系
    If d > r1 + r2 Then
        MsgBox "两个圆不相交"
    ElseIf d < Abs(r1 - r2) Then
        MsgBox "一个圆在另一个圆内,且不相交"
    ElseIf d = 0 And r1 = r2 Then
        MsgBox "两个圆重合"
    Else
        ' 圆相交,计算交点
        
        ' 计算 a 和 h
        Dim a As Double, h As Double
        a = (r1 ^ 2 - r2 ^ 2 + d ^ 2) / (2 * d)
        h = Sqr(r1 ^ 2 - a ^ 2)
        
        ' 计算中间点 P0
        Dim P0x As Double, P0y As Double
        P0x = x1 + a * (x2 - x1) / d
        P0y = y1 + a * (y2 - y1) / d
        
        ' 计算两个交点
        Dim x3_1 As Double, y3_1 As Double
        Dim x3_2 As Double, y3_2 As Double
        
        x3_1 = P0x + h * (y2 - y1) / d
        y3_1 = P0y - h * (x2 - x1) / d
        
        x3_2 = P0x - h * (y2 - y1) / d
        y3_2 = P0y + h * (x2 - x1) / d
        
        ' 输出交点坐标
        If d = r1 + r2 Or d = Abs(r1 - r2) Then
            MsgBox "两个圆相切,交点坐标为:" & vbCrLf & "(" & x3_1 & "   ,   " & y3_1 & ")"
        Else
            MsgBox "两个圆相交,交点坐标为:" & vbCrLf & "(" & x3_1 & "   ,   " & y3_1 & ")" & vbCrLf & "和" & vbCrLf & "(" & x3_2 & "   ,   " & y3_2 & ")"
        End If
    End If
End Function

 

CAD二次开发、插件、代码代写,详情见下方↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于支付宝小程序多规格选项的时候点击不起反应的原因分析及修改方法

解决方案&#xff1a; watch的时候&#xff0c;对于对象的赋值&#xff0c;最好用深拷贝&#xff0c;即如下图&#xff1a; watch:{ row: function (nv, ov) {var that this;that.indata.row JSON.parse(JSON.stringify(nv));//如果是对象&#xff0c;请用深入的for (va…

《使用 LangChain 进行大模型应用开发》学习笔记(二)

前言 本文是 Harrison Chase &#xff08;LangChain 创建者&#xff09;和吴恩达&#xff08;Andrew Ng&#xff09;的视频课程《LangChain for LLM Application Development》&#xff08;使用 LangChain 进行大模型应用开发&#xff09;的学习笔记。由于原课程为全英文视频课…

ReLU再进化ReLUMax:自动驾驶的瞬态容错语义分割

ReLU再进化ReLUMax&#xff1a;自动驾驶的瞬态容错语义分割 Abstract 度学习模型在自动驾驶感知中至关重要&#xff0c;但其可靠性面临着算法限制和硬件故障的挑战。我们通过研究语义分割模型的容错性来应对后者。使用已有的硬件故障模型&#xff0c;我们在准确性和不确定性方…

视频号接口列表

目前已有的接口列表&#xff1a; 账号搜索 视频搜索 直播搜索 获取作者信息和作品列表 视频解密并下载 获取视频详情 获取视频评论 获取视频评论的子评论 作品喜欢 作品点赞 作品评论 对作品评论进行评论 关注作者 加入直播间 获取直播间弹幕消息 发送弹幕消息 获取直播间商品…

力扣474-一和零(Java详细题解)

题目链接&#xff1a;474. 一和零 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完01背包&#xff0c;所以现在的题解都是以01背包问题为基础再来写的。 如果大家不懂01背包的话&#…

运维问题0002:SAP多模块问题-SAP系统程序在执行时,跳出“加急快件”窗口,提示:快件文档“更新已终止”从作者***收到

1、问题描述 近期收到2起业务报障&#xff0c;均反馈在SAP执行程序时&#xff0c;弹出“加急快件”窗口&#xff0c;导致操作的业务实际没有更新完成。 1&#xff09;业务场景一&#xff1a;设备管理部门在操作事务代码&#xff1a;AS02进行资产信息变更时&#xff0c;保存正常…

面试官:为什么 Redis 6.0 之后引入多线程?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 回答 Redis 的性能瓶颈从来都不是 CPU&#xff0c;是网络I/O 和内存。 内存好解决&#xff0c;加机器内存和优化数据结构。 网路 I/O 的优化才是大头&#xff0c;因为读写网络的 read…

最新大厂薪资职级表,我酸了。。

大家好&#xff01;我是鸭鸭&#xff01; 又到周末&#xff0c;让我们轻松一下&#xff0c;来吃吃瓜&#xff01; 大厂往往会提供具有竞争力的薪资和福利待遇&#xff0c;正值秋招&#xff0c;相关热帖也是又被翻了出来。鸭鸭今天就刷到一个帖子&#xff0c;据说是几家互联网…

基于构件开发-系统架构师(六十四)

1&#xff08;&#xff09;常见的功能包括版本控制&#xff0c;变更管理&#xff0c;配置状态管理&#xff0c;访问控制和安全控制等。 A软件测试工具 B版本控制工具 C软件维护工具 D软件配置管理工具 解析&#xff1a; 软件过程工具分为&#xff1a;软件开发工具&#xf…

史上最全-经管类国家社科基金立项名单汇总 1991-2024

数据说明&#xff1a;本次数据包括以下内容&#xff1a; 1.国家自科基金立项名单&#xff08;2022-2024&#xff09; 2.国家社科基金立项名单&#xff08;2008-2018&#xff09; 数据简介&#xff1a;国家自然科学基金是中国支持基础研究的主渠道之一&#xff0c;面向全国&am…

容易中、见刊快的6本医学期刊推荐!

常笑医学整理了6本容易中、见刊快的医学期刊&#xff0c;以及期刊详细参数与投稿经验&#xff0c;供医生、医学生们在论文投稿时参考。投稿经历均来自常笑医学网用户真实分享&#xff0c;欢迎大家到常笑医学网分享自己的投稿经历和实用经验。 1.《中国医药科学》 &#xff08;详…

两个月冲刺软考——校验码的三种类型;编译过程;翻译器与解释器的对比;补充CPU的内容

1.校验码 是通过扩大码距从而实现校验的。 那什么是码距呢&#xff1f;任何一种编码都由许多码字组成的&#xff0c;任意两个码字之间最少变化的二进制位数就称为数据校验码的码距。 对于这个概念可以这样理解&#xff1a;想象一个地图上的城市网络&#xff0c;每个城市代表一…

STM32时钟配置图详解

一图概述&#xff1a; 左侧输入时钟源 Input Frequency (LSE/LSI/HSI/HSE) LSE (Low-Speed External)&#xff1a;外部32.768 kHz晶体振荡器&#xff0c;通常用于RTC&#xff08;实时时钟&#xff09;。LSI (Low-Speed Internal)&#xff1a;内部低速时钟&#xff0c;频率为…

C# 混淆加密大师1.2.5更新功能介绍, 附CSDN下载链接

C#混淆加密大师支持 .Net Framework 2.0到.Net Framework 4.x&#xff0c;以及.NET Core 2.0至最新的.NET 8版本的C#程序, 包括Winform、WPF、Unity游戏以及控制台程序的混淆加密, 可有效保护C#程序代码&#xff0c;防止非法复制或篡改, 保护知识产权. 特性 1. 支持多种不同的…

虚拟机苹果系统的QT安装体验

前言 苹果系统MacOS中除了安装XCode&#xff0c;完全可以安装QT。本质上来讲&#xff0c;苹果系统就是Linux改装版本&#xff0c;实际上和Ubuntu非常的接近。 1、Mac对应的QT安装包的下载 安装参考链接&#xff1a;MacOS下Qt 5开发环境安装与配置_macos qt-CSDN博客 苹果系统…

宠物空气净化器测评:霍尼韦尔、希喂、米家、有哈、范罗士哪款吸浮毛效果好

作为一个忙碌、精致的搬砖人&#xff0c;我开始是没想过我会养带毛的动物的。自己就很忙了&#xff0c;哪有时间清理宠物弄脏的房间。无奈&#xff0c;三年前某天下班&#xff0c;刚进到小区就被楼下一只小流浪缠上了。买了两根火腿肠喂了还不够&#xff0c;非得跟着我到单元楼…

Jedis,SpringDataRedis

快速入门 导入依赖 <!--jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency><!--单元测试--><dependency><groupId>org.ju…

SPI子系统

IO特性 SPI接口一般使用四条信号线通信&#xff1a; SDI&#xff08;数据输入&#xff09;&#xff0c;SDO&#xff08;数据输出&#xff09;&#xff0c;SCK&#xff08;时钟&#xff09;&#xff0c;CS&#xff08;片选&#xff09; MISO&#xff1a; 主设备输入/从设备输出…

每日刷题(二分)

E. Klees SUPER DUPER LARGE Array!!! https://codeforces.com/contest/2009/problem/E 思路&#xff1a; 题目让我们求从k开始的n个数的前k个数的和与剩下的数的和的差最小是多少&#xff0c;可以用数学思维O(1)求解&#xff0c;都是我数学比较差&#xff0c;我们这里用二分…

企业财税自动化解决方案的成本效益分析与投资回报预测

随着企业规模的扩大和业务复杂度的增加&#xff0c;企业在财务管理方面也面临着诸多挑战&#xff0c;传统的财务管理方式逐渐无法满足企业经营需求&#xff0c;借助财税自动化解决方案来提高财务效率和准确性、降低人力成本&#xff0c;为企业带来长期的效益提升&#xff0c;已…