首页 > 编程语言 >空间三点求圆心程序设计及实现【vb.Net】

空间三点求圆心程序设计及实现【vb.Net】

时间:2024-12-17 22:02:49浏览次数:6  
标签:Dim vb Double Next 圆心 y1 Net x1 z1

已知空间三点的三维坐标,求这三个点所确定的空间圆的圆心坐标和半径。

这是测绘领域经常会碰到的问题,今天示例关于这个空间三点求圆心程序的实现过程。

1、基础理论——空间三点确定圆心

已知空间三点的坐标为(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),求这三个点所确定的空间圆的圆心坐标和半径。

根据圆心到三点的距离都为半径可列出下列三式:

由(1)=(2)得:

由(1)=(3)得:

联立(4)、(5)、(6)可得:

2、界面设计

所用Visual Studio为2015版本,调用控件构建如下界面,

主要通过手输坐标进行单次计算,如果想通过读取文本数据批量计算,可以结合我之前的文章:txt文本读取、保存的代码实现【vb.Net】

用一组数据测试的程序运行结果如下:

3、程序实现

本程序的整个工程文件资源已经上传,想用的话可以在这里下载(免费):

空间三点计算圆心三维坐标及半径_工程文件

重点主要有两个,

(1)理论公式的实现,这部分的代码如下:

Public Function qiuyuanxin(ByVal p1(,) As Double, ByVal p2(,) As Double, ByVal p3(,) As Double, ByRef yuanxin(,) As Double) As Double
        '------------------空间三点求圆心
        Dim x1 As Double, x2 As Double, x3 As Double
        Dim y1 As Double, y2 As Double, y3 As Double
        Dim z1 As Double, z2 As Double, z3 As Double
        x1 = p1(1, 1)
        y1 = p1(1, 2)
        z1 = p1(1, 3)
        x2 = p2(1, 1)
        y2 = p2(1, 2)
        z2 = p2(1, 3)
        x3 = p3(1, 1)
        y3 = p3(1, 2)
        z3 = p3(1, 3)
        Dim A1 As Double, B1 As Double, C1 As Double, D1 As Double
        A1 = y1 * z2 - y1 * z3 - z1 * y2 + z1 * y3 + y2 * z3 - y3 * z2
        B1 = x1 * z3 - x1 * z2 + z1 * x2 - z1 * x3 - x2 * z3 + x3 * z2
        C1 = x1 * y2 - x1 * y3 - y1 * x2 + y1 * x3 + x2 * y3 - x3 * y2
        D1 = x1 * y3 * z2 - x1 * y2 * z3 + x2 * y1 * z3 - x3 * y1 * z2 - x2 * y3 * z1 + x3 * y2 * z1
        Dim A2 As Double
        Dim B2 As Double
        Dim C2 As Double
        Dim D2 As Double
        A2 = (x2 - x1) * 2
        B2 = (y2 - y1) * 2
        C2 = (z2 - z1) * 2
        D2 = x1 ^ 2 + y1 ^ 2 + z1 ^ 2 - x2 ^ 2 - y2 ^ 2 - z2 ^ 2
        Dim A3 As Double
        Dim B3 As Double
        Dim C3 As Double
        Dim D3 As Double
        A3 = (x3 - x1) * 2
        B3 = (y3 - y1) * 2
        C3 = (z3 - z1) * 2
        D3 = x1 ^ 2 + y1 ^ 2 + z1 ^ 2 - x3 ^ 2 - y3 ^ 2 - z3 ^ 2
        Dim a(3, 3) As Double
        Dim B(,) As Double
        Dim C(3, 3) As Double
        Dim D(3, 1) As Double
        Dim m(3, 1) As Double
        D(1, 1) = D1
        D(2, 1) = D2
        D(3, 1) = D3
        a(1, 1) = A1
        a(1, 2) = B1
        a(1, 3) = C1
        a(2, 1) = A2
        a(2, 2) = B2
        a(2, 3) = C2
        a(3, 1) = A3
        a(3, 2) = B3
        a(3, 3) = C3
        Call jzqn(a, B)
        For i = 1 To 3
            For j = 1 To 3
                C(i, j) = B(i, j) * (-1)
            Next j
        Next i
        For i = 1 To 3
            For k = 1 To 3
                m(i, 1) = m(i, 1) + C(i, k) * D(k, 1) '矩阵相乘
            Next k
        Next i
        For i = 1 To 3
            yuanxin(1, i) = m(i, 1)
        Next i
        '求半径
        yuanxin(1, 4) = Math.Sqrt((x1 - yuanxin(1, 1)) ^ 2 + (y1 - yuanxin(1, 2)) ^ 2 + (z1 - yuanxin(1, 3)) ^ 2)
    End Function

(2)其中调用的矩阵求逆函数jzqn( ),这部分的代码如下:

    Public Function jzqn(ByVal qa(,) As Double, ByRef na(,) As Double) As Double
        '-------------------------------------------矩阵求逆
        Dim a(,)
        Dim zj As Double, xxx As Double, q As Integer
        Dim n = UBound(qa, 1)
        ReDim na(n, n)
        ReDim a(n, 2 * n)
        For i = 1 To n
            For j = 1 To n
                a(i, j) = qa(i, j)
            Next j
        Next i
        For i = 1 To n
            For j = n + 1 To 2 * n
                If j - i = n Then
                    a(i, j) = 1
                Else
                    a(i, j) = 0
                End If
            Next j
        Next i
        For i = 1 To n
            If a(i, i) = 0 Then
                For q = i To n
                    If a(q, i) <> 0 Then
                        For w = i To 2 * n
                            zj = a(i, w)
                            a(i, w) = a(q, w)
                            a(q, w) = zj
                        Next w
                        Exit For
                    End If
                Next q
                If q > n Then
                    MsgBox("此矩阵不可逆")
                    Exit Function
                End If
            End If
            For k = 2 * n To i Step -1
                a(i, k) = a(i, k) / a(i, i)
            Next k
            For j = i + 1 To n
                If a(j, i) <> 0 Then
                    For k = 2 * n To i Step -1
                        a(j, k) = a(j, k) / a(j, i) - a(i, k)
                    Next k
                End If
            Next j
        Next i
        For i = n To 1 Step -1
            If a(i, i) = 0 Then
                For q = i - 1 To 1 Step -1
                    If a(q, i) <> 0 Then
                        For w = i To 2 * n
                            zj = a(i, w)
                            a(i, w) = a(q, w)
                            a(q, w) = zj
                        Next w
                        Exit For
                    End If
                Next q
            End If
            For k = 2 * n To i Step -1
                a(i, k) = a(i, k) / a(i, i)
            Next k
            For j = i - 1 To 1 Step -1
                If a(j, i) <> 0 Then
                    xxx = a(j, i)
                    For k = 2 * n To 1 Step -1
                        a(j, k) = a(j, k) / xxx - a(i, k)
                    Next k
                End If
            Next j
        Next i
        For i = 1 To n
            For j = 1 To n
                na(i, j) = a(i, j + n)
            Next j
        Next i
    End Function

如果是习惯C++的朋友,矩阵求逆可以参考我之前写的这篇文章:N阶矩阵求逆的方法及代码实现【C++】

欢迎交流!

标签:Dim,vb,Double,Next,圆心,y1,Net,x1,z1
From: https://blog.csdn.net/qq_34451885/article/details/144454052

相关文章

  • GCNet的简述
    其中了解self-attention知道他的计算量是GlobalContextAttention计算量变少从变成NL:(a)首先resize成C×HW然后通过1×1的卷积生成q,k,v,然后q乘变成HW×HW,然后通过softmax进行归一化然后和v进行乘,再通过1×1的卷积,再和原图进行相加也就是特征融合由于不同位置的q对应热图......
  • .NET周刊【12月第2期 2024-12-08】
    国内文章终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名)https://www.cnblogs.com/sheng_chao/p/18581139升讯威在线客服与营销系统由.netcore和WPF开发,旨在开放、开源、共享。开发者为解决360与其他国产管家的误报问题,采用数字签名以提升软件安全性。使用S......
  • CSCI-GA.2662 Data Communications & Networks
    ComputerScienceDepartmentCourant Institute of Mathematical SciencesCourseTitle: DataCommunications&NetworksCourseNumber: CSCI-GA.2662-001Assignment 8: Final ProjectI. DueFridayDecember20,2024by 11:59pmEST.II. ObjectivesSoftwar......
  • 【Netty】IO模型
    官方参考:https://gee.cs.oswego.edu/dl/cpjslides/nio.pdf 1)BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理,线程开销大。2)NIO:一个请求一个线程,客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到该连接有I/O请求时才启动一个线程进行处理......
  • .NET Core 异常(Exception)底层原理浅谈
    中断与异常模型图内中断内中断是由CPU内部事件引起的中断,通常是在程序执行过程中由于CPU自身检测到某些异常情况而产生的。例如,当执行除法运算时除数为零,或者访问了不存在的内存地址,CPU就会产生内中断。硬件异常CPU内部产生的异常事件故障Fault故障是在指令执行过......
  • 采集SNMP转profinet IO项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 24 配置网关采集SNMP协议数据 25 用PROFINETIO协议转发数据 36 案例总结 61 案例说明设置网关采集SNMP协议设备数据把采集的数据转成profinetIO协议转发给其他系统。2 VFBOX网关工作原理VFBOX网关是协议转换网关,......
  • ip地址解析-纯真(CZ88.net) 中国IP地理位置数据库首创者
    纯真(CZ88.NET)自2005年起一直为广大社区用户提供社区版IP地址库,只要获得纯真的授权就能免费使用,并不断获取后续更新的版本。如果有需要免费版IP库的朋友可以前往纯真的官网进行申请。纯真除了免费的社区版IP库外,还提供数据更加准确、服务更加周全的商业版IP地址查询数据。纯真......
  • C#/.NET/.NET Core技术前沿周刊 | 第 17 期(2024年12.09-12.15)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等。......
  • AlexNet: ImageNet Classification with Deep Convolutional Neural Networks
    摘要:在ImageNet竞赛中,主要使用8层(5个卷积层、三个全连接层),其中在第1,2,5层使用最大池化,三个全连接层使用softmax非线性激活。实现图像分类,正是AlexNet网络模型的结构,在传统的神经网络模型中,使用非饱和和高效的CPU来卷积操作,同时也是用“dropout”(正则化)来减少过拟合。1介绍对于......
  • 用vb6拖拽生成tkinter界面
     http://pan.baidu.com/s/1kVLOrIn#list/path=%2F 0.简介这是一个VB6的ADDIN(外接程序),用于使用VB6开发工具直接拖放控件,直接可视化完成Python的TKinter的GUI布局和设计,可以在VB界面上设置控件的一些属性,最终自动生成必要的代码(包括回调函数框架),代码生成后仅需要在对......