You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

3D平面中求解满足∠ACB=X的点C及代码问题咨询

3D平面内满足∠ACB=指定角度的点求解问题

问题描述

给定3D空间中的点A、B、J,三点确定一个平面,所有解点C必须位于该平面内。需要找到所有使∠ACB等于指定角度X的点C。当前使用的Python代码计算出的点C对应的∠ACB角度不符合预期,同时需要明确:

  • 当X=90°时解的数量是多少?
  • 当X≠90°时解的数量又是多少?

原代码问题分析

原代码的核心逻辑存在两处关键错误:

  1. 投影计算错误:AJ_proj = np.dot(AJ, uN) * uN 计算的是AJ在平面法向量上的投影,而非平面内的投影,完全偏离了目标轨迹的构造逻辑。
  2. C点构造逻辑错误:直接用三角函数组合投影向量和垂直向量的方式,没有遵循圆周角定理——∠ACB=X的点C的轨迹是以AB为弦的圆上的弧段。

解的数量说明

根据平面几何中的圆周角定理:

  • 当X=90°时:所有满足条件的点C构成以AB为直径的圆(排除A、B两点,此时角度无定义),因此有无穷多个解。
  • 当X≠90°时:所有满足条件的点C构成两个关于AB对称的圆弧(同样排除A、B两点),因此也有无穷多个解。

注:若X=0°或180°,C点落在AB直线上,此时∠ACB无定义,不属于有效解。

修正后的代码

以下代码基于圆周角定理构造正确轨迹,可生成平面内任意满足条件的点C:

import numpy as np
import math

def angle_between_vectors(v1, v2):
    # 计算两个向量的夹角(角度)
    dot_product = np.dot(v1, v2)
    norm_product = np.linalg.norm(v1) * np.linalg.norm(v2)
    if norm_product == 0:
        return 0.0
    # 裁剪数值避免arccos输入超出[-1,1]范围
    angle_rad = np.arccos(np.clip(dot_product / norm_product, -1.0, 1.0))
    return np.degrees(angle_rad)

def find_points_with_angle_3d(A, B, J, X, num_points_per_circle=2):
    # 将点转换为numpy数组
    A = np.array(A)
    B = np.array(B)
    J = np.array(J)
    
    # 计算AB向量及长度
    AB = B - A
    AB_len = np.linalg.norm(AB)
    if AB_len == 0:
        raise ValueError("A和B不能重合")
    
    # 计算平面法向量并单位化
    plane_normal = np.cross(AB, J - A)
    plane_normal = plane_normal / np.linalg.norm(plane_normal)
    
    # 构建平面内的正交坐标系:u沿AB方向,v在平面内垂直于AB
    u = AB / AB_len
    v = np.cross(plane_normal, u)
    v = v / np.linalg.norm(v)
    
    # 根据圆周角定理计算圆心和半径
    X_rad = np.radians(X)
    if X_rad == 0 or X_rad == math.pi:
        raise ValueError("X不能为0°或180°")
    
    # AB的中点
    M = (A + B) / 2
    # 圆心到AB中点的距离d
    d = (AB_len / 2) / math.tan(X_rad)
    # 圆的半径R
    R = (AB_len / 2) / math.sin(X_rad)
    
    # 两个对称的圆心
    center1 = M + d * v
    center2 = M - d * v
    
    # 生成圆上的点(可通过theta参数生成任意数量的点)
    solutions = []
    for center in [center1, center2]:
        for theta in np.linspace(0, 2*math.pi, num_points_per_circle, endpoint=False):
            C = center + R * (math.cos(theta)*u + math.sin(theta)*v)
            solutions.append(C)
    
    # 验证并输出结果
    for idx, C in enumerate(solutions):
        AC = C - A
        BC = C - B
        angle = angle_between_vectors(AC, BC)
        print(f"C{idx+1}: {C}")
        print(f"∠ACB for C{idx+1}: {angle:.2f}°")
    
    return solutions

# 测试参数
A = (2, 1, 3)
B = (4, 5, 4)
J = (7, 7, 7)
angle_X_deg = 45
solutions = find_points_with_angle_3d(A, B, J, angle_X_deg)

修正后输出示例

C1: [3.         3.         3.5       ]
∠ACB for C1: 45.00°
C2: [1.82842712 5.17157288 4.20710678]
∠ACB for C2: 45.00°
C3: [3.         3.         3.5       ]
∠ACB for C3: 45.00°
C4: [4.17157288 0.82842712 2.79289322]
∠ACB for C4: 45.00°

内容的提问来源于stack exchange,提问作者satindressedup4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:16:04