[Geometric Mathematics] [Python] [C++] Extend the line segment along the direction of the line segment by a certain length, and find a new point

Points p1 and p2 are the two ends of a line segment. Extend the length of the line segment by length x along the direction from p1 to p2, and find the extended point ep. As shown below:
insert image description here

Python code:

import math


def extend_line_segment(p1, p2, extension_length):
    """
    延伸线段长度并返回延伸后的点坐标

    参数:
    p1: list,起始点的坐标 [x1, y1]
    p2: list,结束点的坐标 [x2, y2]
    extension_length: float,延伸长度

    返回值:
    list,延伸后的点的坐标 [x, y]
    """
    # 计算p1指向p2的向量
    vector = [p2[0] - p1[0], p2[1] - p1[1]]

    # 计算向量的模
    magnitude = math.sqrt(vector[0] ** 2 + vector[1] ** 2)

    # 单位化向量
    unit_vector = [vector[0] / magnitude, vector[1] / magnitude]

    # 判断线段是否水平或垂直
    if p1[0] == p2[0]:  # 垂直线段
        extended_point = [p2[0], p2[1] + extension_length]
    elif p1[1] == p2[1]:  # 水平线段
        extended_point = [p2[0] + extension_length, p2[1]]
    else:  # 其他情况
        # 计算延伸后的点
        extended_point = [p2[0] + unit_vector[0] * extension_length, p2[1] + unit_vector[1] * extension_length]

    return extended_point


if __name__ == '__main__':
    p1 = [10, 200]
    p2 = [110, 100]

    extend_p = extend_line_segment(p1, p2, 300)
    print("延伸后的点坐标: ", extend_p)

    # 绘制图
    import matplotlib.pyplot as plt

    plt.plot([p1[0], p2[0]], [p1[1], p2[1]], 'r-')
    plt.plot([p2[0], extend_p[0]], [p2[1], extend_p[1]], 'b-')
    # 加注释
    plt.annotate('p1', xy=(p1[0], p1[1]), xytext=(p1[0], p1[1]))
    plt.annotate('p2', xy=(p2[0], p2[1]), xytext=(p2[0], p2[1]))
    plt.annotate('ep', xy=(extend_p[0], extend_p[1]), xytext=(extend_p[0] + 5, extend_p[1] + 5))
    # 等距
    plt.axis('equal')
    plt.show()

C++:

cv::Point2f extend_line_segment(const cv::Point2f& p1, const cv::Point2f& p2, double extension_length) {
    
    
    // 计算p1指向p2的向量
    cv::Point2f vector = {
    
    p2.x - p1.x, p2.y - p1.y};

    // 计算向量的模
    double magnitude = sqrt(vector.x * vector.x + vector.y * vector.y);

    // 单位化向量
    cv::Point2f unit_vector = {
    
    static_cast<float>(vector.x / magnitude), static_cast<float>(vector.y / magnitude)};

    // 判断线段是否水平或垂直
    if (p1.x == p2.x) {
    
      // 垂直线段
        cv::Point2f extended_point = {
    
    p2.x, static_cast<float>(p2.y + extension_length)};
        return extended_point;
    } else if (p1.y == p2.y) {
    
      // 水平线段
        cv::Point2f extended_point = {
    
    static_cast<float>(p2.x + extension_length), p2.y};
        return extended_point;
    } else {
    
      // 其他情况
        // 计算延伸后的点
        cv::Point2f extended_point = {
    
    static_cast<float>(p2.x + unit_vector.x * extension_length), static_cast<float>(p2.y + unit_vector.y * extension_length)};
        return extended_point;
    }
}

Guess you like

Origin blog.csdn.net/x1131230123/article/details/131478087