Python计算点到直线距离、直线间交点夹角

Python计算点到直线距离、直线间交点夹角是比较基础的数学计算,基于向量点积和叉积的概念。

计算点到直线距离

假设有直线L,过点P,直线上有一点A,我们需要计算点P到直线L的距离。假设向量AP和向量AB的点积(dot product)为cosθ:

$$AP·AB = |AP||AB|cosθ$$

则可以得到垂线段的长度:

$$PS = |AP|sinθ = \frac{AP·AB}{|AB|}sinθ$$

因此,点P到直线L的距离为PS。

以下是一条示例:

import math

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Line:
    def __init__(self, p1, p2):
        self.p1 = p1
        self.p2 = p2

def point2line(point, line):
    A = point.x - line.p1.x
    B = point.y - line.p1.y
    C = line.p2.x - line.p1.x
    D = line.p2.y - line.p1.y

    dot = A * C + B * D
    len_sq = C * C + D * D
    param = -1
    if len_sq != 0:
        param = dot / len_sq

    xx = 0
    yy = 0
    if param < 0:
        xx = line.p1.x
        yy = line.p1.y
    elif param > 1:
        xx = line.p2.x
        yy = line.p2.y
    else:
        xx = line.p1.x + param * C
        yy = line.p1.y + param * D

    dx = point.x - xx
    dy = point.y - yy
    return math.sqrt(dx * dx + dy * dy)

计算直线间交点夹角

假设有两条直线L1和L2,它们的法向量分别为n1和n2,则它们的夹角θ可以通过点积计算:

$$\cos(θ) =n_1·n_2$$

如果你需要计算实际的角度值,需要使用反余弦函数acos()。

以下是一条示例:

def vector_angle(v1, v2):
    cos_theta = v1.dot(v2) / math.sqrt(v1.norm() * v2.norm())
    return math.degrees(math.acos(cos_theta))

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def dot(self, v2):
        return self.x * v2.x + self.y * v2.y

    def cross(self, v2):
        return self.x * v2.y - self.y * v2.x

    def norm(self):
        return self.dot(self)

def line2line_angle(line1, line2):
    v1 = Vector(line1.p2.x - line1.p1.x, line1.p2.y - line1.p1.y)
    v2 = Vector(line2.p2.x - line2.p1.x, line2.p2.y - line2.p1.y)
    cross = v1.cross(v2)
    if cross == 0:
        return 0
    sign = cross / abs(cross)
    return sign * vector_angle(v1, v2)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python计算点到直线距离、直线间交点夹角 - Python技术站

(0)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • Python 一键获取百度网盘提取码的方法

    下面是详细的“Python 一键获取百度网盘提取码的方法”的攻略: 1. 前言 随着网络发展,大家越来越依赖云存储,其中百度网盘是其中一个较为常用的云存储服务。在使用百度网盘的过程中,我们可能遇到这样的情况:我们想要下载别人分享的文件,但是又不想添加对方的好友或者进入对方的群组,该怎么办呢?这时候,我们可以使用提取码来下载文件。然而,提取码需要手动获取,有时…

    python 2023年6月2日
    00
  • python-try-except:pass的用法及说明

    当我们在使用Python编写程序过程中,经常会遇到一些异常错误,如文件找不到,除数为0等。为了避免这些错误导致程序异常终止,可以使用 try 和 except 语句来处理异常情况。 try 语句的工作原理是,首先执行 try 后面的语句块,如果执行成功,就直接跳过 except 语句;如果执行过程中出现了异常,则跳转到 except 语句块中处理异常。 如果…

    python 2023年5月13日
    00
  • python 中dict的元素取值操作

    下面是关于Python中dict的元素取值操作的完整攻略。 标准的dict结构 Python中的dict类型是一种键-值对(Key-Value)的数据结构,其基本语法格式为: dict = {key1: value1, key2: value2, key3: value3, … , keyn: valuen} 其中,key是用来标识value的,key和…

    python 2023年5月13日
    00
  • 使用Python-OpenCV消除图像中孤立的小区域操作

    当我们在处理图像时,有时会遇到一些孤立的小区域干扰我们的结果,这时我们可以使用Python-OpenCV库来消除它们。 下面是消除图像中孤立的小区域的完整操作攻略: 1.导入Python-OpenCV库 在Python代码开头,我们需要导入Python-OpenCV库,代码如下: import cv2 2.读取图像 在代码中使用以下代码读取要处理的图像: i…

    python 2023年5月18日
    00
  • Python数组条件过滤filter函数使用示例

    Python数组条件过滤filter函数使用示例 简介 Python中的filter()函数是一种内置函数,它可以快速地按照指定条件过滤出数组中符合要求的元素。该函数返回一个迭代器对象,通过迭代器可以快速访问过滤后的元素。 函数原型 filter(function, iterable) 其中,function是一个布尔类型的函数,用于过滤iterable(可…

    python 2023年6月5日
    00
  • OpenCV 绘制同心圆的示例代码

    绘制同心圆是计算机视觉中常见的任务,可以使用OpenCV通过简单的代码实现。以下是绘制两个同心圆的示例代码: import cv2 # 创建一个黑色的图像 img = np.zeros((512,512,3), np.uint8) # 确定两个圆的中心坐标与半径 center1 = (256, 256) radius1 = 100 center2 = (25…

    python 2023年5月18日
    00
  • Python time库的时间时钟处理

    让我针对Python time库的时间时钟处理,给大家详细讲解一下。 Time库简介 time库是Python中的标准库之一,它提供了关于时间的各种函数,并且常常用于计算机程序的时间统计、任务调度、日期处理等方面。其中,最常用的函数有:time(), localtime(), strftime(),功能分别为获取当前时间戳、将时间戳转化为本地时间、将时间格式…

    python 2023年6月2日
    00
  • Python 相对路径和绝对路径及写法演示

    下面是 Python 相对路径和绝对路径的详细讲解以及写法演示攻略。 相对路径和绝对路径 在 Python 中,文件的路径有两种表示方式:相对路径和绝对路径。相对路径是相对于当前文件所在的目录的路径,而绝对路径则是从文件系统的根目录开始的路径。 使用相对路径可以更方便地描述文件的位置,但是相对路径存在依赖关系,修改文件结构可能会导致代码出现运行错误。而绝对路…

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部