原始问题:
给一个Vector3d向量作为圆心,给定半径r,以及一个射线(起始点和方向,都是vector3d),求射线和球面交点坐标
假设圆心为C,射线起始点为P,方向向量为D,球面交点为Q。
首先,我们需要计算射线与球面的交点。可以通过以下步骤来求解:
- 将射线方程表示为参数形式:P + t * D,其中 t 是参数。
- 将射线方程代入球面方程,得到交点坐标:(P + t D - C) · (P + t D - C) = r^2,其中 · 表示向量的点积。
- 展开上述方程并整理,得到一个关于 t 的二次方程:t^2 (D · D) + 2t (D · (P - C)) + (P - C) · (P - C) - r^2 = 0。
- 解这个二次方程,得到 t 的两个解 t1 和 t2。
- 将 t1 和 t2 分别代入射线方程,得到两个交点坐标 Q1 和 Q2。
注意,如果二次方程没有实数解,说明射线与球面没有交点。
下面是一个示例代码,用于计算射线和球面的交点坐标:
import math
from typing import Tuple
from numpy import dot
from numpy.linalg import norm
from numpy import array
class Vector3d:
def __init__(self, x: float, y: float, z: float):
self.x = x
self.y = y
self.z = z
def intersect_ray_sphere(center: Vector3d, radius: float, ray_origin: Vector3d, ray_direction: Vector3d) -> Tuple[Vector3d, Vector3d]:
# 计算射线方向的单位向量
ray_dir_normalized = ray_direction / norm(ray_direction)
# 计算射线与球心的向量
ray_to_center = center - ray_origin
# 计算射线与球心的距离
distance_to_center = dot(ray_to_center, ray_dir_normalized)
# 计算射线与球面的切点到球心的距离
distance_to_surface_squared = norm(ray_to_center)**2 - distance_to_center**2
# 判断射线是否与球面相交
if distance_to_surface_squared > radius**2:
# 没有交点
return None, None
# 计算射线与球面的交点到球心的距离
distance_to_intersection = math.sqrt(radius**2 - distance_to_surface_squared)
# 计算交点坐标
intersection1 = ray_origin + (distance_to_center - distance_to_intersection) * ray_dir_normalized
intersection2 = ray_origin + (distance_to_center + distance_to_intersection) * ray_dir_normalized
return intersection1, intersection2
# 示例用法
center = Vector3d(0, 0, 0)
radius = 1.0
ray_origin = Vector3d(1, 1, 1)
ray_direction = Vector3d(-1, -1, -1)
intersection1, intersection2 = intersect_ray_sphere(center, radius, ray_origin, ray_direction)
print("Intersection 1:", intersection1.x, intersection1.y, intersection1.z)
print("Intersection 2:", intersection2.x, intersection2.y, intersection2.z)请注意,上述代码使用了numpy库来进行向量运算,需要提前安装。
给一个Vector3d向量作为圆心,给定半径r,以及一个射线(起始点和方向,都是vector3d),求射线和球面交点坐标
https://www.aiaiask.com/ask/45850.html
Prev:《水热法制备0.4克CdZnS所需原料Cd(CH3COO)2·2H2O、Zn(CH3COO)2·2H2O及Na2S·9H2O的用量》