查找线段是否位于另一线段的距离范围内

2024-04-15

我有一堆段(我拥有的数据是构成段 [x1,y1] 和 [x2, y2] 的 2 个点),并且想根据它们的位置对它们进行分类。如果一个片段与另一个片段足够接近,那么我想将它们放在一起。如果我必须用一句话来描述它:我想找到距线段任何点 5px 距离的所有相邻线段。

With rules similar to the drawn picture: picture

我正在研究不同的算法,但大多数算法都处理交叉点并预测线条是否会相交。这对我来说并不起作用,因为我不想将线条无限延伸,我只想知道它们是否彼此相距 5 像素以内。

有谁知道我如何解决这个问题(并且相对较快)?您知道有什么可以提供帮助的框架吗? (我正在查看最近的邻居,但我找不到任何处理几何而不是点的框架)。

Thanks!


(我修改了之前的答案。这个答案有一些缺点。我认为我的新答案显示了一个更简单、更强大的解决方案。)

You have two segments, S with points S0 and S1 and T with poins T0 and T1. A collision is detected when these segments are less than a distance of r apart at one point.

对于线段 S,您可以得到方向向量 Δs, 段长度s和归一化方向向量u.

    Δs = S1 − S0
    s = |Δs|
    u = Δs / s

The unit vector u and the point S0 can describe a transformation of any point P to a point P′:

    P′x =   (Px − S0x) · ux + (Py − S0y) · uy
    P′y = − (Px − S0x) · uy + (Py − S0y) · ux

在这个变换中,线段 S 的点是:

    S′0 = (0, 0)
    S′1 = (s, 0)

For the transformed points T′0 and T′1, the y components can be interpreted as signed distance to S. Now several tests can be performed:

  • The first test is whether T′0 or T′1 are within a distance of r of the segment S or within a radius of r of either S0′ or S1′. If so, we have a hit.

  • The next test is whether the two lines intersect. That can only happen if the signs of T′0y or T′1y are different. If so, we have a hit.

  • For the last test, we reverse the first test by transforming S to S′′ in a system where T is aligned to the x-axis. Then test whether one of the transformed points S′′0 or S′′1 are within r of T′′. If so, we have a hit, otherwise it's a miss.

Python 代码如下。我也更新了我的JSFiddle https://jsfiddle.net/fe348pkn/.

Notes:

  • 纵向变量a和距离d在我的旧答案中,实际上与此处的 x′ 和 y′ 相同。我觉得转型比较简单。

  • 该解决方案仅测试 (1) T 的点是否在距离r根据 S,(2) 直线是否相交以及 (3) S 的点是否在距离r来自 T。共线线段的情况由测试(1)和(3)捕获。

  • The code below does not handle zero-length segments (S0 = S1 or T0 = T1) explicitly, but returning a non-null vector as norm of a null vector seems to do the trick – tests (1) and (3) catch these cases.

Python代码:

import math

class Point:
    """ A point P(x, y) in 2D space
    """

    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(y)

class Vector:
    """ A vector v(x, y) in 2D space
    """

    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def mag(self):
        """ magnitude of the vector
        """
        
        return math.hypot(self.x, self.y)
    
    def norm(self):
        """ return the normalized vector or (0, 0)
        """
    
        a = self.mag()
        
        if a*a < 1.0e-16:
            return Vector(1, 0)
        
        return Vector(self.x / a, self.y / a)
    


def diff(p, q):
    """ difference vector (q - p)
    """

    return Vector(q.x - p.x, q.y - p.y)

def within(p, dx, r):
    """ Is p within r of point (dx, 0)?
    """

    x = p.x - dx
    y = p.y
    
    return x*x + y*y <= r*r

def rot(p, u):
    """ Rotate point p to a coordinate system aligned with u.
    """

    return Point(p.x * u.x + p.y * u.y,
                -p.x * u.y + p.y * u.x)

def collision(s, t, r):
    """ Do the line segments s and t collide with a radius r
    """

    ds = diff(s[0], s[1])
    ss = ds.mag()    
    u = ds.norm()
    
    a0 = rot(diff(s[0], t[0]), u)
    a1 = rot(diff(s[0], t[1]), u)

    # Test T0 and T1 against S
    
    if -r <= a0.y <= r and -r <= a0.x <= ss + r:
        if a0.x < 0: return within(a0, 0, r)
        if a0.x > ss: return within(a0, ss, r)
        return True    
    
    if -r <= a1.y <= r and -r <= a1.x <= ss + r:
        if a1.x < 0: return within(a1, 0, r)
        if a1.x > ss: return within(a1, ss, r)
        return True

    # Test intersection
    
    if a0.y * a1.y < -0.9 * r * r:
        a = -a0.y * (a1.x - a0.x) / (a1.y - a0.y) + a0.x
        
        if 0 <= a <= ss: return True

    # Test S0 and S1 against T
    
    dt = diff(t[0], t[1])
    tt = dt.mag()    
    v = dt.norm()
    
    b0 = rot(diff(t[0], s[0]), v)
    b1 = rot(diff(t[0], s[1]), v)

    if 0 <= b0.x <= tt and -r <= b0.y <= r: return True
    if 0 <= b1.x <= tt and -r <= b1.y <= r: return True
       
    return False
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找线段是否位于另一线段的距离范围内 的相关文章

  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 在 TeamCity 中创建变更日志工件

    是否有一种简单的方法可以让 TeamCity 包含文本或 html 更改日志作为其输出工件之一 也许我需要沿着让 msbuild 或其他进程创建更改日志的路线 但由于 TeamCity 为每个构建生成一个更改日志 我想知道是否已经有一种简单
  • Bootstrap-modal 在 Flash 顶部弹出

    我正在使用 Twitter 的 Bootstrap 插件bootstrap modal 除非后面有闪光灯元件 否则它效果很好 当引导模式对话框出现并且其后面有一个 Flash 元素时 Flash 元素位于其他所有元素之上 我该如何解决 您需
  • Ruby String#scan 相当于返回 MatchData

    正如问题标题中基本上所述 Ruby 字符串上是否有一种方法相当于字符串 扫描 http ruby doc org core String html method i scan但它不是只返回每个匹配的列表 而是返回一个数组MatchData是
  • 如何处理 SQL Server 中列名中的空格?

    假设我想使用这样的代码 select Response Status Code Client Response Status Code from TC Sessions NOLOCK WHERE StartDate BETWEEN 05 1
  • Oracle 数字和 varchar 连接

    我有一个连接两个表的查询 一个表的列类型为 varchar 另一表的列类型为 number 我已经在 3 个 Oracle 数据库上执行了查询 并且看到了一些奇怪的结果 希望能够得到解释 在其中两个数据库上 类似以下内容的工作 select
  • Dart future 阻塞主线程

    我正在开发一个捕获和处理图像的应用程序 代码的简化版本是 build return FloatingActionButton onPressed processImage child Icon Icons camera alt color
  • 计算numpy中2个点列表的距离

    我有 2 个点列表作为 numpy ndarray 每一行都是一个点的坐标 例如 a np array 1 0 0 0 1 0 0 0 1 b np array 1 1 0 0 1 1 1 0 1 这里我想计算2个列表中所有点对之间的欧氏距
  • Windows Server 2012 R2 上通过 SSL 的 AD LDS

    我正在尝试将我的 AD LDS 实例配置为通过 SSL 运行 以便我可以使用我的应用程序从另一台计算机连接到它并执行密码更改操作 我安装了证书颁发机构来创建一个服务器证书 我可以在我的 AD LDS 实例上使用该证书 我将证书添加到 AD
  • Quill:如何防止工具栏滚动并设置高度?

    我正在尝试遵循以下示例https quilljs com playground autogrow height https quilljs com playground autogrow height但在设置编辑器框的高度并防止工具栏滚动到
  • 在 Ubuntu 9.10 中安装 play-framework

    我已从 playframework org 网站复制了压缩文件并将其解压缩到某个位置 我已将其插入到我的 bashrc 配置文件中以设置为 PATH 环境 但仍然无法从任何地方访问播放命令 即使在框架的安装目录中 播放文件也没有按原样运行
  • 将 Selenium WebDriver 连接到现有浏览器会话

    我正在使用 selenium 如果当前存在现有浏览器会话 对于我来说 Chrome 我想附加一个 webdriver 实例 我不想打开新的浏览器窗口 会话 我用谷歌搜索发现 有一些方法可以通过这些网站上的描述来做到这一点 通过扩展 Remo
  • file.canWrite() 说“true”,但我无法在可移动存储上写入(kit kat)

    我收到来自相机的意图 其中包含在此路径中拍摄的照片 storage extSdCard DCIM Camera photoCaptured jpg 我想调整图像的大小 已经这样做了 并在同一路径中覆盖 我可以在 2 3 4 1 和 4 3
  • 如何使用定时器和不同的线程让代码顺利运行

    我试图阻止 GUIfreezing 因为定时器间隔很短并且需要处理的内容太多Timer Tick事件处理程序 我已经用谷歌搜索了一段时间 我了解到我无法从 UI 线程以外的任何其他线程更新 UI 那么 如果您在下面使用大量控件怎么办 Tim
  • 使用 R 查找包含最大值的行索引

    给定以下矩阵 假设我想找到第二列中的最大值 mat lt matrix c 1 3 7 9 4 6 byrow T nc 3 mat 1 2 3 1 1 2 3 2 7 8 9 3 4 5 6 I know max mat 2 将返回 8
  • C# 中的数字签名无法在 C++ 中进行验证

    我有一个 C 应用程序 它使用 RSA 对数据进行数字签名 代码如下 RSACryptoServiceProvider rsa new RSACryptoServiceProvider rsa ImportCspBlob privateKe
  • MonoGame 和 Microsoft.XNA.Framework 命名空间之间的引用不明确

    MonoGame 一个基本上将 XNA 引入 Windows Phone 8 的框架 的所有命名空间都带有前缀Microsoft Xna Framework我相信将 XNA 应用程序移植到 MonoGame 时所需的代码更改量最小化 我的问
  • 如何使用 docker run 命令将 json 文件作为参数传递

    以下是我的 Dockerfile 内容 FROM python 2 7 slim Set the working directory to app WORKDIR app Copy the current directory content
  • 取消 RestSharp 请求

    我正在制作一个 wp7 应用程序 它使用 RestSharp 下载一些数据 我注意到应用程序指南要求我提供一个允许用户取消数据传输的 ui 元素 是否可以在休息时取消 ExecuteAsync 请求 ExecuteAsync 返回一个Res
  • 使用 # 重定向到页面中的 div

    我想在控制器中处理一些数据后重定向到网页的某个 div 他们有什么方法可以将 添加到网址末尾吗 或者我应该用javascript处理它 Example HttpPost public async Task
  • 查找线段是否位于另一线段的距离范围内

    我有一堆段 我拥有的数据是构成段 x1 y1 和 x2 y2 的 2 个点 并且想根据它们的位置对它们进行分类 如果一个片段与另一个片段足够接近 那么我想将它们放在一起 如果我必须用一句话来描述它 我想找到距线段任何点 5px 距离的所有相