最近接触的任务有需要求圆与平面的交点,平面为竖直平面,也就是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