python计算线段夹角

计算两条线段之间的夹角

1. 问题与解决思路

在这里插入图片描述

如上图所示,要求图中线段AB,CD之间的夹角(AB,CD都没有方向),可以按照如下步骤计算:

  1. 计算AB线段与X轴的夹角.
  2. 计算CD线段与Y轴的夹角.
  3. 合并两个夹角,因为求的是最小角度,所以需要对180进行求余,得到的角度为最后结果.

2. 具体步骤

首先计算出AB线段与X轴的夹角,将AB线段进行分解,如下图:

在这里插入图片描述

其中角度的计算公式为

◬=arctan(dy/dx)

同理求得CD线段与X轴的角度,这里存在一个问题,由于线段不是向量,因此角度可能为60°,也可能为360°-60°=300°,因此后续合并两个角度的时候需要解决这个问题.

合并的原理也比较简单,由于用python的math.atan2(y,x)函数计算线段与X轴夹角,返回的角度在[-180,180],也就是说在1,2象限为正数,3,4象限为负数,在合并两个夹角时考虑正负号,计算完成后再对180°求余即可.

1.3 代码

import math

class Point:
    """
    2D坐标点
    """
    def __init__(self, x, y):
        self.X = x
        self.Y = y


class Line:
    def __init__(self, point1, point2):
        """
        初始化包含两个端点
        :param point1:
        :param point2:
        """
        self.Point1 = point1
        self.Point2 = point2


def GetAngle(line1, line2):
    """
    计算两条线段之间的夹角
    :param line1:
    :param line2:
    :return:
    """
    dx1 = line1.Point1.X - line1.Point2.X
    dy1 = line1.Point1.Y - line1.Point2.Y
    dx2 = line2.Point1.X - line2.Point2.X
    dy2 = line2.Point1.Y - line2.Point2.Y
    angle1 = math.atan2(dy1, dx1)
    angle1 = int(angle1 * 180 / math.pi)
    # print(angle1)
    angle2 = math.atan2(dy2, dx2)
    angle2 = int(angle2 * 180 / math.pi)
    # print(angle2)
    if angle1 * angle2 >= 0:
        insideAngle = abs(angle1 - angle2)
    else:
        insideAngle = abs(angle1) + abs(angle2)
        if insideAngle > 180:
            insideAngle = 360 - insideAngle
    insideAngle = insideAngle % 180
    return insideAngle

if __name__ == '__main__':
    L1 = Line(Point(0, 0), Point(-2, 0))
    L2 = Line(Point(0, 0), Point(2, 0))
    res = GetAngle(L1, L2)
    print(res) # 结果为0°
  • 15
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中,计算线段夹角可以使用向量的方法来实现。具体步骤如下: 1. 首先,需要计算两条线段的向量表示。假设线段AB和线段CD,可以通过计算向量AB和向量CD的坐标差得到。 2. 然后,计算两个向量的点积。点积可以通过将两个向量的对应坐标相乘,并将结果相加得到。 3. 接下来,计算两个向量的模长。模长可以通过将向量的坐标平方并求和,然后取平方根得到。 4. 最后,使用点积和模长的关系计算夹角的余弦值。夹角的余弦值等于两个向量的点积除以两个向量的模长乘积。 5. 使用math库中的acos函数,将夹角的余弦值作为参数,计算夹角的弧度值。 下面是一个示例代码,演示如何计算线段夹角: ```python import math def calculate_angle(segment1, segment2): # 计算向量表示 vector1 = (segment1[1][0] - segment1[0][0], segment1[1][1] - segment1[0][1]) vector2 = (segment2[1][0] - segment2[0][0], segment2[1][1] - segment2[0][1]) # 计算点积 dot_product = vector1[0] * vector2[0] + vector1[1] * vector2[1] # 计算模长 length1 = math.sqrt(vector1[0] ** 2 + vector1[1] ** 2) length2 = math.sqrt(vector2[0] ** 2 + vector2[1] ** 2) # 计算夹角的余弦值 cos_angle = dot_product / (length1 * length2) # 计算夹角的弧度值 angle = math.acos(cos_angle) return angle # 示例使用 segment1 = ((0, 0), (1, 1)) segment2 = ((0, 0), (-1, 1)) angle = calculate_angle(segment1, segment2) print("夹角的弧度值:", angle) ``` 这段代码中,`segment1`和`segment2`分别表示两条线段的起点和终点坐标。`calculate_angle`函数接受这两个线段作为参数,并返回夹角的弧度值。在示例中,线段AB和线段CD的夹角为45度(π/4弧度)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值