检测空间中实心圆与平面是否相交

 问:

三维空间中存在一实心圆和一块无限平面,证明实心圆与平面是否相交。

此题事实上是两个平面相交的问题,一般不平行的两平面相交问题只需要解两平面方程联立的行列式就能得到相交的直线方程了,但是在本题中,存在一个有边界的平面。并不适合直接联立平面方程。

空间圆方程

构成圆的要素有:法向量,圆心坐标,半径

空间中圆的方程一般是应用

球面方程:(x-x0)**2 + (y-y0)**2 + (z-z0)**2 = R**2

联立平面方程: Ax + By + Cz + D = 0

求解所得,但是由于本文只判断空间中的圆与平面是否相交,并不需要讨论空间中圆的确切方程,故仅仅应用确定空间圆的三类特征即可。

平面方程

构成平面的要素有:法向量

平面方程只需要空间中三点即可求得:

点到平面的垂直向量_三尺流流的博客-CSDN博客python实现一些简单空间三维算法https://blog.csdn.net/qq_55433334/article/details/125304475由三点: p1(x1, y1, z1) p2(x2, y2, z2) p3(x3, y3, z3)

求平面方程: Ax + By + Cz + D = 0

解向量n并带入点:

A = (Y2*Z3 - Y2*Z1 - Y1*Z3 - Y3*Z2 + Y1*Z2 + Y3*Z1)

B = (X3*Z2 - X1*Z2 - X3*Z1 - X2*Z3 + X2*Z1 + X1*Z3) 

C = (X2*Y3 - X2*Y1 - X1*Y3 - X3*Y2 + X3*Y1 + X1*Y2)

D = X1*Y3*Z2 + X2*Y1*Z3 + X3*Y2*Z1 - X1*Y2*Z3 - X3*Y1*Z2 - X2*Y3*Z1

相交特征

假设:

空间平面:0*x + 0*y + 1*z = 1

空间圆:圆心:【1,1,1.5】 法向量:【1,-1,1】 半径:1

图中三维空间中有一实心圆与平面相交于虚线L,θ为圆的法向量v1与平面法向量v2的夹角。黄色虚线为圆心垂直于平面的距离。而红色虚线为圆的半径乘sinθ

黄色虚线:dist(p_圆心 - p_垂直投影点)

红色虚线:R*sin()

要想证明实心圆与平面相交,只需要证明红色虚线比黄色虚线要长就行了。

逻辑流

1.导入空间平面与空间圆。

2.圆心对平面做垂直投影,计算两点之间的距离(黄色虚线)。

3.计算平面法向量与圆法向量的夹角θ。

4.求解红色虚线距离: R*sin(θ)。

5.比较红色虚线与黄色虚线的长度,当红色虚线长度大于黄色虚线时,实心圆与平面相交。

完整代码

import numpy as np
import math
# 圆
c = [1,1,1.5]
v = [1,-1,1]
r = 1.5

# 平面
plane = [0,0,1,-1]


# 原点
x, y, z = c
A,B,C,D = plane

# 投影点
xp = ((B ** 2 + C ** 2) * x - A * (B * y + C * z + D)) / (A ** 2 + B ** 2 + C ** 2)
yp = ((A ** 2 + C ** 2) * y - B * (A * x + C * z + D)) / (A ** 2 + B ** 2 + C ** 2)
zp = ((A ** 2 + B ** 2) * z - C * (A * x + B * y + D)) / (A ** 2 + B ** 2 + C ** 2)

dist_pro = np.sqrt(sum((np.asarray(c) - np.asarray([xp,yp,zp])) ** 2))

a = np.array(v)
b = np.array([plane[0],plane[1],plane[2]])
a_norm = np.sqrt(np.sum(a * a))
b_norm = np.sqrt(np.sum(b * b))
cos_value = np.dot(a, b) / (a_norm * b_norm)
arc_value = np.arccos(cos_value)
angle_value = arc_value * 180 / np.pi

dist_comp = 1.5 * math.sin(math.radians(angle_value))




if dist_comp > dist_pro:
    print(dist_comp,dist_pro,"\n圆面相交")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K.K. Salamander

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值