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文件相关操作和方法汇总大全 在Python中,我们可以使用内置的open函数来打开文件,并使用各种方法来读取、入和操作文件。在本文中,我们将总结一些常用的文件操作和方法,包括文件打开、读取、写入、关闭、移动、复制、删除等。 文件打开 在Python中,我们可以使用open函数来打开文件。以下是一个示例代码: # 打开文件 file = open(…

    python 2023年5月13日
    00
  • python之数字图像处理方式

    Python之数字图像处理方式 概述 数字图像处理是一种运用数学、物理和计算机技术对图像进行处理的科学技术,常见的应用包括图像增强、目标检测、模式识别等,其在电影制作、医学影像、智能监控等领域都有广泛的应用。 Python 作为一种简单易学、功能强大的编程语言,也有着丰富的数字图像处理相关工具及库,如 Pillow、OpenCV、Scikit-image 等…

    python 2023年6月3日
    00
  • python解决汉字编码问题:Unicode Decode Error

    当处理中文字符时,有时候会遇到 Unicode Decode Error 的错误,这是因为 Python 默认使用 ASCII 编码,而中文字符不在 ASCII 编码范围内,需要将中文字符进行编码和解码。 以下是解决 Unicode Decode Error 的攻略: Step 1:使用正确的编码格式 在 Python2 中,默认编码是 ASCII,而在 P…

    python 2023年5月20日
    00
  • Python线程池thread pool创建使用及实例代码分享

    Python线程池thread pool创建使用及实例代码分享 Python线程池(thread pool)是一种提供线程复用的机制,通过线程池的管理,可以减少线程创建与销毁的代价,并提升异步并发执行的性能,同时避免资源的浪费,使用起来也相对方便和稳定。本篇攻略将详细介绍如何在Python中使用线程池,通过实例代码的分享帮助读者更好的掌握线程池的使用和工作原…

    python 2023年5月19日
    00
  • python实现一个简单RPC框架的示例

    RPC(Remote Procedure Call)是一种远程过程调用协议,可以让程序在不同的计算机上相互通信。Python可以使用多种RPC框架来实现远程过程调用,例如Pyro、RPyC、ZeroRPC等。本文将详细讲解如何使用Python实现一个简单RPC框架的示例,包括使用Pyro和RPyC两个示例。 使用Pyro实现一个简单RPC框架的示例 Pyro…

    python 2023年5月15日
    00
  • 如何在python中将输入值与mysql数据库值进行比较

    【问题标题】:How to compare input value with mysql database value in python如何在python中将输入值与mysql数据库值进行比较 【发布时间】:2023-04-07 04:36:01 【问题描述】: 所以我想将输入值与我的数据库值进行比较。如果输入值与数据库的值相同,我想print(input…

    Python开发 2023年4月8日
    00
  • python使用bs4爬取boss直聘静态页面

    在本攻略中,我们将介绍如何使用Python的BeautifulSoup库爬取BOSS直聘的静态页面。我们将提供两个示例,演示如何使用BeautifulSoup库提取职位信息和公司信息。 步骤1:获取页面内容 在开始之前,我们需要获取目标页面的内容。我们可以使用Python的requests库来获取页面内容。在本攻略中,我们将使用requests库来获取页面内…

    python 2023年5月15日
    00
  • 在Python中如何优雅地创建表格的实现

    确实,在Python中非常容易优雅地创建高质量的表格。本文将介绍三种创建表格的方法:使用Python内置的数据结构、使用第三方库Pandas以及使用第三方库PrettyTable。 1.使用Python内置的数据结构 Python内置的数据结构,如列表和字典,可以轻松地创建表格。如果我们有以下数据: Name Age Gender Alice 25 Fema…

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