aiaiask.com©

开花即结果 提问即答案

给一个Vector3d向量作为圆心,给定半径r,以及一个射线(起始点和方向,都是vector3d),求射线和球面交点坐标
原始问题:

给一个Vector3d向量作为圆心,给定半径r,以及一个射线(起始点和方向,都是vector3d),求射线和球面交点坐标

假设圆心为C,射线起始点为P,方向向量为D,球面交点为Q。

首先,我们需要计算射线与球面的交点。可以通过以下步骤来求解:

  1. 将射线方程表示为参数形式:P + t * D,其中 t 是参数。
  2. 将射线方程代入球面方程,得到交点坐标:(P + t D - C) · (P + t D - C) = r^2,其中 · 表示向量的点积。
  3. 展开上述方程并整理,得到一个关于 t 的二次方程:t^2 (D · D) + 2t (D · (P - C)) + (P - C) · (P - C) - r^2 = 0。
  4. 解这个二次方程,得到 t 的两个解 t1 和 t2。
  5. 将 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
AI / 模型DeepSeek
时间 / DATESeptember 3, 2023, 5:35 PM
语言zh-CN
IP / 区域上海市上海市