首页 > 编程语言 >三点共圆的计算代码(Python版本)

三点共圆的计算代码(Python版本)

时间:2022-10-14 12:12:47浏览次数:47  
标签:三点 p3 p1 y1 Python p2 共圆 np x1

  • 已知三点坐标,计算圆心和半径
def calc_circle_center_and_radius(p1, p2, p3):

    x1 = p1.x
    y1 = p1.y
    z1 = p1.z

    x2 = p2.x
    y2 = p2.y
    z2 = p2.z

    x3 = p3.x
    y3 = p3.y
    z3 = p3.z

    a1 = (y1*z2 - y2*z1 - y1*z3 + y3*z1 + y2*z3 - y3*z2)
    b1 = -(x1*z2 - x2*z1 - x1*z3 + x3*z1 + x2*z3 - x3*z2)
    c1 = (x1*y2 - x2*y1 - x1*y3 + x3*y1 + x2*y3 - x3*y2)
    d1 = -(x1*y2*z3 - x1*y3*z2 - x2*y1*z3 + x2*y3*z1 + x3*y1*z2 - x3*y2*z1)

    a2 = 2 * (x2 - x1)
    b2 = 2 * (y2 - y1)
    c2 = 2 * (z2 - z1)
    d2 = x1*x1 + y1*y1 + z1*z1 - x2*x2 - y2*y2 - z2*z2

    a3 = 2 * (x3 - x1)
    b3 = 2 * (y3 - y1)
    c3 = 2 * (z3 - z1)
    d3 = x1*x1 + y1*y1 + z1*z1 - x3*x3 - y3*y3 - z3*z3

    x = -(b1*c2*d3 - b1*c3*d2 - b2*c1*d3 + b2*c3*d1 + b3*c1*d2 - b3*c2*d1) /\
        (a1*b2*c3 - a1*b3*c2 - a2*b1*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1)
    y = (a1*c2*d3 - a1*c3*d2 - a2*c1*d3 + a2*c3*d1 + a3*c1*d2 - a3*c2*d1) /\
        (a1*b2*c3 - a1*b3*c2 - a2*b1*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1)
    z = -(a1*b2*d3 - a1*b3*d2 - a2*b1*d3 + a2*b3*d1 + a3*b1*d2 - a3*b2*d1) /\
        (a1*b2*c3 - a1*b3*c2 - a2*b1*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1)

    ptCenter = Point(x, y, z)
    radius = math.sqrt((x1 - x)*(x1 - x) + (y1 - y)
                       * (y1 - y) + (z1 - z)*(z1 - z))

    return ptCenter, radius

  • 计算圆的单位法向量
def calc_norm_3d(p1, p2, p3):

    n0 = (p2.y-p1.y)*(p3.z-p1.z)-(p3.y-p1.y)*(p2.z-p1.z)
    n1 = (p2.z-p1.z)*(p3.x-p1.x)-(p3.z-p1.z)*(p2.x-p1.x)
    n2 = (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y)

    n = np.array([n0, n1, n2])
    n_norm = np.linalg.norm(n)
    n = n/n_norm
    return n
  • 获取圆的参数表示
    n = calc_norm_3d(p1, p2, p3)

    c, r = calc_circle_center_and_radius(p1, p2, p3)

    d1 = np.array([p1.x-c.x, p1.y-c.y, p1.z-c.z])
    d2 = np.array([p2.x-c.x, p2.y-c.y, p2.z-c.z])
    d3 = np.array([p3.x-c.x, p3.y-c.y, p3.z-c.z])
    n1 = np.array([p1.x-c.x, p1.y-c.y, p1.z-c.z])
    n1_norm = np.linalg.norm(n1)
    n1 = n1/n1_norm

    n2 = np.cross(n, n1)

    cos_angle = d1.dot(d3)/(np.linalg.norm(d1)*np.linalg.norm(d3))
    theta = np.arccos(cos_angle)

    theta_list = np.linspace(0, theta, 10)

    # Points on the arc from p1 to p3
    for i in range(0, 10):
        x = c.x + r*n1[0]*np.cos(theta_list[i]) + r*n2[0]*np.sin(theta_list[i])
        y = c.y + r*n1[1]*np.cos(theta_list[i]) + r*n2[1]*np.sin(theta_list[i])
        z = c.z + r*n1[2]*np.cos(theta_list[i]) + r*n2[2]*np.sin(theta_list[i])

标签:三点,p3,p1,y1,Python,p2,共圆,np,x1
From: https://www.cnblogs.com/spyplus/p/16791178.html

相关文章

  • python切片;列表增删改查;列表(加乘法);列表表达式
         [开始:结束:步长] 倒序输出 2、列表增删改查(1)append()   一次只能添加一个元素 (2)extend()方法,一次课添加一个可迭代对象   extend()方法的参数必......
  • python-时间操作
    1. 获取当前时间importtime# 获取当前日期时间 返回值:当前日期时间defget_now_time():now=time.localtime()now_time=time.strftime("%Y-%m-......
  • Python人工智能经典算法之线性回归
    1.9k近邻算法总结[**]优点:1.简单有效2.重新训练代价底3.适合类域交叉样本4.适合大样本自动分类缺点:1.惰性学习2......
  • Python爬虫之数据提取概述
    数据提取概述知识点了解响应内容的分类了解xml和html的区别1.响应内容的分类在发送请求获取响应之后,可能存在多种不同类型的响应内容;而且很多时候,我们只需要响应内容中的......
  • Python爬虫之数据提取-selenium定位获取标签对象并提取数据
    selenium提取数据知识点:了解driver对象的常用属性和方法掌握driver对象定位标签元素获取标签对象的方法掌握标签对象提取文本和属性值的方法1.driver对象的常用属性和方......
  • Python爬虫之scrapy的日志信息与配置
    scrapy的日志信息与配置学习目标:了解scrapy的日志信息掌握scrapy的常用配置掌握scrapy_redis配置了解scrapy_splash配置了解scrapy_redis和scrapy_splash配合使用的配置1......
  • Python爬虫之数据提取-selenium的其它使用方法
    selenium的其它使用方法知识点:掌握selenium控制标签页的切换掌握selenium控制iframe的切换掌握利用selenium获取cookie的方法掌握手动实现页面等待掌握selenium控制浏......
  • Python爬虫之mongodb的聚合操作
    mongodb的聚合操作学习目标了解mongodb的聚合原理掌握mongdb的管道命令掌握mongdb的表达式1mongodb的聚合是什么聚合(aggregate)是基于数据处理的聚合管道,每个文档通过......
  • Python爬虫之mongodb的索引操作
    Mongodb的索引操作学习目标掌握mongodb索引的创建,删除操作掌握mongodb查看索引的方法掌握mongodb创建唯一索引的方法1.为什么mongdb需要创建索引加快查询速度进行数据的......
  • Python爬虫之scrapy构造并发送请求
    scrapy数据建模与请求学习目标:应用在scrapy项目中进行建模应用构造Request对象,并发送请求应用利用meta参数在不同的解析函数中传递数据1.数据建模通常在做项目的过程中,......