import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def find_point_on_extension(A, B, distance_from_B=0.5):
"""
在AB延长线上找到点C,使得C到B的距离为指定值
参数:
A, B: 空间两点坐标 (x, y, z)
distance_from_B: C到B的距离
返回:
C: 延长线上的点坐标
direction: 单位方向向量
"""
# 计算向量AB
AB = np.array(B) - np.array(A)
# 计算向量AB的模长
AB_length = np.linalg.norm(AB)
if AB_length == 0:
raise ValueError("点A和点B不能重合")
# 计算单位方向向量
direction = AB / AB_length
# 计算点C的坐标 (从B点沿AB方向延伸指定距离)
C = np.array(B) + direction * distance_from_B
return C, direction
def plot_points_and_line(A, B, C, distance_from_B):
"""
绘制空间中的三个点和连接线
"""
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 提取坐标
x_coords = [A[0], B[0], C[0]]
y_coords = [A[1], B[1], C[1]]
z_coords = [A[2], B[2], C[2]]
# 绘制点
ax.scatter(x_coords, y_coords, z_coords, c=['red', 'blue', 'green'], s=100)
# 绘制线段
# AB线段
ax.plot([A[0], B[0]], [A[1], B[1]], [A[2], B[2]], 'b-', linewidth=2, label='AB线段')
# BC线段
ax.plot([B[0], C[0]], [B[1], C[1]], [B[2], C[2]], 'g--', linewidth=2, label='BC延长线')
# 添加标签
ax.text(A[0], A[1], A[2], ' A', fontsize=12, color='red')
ax.text(B[0], B[1], B[2], ' B', fontsize=12, color='blue')
ax.text(C[0], C[1], C[2], ' C', fontsize=12, color='green')
# 设置坐标轴标签
ax.set_xlabel('X坐标')
ax.set_ylabel('Y坐标')
ax.set_zlabel('Z坐标')
# 添加标题
plt.title(f'空间点延长线计算\nBC距离: {distance_from_B}米')
# 添加图例
ax.legend()
# 设置相等的坐标轴比例,保持图形比例正确
max_range = max(max(x_coords)-min(x_coords),
max(y_coords)-min(y_coords),
max(z_coords)-min(z_coords))
mid_x = (max(x_coords)+min(x_coords)) * 0.5
mid_y = (max(y_coords)+min(y_coords)) * 0.5
mid_z = (max(z_coords)+min(z_coords)) * 0.5
ax.set_xlim(mid_x - max_range*0.6, mid_x + max_range*0.6)
ax.set_ylim(mid_y - max_range*0.6, mid_y + max_range*0.6)
ax.set_zlim(mid_z - max_range*0.6, mid_z + max_range*0.6)
plt.tight_layout()
plt.show()
def calculate_additional_info(A, B, C):
"""
计算并显示额外的几何信息
"""
AB = np.array(B) - np.array(A)
BC = np.array(C) - np.array(B)
AB_length = np.linalg.norm(AB)
BC_length = np.linalg.norm(BC)
AC_length = np.linalg.norm(np.array(C) - np.array(A))
print("\n几何信息:")
print(f"AB距离: {AB_length:.3f} 米")
print(f"BC距离: {BC_length:.3f} 米")
print(f"AC距离: {AC_length:.3f} 米")
# 验证共线性
cross_product = np.linalg.norm(np.cross(AB, BC))
if cross_product < 1e-10:
print("验证: A, B, C 三点共线 ✓")
else:
print("警告: A, B, C 三点不共线 ✗")
# 主程序
if __name__ == "__main__":
# 示例点坐标 (可以修改这些值)
A = np.array([1.0, 2.0, 3.0]) # 点A坐标
B = np.array([4.0, 6.0, 8.0]) # 点B坐标
distance_from_B = 5 # C到B的距离
print("已知点坐标:")
print(f"A: {A}")
print(f"B: {B}")
print(f"目标距离 BC: {distance_from_B} 米")
try:
# 计算点C
C, direction = find_point_on_extension(A, B, distance_from_B)
print(f"\n计算结果:")
print(f"C点坐标: ({C[0]:.3f}, {C[1]:.3f}, {C[2]:.3f})")
print(f"方向向量: ({direction[0]:.3f}, {direction[1]:.3f}, {direction[2]:.3f})")
# 计算额外信息
calculate_additional_info(A, B, C)
# 绘制图形
plot_points_and_line(A, B, C, distance_from_B)
except ValueError as e:
print(f"错误: {e}")
