首页 > 其他分享 >已知两圆的圆心半径,求交点坐标——CAD VBA 解决

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

时间:2024-09-10 22:51:46浏览次数:10  
标签:Dim VBA End r1 r2 两圆 Double 交点 CAD

如下图, 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二次开发、插件、代码代写,详情见下方↓

标签:Dim,VBA,End,r1,r2,两圆,Double,交点,CAD
From: https://blog.csdn.net/yongshiqq/article/details/142105409

相关文章

  • 【原理图PCB专题】案例:Cadence能设计一个没有管脚的器件吗?
        在工作中突发奇想,如果Capture原理图中设计一个没有管脚的器件是不是可行?比如说有一些logo,如果在PCB绘制或完成时进行放置,那又怕会忘记。如果说在原理图就能放置,那么导入PCB后就可以直接变成器件的形式,是否就能完美的从设计上解决这个忘记放置的问题?    因......
  • shp文件转换为CAD文件 (第三版) 这个软件的界面颜值挺高的
    上个月写了一个工具是关于shp文件转换为CAD文件,<shp文件转换为CAD文件(dxf格式)>前天写了一篇shp文件转换为CAD文件的博客(公众号),<shp文件转换为CAD文件 (改进版)>今天是周六,也没啥事做,所以我们继续来完善这个小工具吧!有个朋友反映这个小工具的存在可以改进的地方、问题,并......
  • VBA高级应用30例应用3在Excel中的ListObject对象:循环列出当前工作表中的表
    《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级。本套教程共三册三......
  • 什么软件能对CAD文件进行加密?这10款图纸加密工具保你安心
    在当今数字化时代,CAD文件的安全性问题日益凸显。对于设计师和企业来说,保护这些包含宝贵知识产权和核心竞争力的图纸文件免受未经授权的访问和泄露至关重要。为此,市面上涌现出多种CAD文件加密软件,它们提供有效的加密措施来确保图纸文件的安全。1.安秉网盾图纸加密软件安秉网......
  • shp文件转换为CAD文件(dxf格式)
    今天晚上来试一下SHP文件转换为CAD文件。看到一个粉丝留言说能不能实现arcgis图斑转CAD填充的代码。首先我对CAD不熟,基本没接触过,查了查DWG是CAD的专有文件。在网上查资料又发现CAD软件支持DXF格式。昨天写了《三种通过代码创建矢量文件的方法及例子》,依稀记得geopandas就......
  • VBA之Word应用第三章第一节:文档集合Documents 对象
    《VBA之Word应用》(版权10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实例让大家感受到WordVBA的妙处。这套教程是专门针对WORDVBA的教程,是VBA中的稀缺资源,我给这套教程分归为......
  • VBA之Excel应用第三章第一节:对象的层次结构
    《VBA之Excel应用》(版权10178983)是非常经典的,是我推出的第七套教程,定位于初级,目前是第一版修订。这套教程从简单的录制宏开始讲解,一直到窗体的搭建,内容丰富,实例众多。大家可以非常容易的掌握相关的知识,这套教程共三册,十七章,都是我们在利用EXCEL工作过程中需要掌握的知识点,希望大家......
  • 【VBA基础教程篇】Excel-VBA Debug调试相关操作
    Excel-VBADebug调试相关操作在工作窗口,上方菜单栏中,有一个专门的额菜单:Debug菜单,里面有debug相关操作。除此之外你也需要一些辅助窗口来帮助你更好的进行调试,1.Immediatewindow(立即窗口):类似其他IDE的console控制台。显示快捷键:Ctrl+G,也可以点击菜单栏View->Immediatewin......
  • VBA信息获取与处理第三个专题第二节:工作簿和工作表模块代码(Workbook And Sheet Modul
    《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、......
  • (VUE查看三维CAD图纸)在线三维CAD中创建一个三维管道模型
    前言在网页CAD中进行三维建模是一项有趣的任务。本文将介绍如何利用mxcad3d来创建三维管道模型。该工具提供了一系列三维建模功能的API,使得建立复杂的管道结构变得简单直观。公众号:梦想云图网页CAD。安装在此之前,需要先安装mxcad包,安装的步骤可以查看梦想CAD官方的入门教程:https://......