如何找到线段上距离任意点最近的点?

2023-11-30

该函数应该接受一个点参数,该参数将用于查找线段对象上与其最近的点。在示例断言代码中,函数getClosestPoint(Point()) takes Point(10, 0)作为参数并应该返回Point(5,5)作为最接近的点Point(10, 0)那是在l1 = Line(Point(5,5), Point(20,35))端点是A Point(5,5), B Point(20,35)我不知道如何解决这个问题。我当前的解决方案将返回 (4,3),它不在线段上,但在线上。

 from point import Point
 import math
 class Line:
    def __init__(self,aPoint=Point(), bPoint=Point()):
        self.firstPoint = aPoint
        self.secondPoint = bPoint

    def getClosestPoint(self,point=Point()):

        m1 = self.getSlope()
        m2 = -1 / float(m1)
        b1 = self.p1.y - m1 * self.p1.x
        b2 = point.y - m2 * point.x
        x = float(b2 - b1) / float(m1 - m2)
        y = m1 * x + b1
        return Point(x, y)

    if __name__ == "__main__":
         p1 = Point(5,5)
         p2 = Point(20,35)
         l1 = Line(p1,p2)
         assert l1.getClosestPoint(Point(10,0)) == Point(5,5)
         assert l2.getClosestPoint(Point(25/2,25/2)


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

一般的答案是将点投影到线上。 查看它的一种方法是将点转换为由您的线段定义的参考系(p1是新的原点(0, 0), p2新的(1, 0))。 然后,你就可以摆脱新的y坐标(即实际投影发生的位置)并变换新点(x, 0)回到原来的框架。

具体来说,您必须找到转换。 第二个,从新的空间到原来的空间很容易写(只要画在纸上,你就会看到):

x = (x2 - x1) * nx + (y2 - y1) * ny + x1
y = (y1 - y2) * nx + (x2 - x1) * ny + y1

但你可以反转这些方程来找到(nx, ny)对应于一个点(x, y).

当你这样做时,假设我们都没有犯任何错误或拼写错误,你应该得到类似的信息:

dx = x2 - x1
dy = y2 - y1
d2 = dx*dx + dy*dy
nx = ((x3-x1)*dx + (y3-y1)*dy) / d2
return (dx*nx + x1, dy*nx + y1)

编辑:如果你实际上必须找到最接近的点segment而不是直线,它很容易找到,因为如果投影落在线段内,则您可以0 <= nx <= 1(这是充分必要条件)。 在 return 语句之前,你可以强制nx保持在这个区间:

nx = min(1, max(0, nx))

红迪网: 上面的语句相当于:

if nx<0:
    nx = 0
if nx>1:
    nx = 1

这样,线上点的投影(可以位于线段之外)就会被推回到线段内部(由下式定义)0 <= nx <= 1)在最近的点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找到线段上距离任意点最近的点? 的相关文章

随机推荐

  • 无法运行从 Scala 文件创建的 jar 文件

    这是我用 Scala 编写的代码 object Main extends App println Hello World from Scala 这是我的构建 sbt name hello world version 1 0 scalaVer
  • VB.NET 中通过后期绑定实现的多态性不允许使用事件,有解决方法吗?

    我正在开发一个与一系列 USB 传感器通信的应用程序 我创建了一个使用名为 Sensor 的类的基本实现 该类包含允许与传感器交互的事件和方法 还涉及一个线程任务处理器 但我将举一个简单的示例 我的问题是 这个简单的概念验证示例运行良好 但
  • 在 Android 手机中启动图库

    当用户单击通知时 我试图从我的应用程序启动图库 我发现只有当您知道 Gallery 应用程序的包和类名时才有可能 我已经成功地为四家设备制造商找到了相同的内容 到目前为止 该代码有效 我只需要 Motorola 和 LG Android 手
  • 需要帮助在 tomcat 中调试 SSL 握手

    我有一个非常奇怪的问题并正在寻找一些提示 我有一个由客户端发送的证书 我需要安装该证书才能访问 HTTPS Web 服务 Windows 和 Linux 操作系统中均已安装证书 使用 keytool 命令 keytool import al
  • EDMX .NET 4.5 到 4.0?

    我们使用实体框架 并在项目设置为构建 NET 4 5 时创建了 EDMX 现在我们想要切换到 NET 4 0 但是当我们这样做时 我们会收到 EDMX 文件的编译错误 它指出以下错误 Error 10027 The XML namespac
  • 使用 itext (itextsharp) 替换一个 PDF 模板页面上的多个不同图像

    我们有一个 ASP NET 应用程序 用户可以用它来生成某些报告 到目前为止 我们有一个 PDF 模板 上面有一张图像 我们只需用我们以编程方式生成的图像 图表 替换该图像 我们使用了该网站的代码 http blog rubypdf com
  • Ansible playbook 检查用户是否存在或显示错误消息

    如何检查用户是否存在以及 如果存在 则继续下一个任务 如果不存在 则显示一条消息 Given user does not exist 您可以简单地使用获取模块 name get root user info getent database
  • F# 性能问题:编译器在做什么?

    参考这段代码 F 静态成员类型约束 为什么 例如 let gL G of 1L 1L 100000L gt List map fun n gt factorize gL n 明显慢于 1L 100000L gt List map fun n
  • 扩展样式表块

    我在基本布局中有样式表块 stylesheets filter cssrewrite bundles static css main css endstylesheets 我想知道是否可以在子模板中扩展此块 添加另一个或多个 CSS 链接
  • MeekroDB 错误“命令不同步;您现在无法运行此命令”

    我有一个包含以下几行的 PHP 脚本 require once meekrodb 2 1 class php DB user usr DB password pwd DB dbName db DB encoding utf8 results
  • 确定 CSV 的数据类型 - Python

    我是 Python 新手 在使用列表时遇到问题 我公开了我的问题 如您所见 我有一个具有以下结构的 datos csv 文件 1 4 0 none 2 2 0 3 0 none 2 2 5 2 5 tc 39 使用此函数我将数据存储在列表中
  • 是否可以声明带有属性的匿名非 IIFE JavaScript 函数

    我有一次发现 在将属性作为参数传递给其他函数之前 将属性分配给函数很有用 看起来像这样 对于匿名函数和变量分配函数对象之间的任何混淆 我感到抱歉 我认为它们不是同一件事 could strict mode have something to
  • 查找与 matlab 中向量的阶数相同的向量的唯一值

    我有一个向量 A 2 5 6 2 4 13 34 3 34 我想找到这个向量的唯一值 但不是按排序顺序 我在Matlab网站上搜索 发现了这个函数 C ia ic unique A rows stable 但是Matlab R2011a不识
  • 文件名上的 Posix I/O 操作顺序一致吗?

    我想知道是否有Posix标准保证对文件的修改通过重复保证是可见的open close调用相同的文件名 为了便于说明 请考虑以下 Bash 脚本 bin bash FILE mktemp echo Some data gt gt FILE c
  • 使用 Google Drive SDK iOS 创建文件夹

    我正在尝试使用适用于 iOS 的 Google Drive SDK 创建一个文件夹 来自此处的 Google 云端硬盘文档 https developers google com drive folder 它说创建文件夹就像创建具有特殊 M
  • 如何在 R 中重新排列图表

    我更新了我的diagrammer到版本 0 9 0 并开始从相同的数据渲染不同的图表 我的数据框现在看起来像这样 df lt data frame col1 c Cat Dog Bird col2 c Feline Canis Avis s
  • 如何免费制作 Xbox Live 独立游戏?

    有没有办法制作免费的 Xbox Live 独立游戏 现在我并不是想在市场上向全世界发布它 而是想在我的 Xbox 上免费测试它 我知道您必须在 Xbox 和 PC 上下载 XNA 应用程序 但我是否需要 XNA Creators Club
  • 通过镜像名称获取进程的进程句柄

    我需要使用 Win32 从 C 中最简单的方法通过可执行文件名获取另一个进程的进程句柄 我正在寻找的进程没有任何已注册的窗口类 我还知道 如果它正在运行 则只会有一个实例在运行 Use 创建Toolhelp32Snapshot 进程32优先
  • DATEADD 的 NSPredicate 语法?

    有没有办法在 NSPredicate 上执行 DateAdd 或 DateDiff 函数 谢谢你 何塞 事实上 有 这是一种迂回的做法 因为NSPredicate不直接支持它 即 你不能只是 anInterval to an NSDate
  • 如何找到线段上距离任意点最近的点?

    该函数应该接受一个点参数 该参数将用于查找线段对象上与其最近的点 在示例断言代码中 函数getClosestPoint Point takes Point 10 0 作为参数并应该返回Point 5 5 作为最接近的点Point 10 0