求圆与竖直平面的交点

最近接触的任务有需要求圆与平面的交点,平面为竖直平面,也就是y为定值。网上搜了半天,没有找到能参考的代码,只能自己写了。

已知条件是圆上三个点。

1. 算出圆心与半径。

def calCircleRAndCenterBy3Point(p1,p2,p3):
    x1 = p1.x
    x2 = p2.x
    x3 = p3.x
    
    y1 = p1.y
    y2 = p2.y
    y3 = p3.y
    
    z1=p1.z
    z2=p2.z
    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
    
    cx = -(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)
    cy =  (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)
    cz = -(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)
    
    pc=FreeCAD.Vector(cx,cy,cz)
    r=(pc-p1).Length
    return r,pc

2. 算出这三个点所确定的平面参数,ax+by+cz+d=0 中的a,b,c,d

def getPanelPara(p1,p2,p3):
    a = (p2.y-p1.y)*(p3.z-p1.z)-(p2.z-p1.z)*(p3.y-p1.y) 
    b = (p2.z-p1.z)*(p3.x-p1.x)-(p2.x-p1.x)*(p3.z-p1.z) 
    c = (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x) 
    d = 0-(a*p1.x+b*p1.y+c*p1.z)
    return a,b,c,d

3. 圆心,半径以及平面方程可以确定圆的方程。

其实就是联立两个方程

(x-x0)^2+(y-y0)^2+(z-z0)^2=R^2

   ax+by+cz+d=0

已知:y,x0,y0,z0,R, a,b,c,d

求 x,z

R,pcenter0=calArcRBy3Point(p1,p2,p3)
a,b,c,d=getPanelPara(p1,p2,p3)
x0=pcenter0.x
y0=pcenter0.y
z0=pcenter0.z

m11=(-d-b*y)/c
m12=-a/c
m13=(y-y0)*(y-y0)
m14=m11-z0

m1=m12*m12+1
m2=2*m12*m14-2*x0
m3=x0*x0+m13+m14*m14-R*R

import math
x_may1=math.sqrt(m2*m2/(4*m1*m1)-m3/m1)-m2/(2*m1)
x_may2=-math.sqrt(m2*m2/(4*m1*m1)-m3/m1)-m2/(2*m1)
                                    
z_may1=m11+m12*x_may1
z_may2=m11+m12*x_may2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值