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

Python实现直线与旋转椭圆交点自动求解及点投影问题

旋转椭圆与直线交点自动求解方案

需求说明

自动计算过椭圆中心与红色动点的直线和旋转椭圆的交点;当红色动点位于椭圆内部时,将该点沿直线延长投影至椭圆边缘。

现有尝试的错误原因

1. 联立方程法失效原因

你使用的椭圆方程是未旋转的标准形式,但实际椭圆是绕中心旋转后的状态,直接代入直线方程计算会完全偏离真实交点。必须先通过坐标旋转变换,将旋转椭圆转换为坐标轴对齐的标准椭圆,计算完成后再转换回原坐标系。

2. 角度法失效原因

参数t的计算公式逻辑错误,错误地将动点方向角与椭圆轴的角度做减法,没有正确建立动点方向与旋转椭圆参数方程的映射关系。

可行代码实现

以下代码通过坐标旋转变换解决旋转椭圆的交点/投影问题,逻辑清晰且计算准确:

import cv2
import numpy as np

# 椭圆核心参数
ellipse_center = np.array([238, 239], dtype=np.float64)
ellipse_axes = np.array([150, 100], dtype=np.float64)  # 半长轴、半短轴长度
ellipse_angle = np.radians(70)  # 椭圆旋转角度(弧度)

# 红色动点初始坐标
moving_point = np.array([341, 125], dtype=np.float64)

# 初始化OpenCV窗口
window_name = "Projecting Point on Rotated Ellipse"
cv2.namedWindow(window_name)
canvas = np.zeros((400, 400, 3), dtype=np.uint8)

# 创建旋转变换矩阵:将原坐标系旋转,使椭圆轴与坐标轴对齐
rotation_matrix = np.array([
    [np.cos(ellipse_angle), np.sin(ellipse_angle)],
    [-np.sin(ellipse_angle), np.cos(ellipse_angle)]
])

while True:
    # 清空画布
    canvas.fill(0)

    # 绘制旋转椭圆
    cv2.ellipse(canvas, 
                tuple(ellipse_center.astype(int)), 
                tuple(ellipse_axes.astype(int)),
                np.degrees(ellipse_angle), 
                0, 360, 
                (255, 255, 255), 2)
    # 绘制红色动点
    cv2.circle(canvas, tuple(moving_point.astype(int)), 5, (0, 0, 255), -1)
    # 绘制椭圆中心
    cv2.circle(canvas, tuple(ellipse_center.astype(int)), 5, (0, 255, 255), -1)
    # 绘制动点与中心的连线
    cv2.line(canvas, tuple(moving_point.astype(int)), tuple(ellipse_center.astype(int)), (0, 0, 255), 1)

    # 1. 将动点转换到椭圆的局部坐标系(消除旋转影响)
    local_point = rotation_matrix @ (moving_point - ellipse_center)
    # 计算动点相对于椭圆中心的方向向量(避免除以0)
    norm = np.linalg.norm(local_point)
    direction_vec = local_point / norm if norm != 0 else np.array([1.0, 0.0])
    # 2. 在局部坐标系中,找到椭圆上同方向的点(标准椭圆参数方程)
    local_ellipse_point = ellipse_axes * direction_vec
    # 3. 将点转换回原坐标系
    projection_point = ellipse_center + rotation_matrix.T @ local_ellipse_point

    # 绘制绿色投影/交点
    cv2.circle(canvas, tuple(projection_point.astype(int)), 5, (0, 255, 0), -1)

    # 显示画布,按q退出
    cv2.imshow(window_name, canvas)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 清理窗口
cv2.destroyAllWindows()

代码逻辑说明

  1. 坐标旋转变换:通过旋转矩阵将原坐标系转换为椭圆的局部坐标系,使椭圆变为坐标轴对齐的标准形式,简化计算。
  2. 方向向量计算:找到动点相对于椭圆中心的方向,确保投影点在同一直线上。
  3. 逆变换回原坐标系:将局部坐标系中得到的椭圆上的点,通过逆旋转矩阵转换回原图像坐标系,得到最终的投影/交点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:39:52