- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有 3 个点(A、B 和 X)和一个距离 (d)。我需要创建一个函数来测试点 X 是否比线段 AB 上的任何点的距离 d 更近。
问题首先是,我的解决方案是否正确,然后想出更好(更快)的解决方案。
我的第一遍如下
AX = X-A
BX = X-B
AB = A-B
// closer than d to A (done squared to avoid needing to compute the sqrt in mag)
If d^2 > AX.mag^2 return true
// closer than d to B
If d^2 > BX.mag^2 return true
// "beyond" B
If (dot(BX,AB) < 0) return false
// "beyond" A
If (dot(AX,AB) > 0) return false
// find component of BX perpendicular to AB
Return (BX.mag)^2 - (dot(AB,BX)/AB.mag)^2 < d^2
此代码最终将针对一大组 P 和一大组 A/B/d 三元组运行,目的是找到所有通过至少一个 A/B/d 的 P,所以我怀疑是一种基于此降低总体成本的方法,但我还没有研究过。
(顺便说一句:我知道一些重新排序、一些临时值和一些代数恒等式可以降低上述成本。为了清楚起见,我只是省略了它们。)
编辑:这是一个 2D 问题(但推广到 3D 的解决方案会很酷
编辑:进一步思考,我预计命中率在 50% 左右。 X 点可以在嵌套层次结构中形成,因此我希望能够将大型子树修剪为全部通过和全部失败。限制三胞胎的 A/B/d 更像是一个技巧。
编辑:d 与 AB 处于同一数量级。
编辑:Artelius 发布了一个不错的解决方案。我不确定我是否完全理解他的意思,因为我在完全理解它之前就离题了。无论如何,结果又想到了另一个想法:
我相当确定这胜过我的解决方案。
(如果没有更好的结果出现,那么 Artelius 将获得“奖品”:)
最佳答案
如果你的(A,B,d)集合是固定的,你可以为每个计算一对矩阵来平移坐标系,这样直线AB就成为X轴,AB的中点就是起源。
我认为这是构建矩阵的简单方法:
trans = - ((A + B) / 2) // translate midpoint of AB to origin
rot.col1 = AB / AB.mag // unit vector in AB direction
0 -1
rot.col2 = rot.col1 * ( ) // unit vector perp to AB
1 0
rot = rot.inverse() // but it needs to be done in reverse
然后你只需取出每个 X 并执行 rot * (X + trans)
。
所讨论的区域现在在 x 轴和 y 轴上实际上是对称的,因此您可以取 x 坐标和 y 坐标的绝对值。
然后你只需要检查:
y < d && x < AB.mag/2 //"along" the line segment
|| (x - AB.mag/2)^2 + y^2 < d^2 // the "end cap".
你可以做另一个技巧;矩阵可以缩小 AB.mag/2
倍(记住矩阵只为每个 (A,B) 计算一次,这意味着找到它们比实际检查本身更慢更好).这意味着您的支票将变为:
y < 2*d/AB.mag && x < 1
|| (x - 1)^2 + y^2 < (2*d/AB.mag)^2
用常量 1 替换了 AB.mag/2 的两个实例后,它可能会快一点。当然,您也可以预先计算 2*d/AB.mag
和 (2*d/AB.mag)^2
。
这是否会比其他方法更快地解决问题取决于您提供的输入。但是如果 AB 的长度比 d 长,我认为它会比你发布的方法快得多。
关于algorithm - 快速几何邻近谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/254979/
我想知道是否可以将简单的位图转换为几何对象 最佳答案 是的,您可以使用跟踪。 Potrace是一个开源的位图到矢量跟踪器库。 然而,位图追踪并不完美。对于高质量的矢量图像,line tracer 一般
这类似于this question,但是却相反。 我有两个地理位置(纬度,经度)A和B。假设它们相距40海里。我想计算在A和B之间的直线上,从A点起10海里处的坐标。数学(我每天使用的其他一些数学),
我想计算一个点到由 2 个点定义的直线的距离。 我正在使用 javascript,这就是我使用维基百科得出的结论:https://en.wikipedia.org/wiki/Distance_from
我对 boost::geomentry 有疑问。 #include #include #include #include int main(){ typedef boost::geometry
我有一个问题。我想将四边形与四边形相交。 int main(){ typedef boost::geometry::model::point_xy TBoostPoint; typedef b
我无法在 OpleGL 中获得正确的转换。 我有 point3D - P(X,Y,Z) 和投影矩阵 M,它等于 K*(R|T) 其中 K - 相机标定矩阵 (R|T)——点(物)坐标系变换(R——旋转
我想做一个凸面(由一些直线或圆弧组成)围绕它的几何中心(Cx,Cy)旋转。同时凸面两侧有两个圆(由半径给出:R 和左中心:(Lx,Cy),右中心:(Rx,Cy))。表示与几何(Cy) X 轴相同的圆心
我有一个 DrawingVisual表示路径的元素,该路径的几何描述由此 syntax : "m106,59.3c0-1.98,0,0-4.95,0.989-3.96,0.989-13.8,3.96-
如何将我自己的数据集转换为可供 pytorch 几何图形神经网络使用的数据集? 所有教程都使用已转换为 pytorch 可用的现有数据集。例如,如果我有自己的点云数据集,我如何使用它来训练图神经网络的
我正在使用 PyQt5 和 OpenCV。我想创建一个读取视频帧并执行橡皮筋拉伸(stretch)以生成几何图形的类,该几何图形将由不同的类用于裁剪视频流(此示例中不包括第二类)。 在此示例中,从网络
我们有两个 (PostgreSQL 9.2) 表。第一城市: loc_id | integer | not null name | character
我有一张 table : create table if not exists places( id bigserial not null constraint places_pkey primary
我在 postgresql 中有一个带有 PostGIS geometry(point, 4326) 列(位置,使用 SRID 4326)的表,我有一个使用 SQL Alchemy 更新表(其余列)的
我开始使用 c++11 并尝试使用 boost geometry 运行一些示例代码 #include #include #include #include BOOST_GEOMETRY_REG
我有一个存储为 csv 文件的数据框,其中一列是多边形对象。但是,此列存储为字符串而不是 GeoPandas 几何对象。如何将此列转换为 Geopandas 几何对象以便执行地理分析? 这是我的数据的
我从两台相同品牌的相机拍摄的两张图像相距一定距离,拍摄相同的场景。我想计算两个相机之间的真实世界旋转和平移。为了实现这一点,我首先提取了两个图像的 SIFT 特征并匹配它们。 我现在有了基本矩阵以及单
我目前正在使用 boost 几何/空间索引库,以便对 3d 边界框执行范围查询。例如,我能够获得与查询边界框重叠的所有边界框的列表。 文档 ( http://www.boost.org/doc/lib
boost::geometry::model::point 将点的维度作为编译时参数。例如, typedef bg::model::point point; 有没有什么方法可以在运行时指定维度,比如说
我一直在寻找一种在 three.js 中将 uv 映射添加到我的自定义几何体的方法。我找到了这样做的方法,但我找到的解决方案都没有用。谁能解释一下 uv-mapping 的工作原理以及如何正确使用它?
在我的应用程序中,用户可以使用 iPhone 的 GPS 定义足球场的三个角落,方法是一个接一个地走到角落,然后点击按钮。这很好用,我可以在屏幕上绘制生成的矩形,类似于它在 Google map 中的
我是一名优秀的程序员,十分优秀!