p1点和p2点是一条线段的两端,沿着p1指向p2的方向,将线段长度延伸长度x,求延伸后的点ep。如下图:
Python代码:
pythonimport 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++:
cppcv::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;
}
}
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!