选择一个点,旋转线段,不改变线段角度

import cv2
import numpy as np

# 初始化两个端点的坐标
pt1 = np.array([100, 100])
pt2 = np.array([300, 300])

# 计算线段的长度
def get_line_length(p1, p2):
    return np.linalg.norm(p2 - p1)

# 计算点a和不动的端点pt2之间的线段,截取出与原线段相同长度的部分
def get_point_on_line(a, fixed_point, length):
    # 计算a和固定端点的方向
    direction = a - fixed_point
    norm_direction = direction / np.linalg.norm(direction)  # 归一化方向
    # 计算截取线段的新端点c,保持长度不变
    new_point = fixed_point + norm_direction * length
    return new_point

# 鼠标点击事件
def mouse_callback(event, x, y, flags, param):
    global p1, p2

    if event == cv2.EVENT_LBUTTONDOWN:
        a = np.array([x, y])
        # 计算离点击点最近的端点
        dist1 = np.linalg.norm(a - p1)
        dist2 = np.linalg.norm(a - p2)

        # 确定需要移动的端点
        if dist1 < dist2:
            # pt1 更近,移动 pt1
            new_pt1 = get_point_on_line(a, p2, get_line_length(p1, p2))
            pt1 = new_pt1  # 更新 pt1
        else:
            # pt2 更近,移动 pt2
            new_pt2 = get_point_on_line(a, p1, get_line_length(p1, p2))
            pt2 = new_pt2  # 更新 pt2

        # 可视化结果
        img = np.ones((500, 500, 3), dtype=np.uint8) * 255  # 白色背景

        # 画更新后的线段
        cv2.line(img, tuple(p1.astype(int)), tuple(p2.astype(int)), (0, 0, 255), 2)  # 画线段

        # 画出鼠标点击点
        cv2.circle(img, tuple(a.astype(int)), 5, (0, 255, 0), -1)  # 鼠标点击点

        # 显示图像
        cv2.imshow('Line Movement', img)

# 创建一个空白图像
img = np.ones((500, 500, 3), dtype=np.uint8) * 255  # 白色背景

# 初始绘制线段
cv2.line(img, tuple(pt1.astype(int)), tuple(pt2.astype(int)), (0, 0, 255), 2)
cv2.imshow('Line Movement', img)

cv2.setMouseCallback('Line Movement', mouse_callback)

cv2.waitKey(0)
cv2.destroyAllWindows()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值