三次贝塞尔曲线上的最近点?

2023-11-22

如何沿着三次贝塞尔曲线找到最接近平面上任意点 P 的点 B(t)?


我编写了一些快速而简单的代码来估计任意阶贝塞尔曲线的这一点。(注意:这是伪暴力,而不是封闭式解决方案。)

Demo: http://phrogz.net/svg/closest-point-on-bezier.html

/** Find the ~closest point on a Bézier curve to a point you supply.
 * out    : A vector to modify to be the point on the curve
 * curve  : Array of vectors representing control points for a Bézier curve
 * pt     : The point (vector) you want to find out to be near
 * tmps   : Array of temporary vectors (reduces memory allocations)
 * returns: The parameter t representing the location of `out`
 */
function closestPoint(out, curve, pt, tmps) {
    let mindex, scans=25; // More scans -> better chance of being correct
    const vec=vmath['w' in curve[0]?'vec4':'z' in curve[0]?'vec3':'vec2'];
    for (let min=Infinity, i=scans+1;i--;) {
        let d2 = vec.squaredDistance(pt, bézierPoint(out, curve, i/scans, tmps));
        if (d2<min) { min=d2; mindex=i }
    }
    let t0 = Math.max((mindex-1)/scans,0);
    let t1 = Math.min((mindex+1)/scans,1);
    let d2ForT = t => vec.squaredDistance(pt, bézierPoint(out,curve,t,tmps));
    return localMinimum(t0, t1, d2ForT, 1e-4);
}

/** Find a minimum point for a bounded function. May be a local minimum.
 * minX   : the smallest input value
 * maxX   : the largest input value
 * ƒ      : a function that returns a value `y` given an `x`
 * ε      : how close in `x` the bounds must be before returning
 * returns: the `x` value that produces the smallest `y`
 */
function localMinimum(minX, maxX, ƒ, ε) {
    if (ε===undefined) ε=1e-10;
    let m=minX, n=maxX, k;
    while ((n-m)>ε) {
        k = (n+m)/2;
        if (ƒ(k-ε)<ƒ(k+ε)) n=k;
        else               m=k;
    }
    return k;
}

/** Calculate a point along a Bézier segment for a given parameter.
 * out    : A vector to modify to be the point on the curve
 * curve  : Array of vectors representing control points for a Bézier curve
 * t      : Parameter [0,1] for how far along the curve the point should be
 * tmps   : Array of temporary vectors (reduces memory allocations)
 * returns: out (the vector that was modified)
 */
function bézierPoint(out, curve, t, tmps) {
    if (curve.length<2) console.error('At least 2 control points are required');
    const vec=vmath['w' in curve[0]?'vec4':'z' in curve[0]?'vec3':'vec2'];
    if (!tmps) tmps = curve.map( pt=>vec.clone(pt) );
    else tmps.forEach( (pt,i)=>{ vec.copy(pt,curve[i]) } );
    for (var degree=curve.length-1;degree--;) {
        for (var i=0;i<=degree;++i) vec.lerp(tmps[i],tmps[i],tmps[i+1],t);
    }
    return vec.copy(out,tmps[0]);
}

上面的代码使用了vmath库有效地在向量(2D、3D 或 4D)之间进行 lerp,但是替换lerp()打电话进来bézierPoint()用你自己的代码。

调整算法

The closestPoint()函数分两个阶段工作:

  • 首先,计算沿曲线的所有点(均匀间隔的值)t范围)。记录哪个值t到该点的距离最小。
  • 然后,使用localMinimum()函数寻找最小距离周围的区域,使用二分搜索来找到t以及产生真实最小距离的点。

的价值scans in closestPoint()确定在第一遍中使用多少个样本。扫描次数越少速度越快,但会增加错过真正最小点的机会。

The ε限制传递给localMinimum()函数控制它继续寻找最佳值的时间。值为1e-2将曲线量化为约 100 个点,因此您可以看到从closestPoint()沿着线弹出。每增加一个小数点精度——1e-3, 1e-4, …—花费大约 6-8 次额外调用bézierPoint().

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

三次贝塞尔曲线上的最近点? 的相关文章

  • 不均匀圆盘的最佳覆盖

    What kind of algorithm can I use to search for an optimal minimum area covering of a limited region of the XY plane with
  • 如何在pdf中导出一对一的JTable[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 JTable 标题没有出现在图像中 https stackoverflow com questions 7369814 why does the jtable header not appea
  • 标准化设备坐标

    我正在编写一个处理 2D 图形形状的库 I m just wondering why should my coordinate system range from 1 1 for both the x and y axis instead
  • 笛卡尔坐标到极坐标

    看一下这里的例子 http www brianhare com physicals so html http www brianhare com physics so html 看一下 console log 我在其中使用了这两个主要函数
  • C# 窗口形式的漂亮图形

    我需要使用 C 在 Windows 窗体中创建一些简单的图形 简单地说 我指的是线条 圆圈等 但是 当我画画时 例如实心圆 边缘不平滑 正如使用方形像素绘制圆时所预期的那样 但是当在矢量程序中使用相同数量的像素绘制相同的圆时 它看起来很完美
  • 二维几何:如何检查点是否在角度内

    我有以下二维几何问题 我有一个点 从该点投射一个无限角度 2D 锥体 该角度由方向和角度给出 该点和方向形成一个向量 并且角度的每一侧一半形成 2D 锥体 现在我想检查 2D 中的另一个点是在这个圆锥体内部还是外部 如何才能实现这一目标 谢
  • 投影 3D 网格的 2D 轮廓算法

    给定 一个 3D 网格 由一组顶点和三角形定义 并用这些点构建网格 问题 找到任意平面上投影的任意旋转网格的二维轮廓 投影很容易 挑战在于找到平面中投影三角形边的 外壳 我需要一些有关研究该算法的输入 指针的帮助 为简单起见 我们可以假设
  • 我怎样才能找到圆的所有点? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 给定半径和圆心坐标 如何找到圆的所有
  • 检测矩形经过黄色像素

    我有一个关于检测移动和可能旋转的矩形何时经过面板背景图像的黄色像素的最佳方法的疑问 我有一个方法 它接受一个图像和一个点 如果该点是黄色像素的点 则返回 true 我需要这种颜色检测来实现我的游戏功能 如果汽车 玩家 驶过赛道的黄色边界 它
  • 在二维空间中从 A 点前往 B 点?

    我正在开发一个项目 需要我计算从可变点 A 到可变点 B 的 0 360 度航向 以使 A 点的物体面向 B 点 现在 我不确定如何实现这一目标 我用谷歌搜索但没有找到任何好的解决方案 在任何情况下 如何计算二维空间中从 A 点到 B 点的
  • 使用 boost 几何检查两条线是否有交点

    是否可以使用 boost geometry 检查两条线段 每条线段由二维中的两个点给出 是否彼此相交 如果可能的话 boost geometry 是否还允许检查特殊情况 例如另一条线上只有一个点 数字上 或者两条线相等 如果你具体谈论Boo
  • 三次贝塞尔曲线逆 GetPoint 方程:float for Vector <=> Vector for float

    给定结果值和四个点是否可以取回 float t 如果是这样 怎么办 public static Vector3 GetPoint Vector3 p0 Vector3 p1 Vector3 p2 Vector3 p3 float t t M
  • 合并空间上接近的路径/线段的算法

    我正在寻找一种用于街道地图制图概括的几何算法 名称 在我的地图数据中 我有许多路径 点的有序列表 由线段连接 这些路径彼此靠近且几乎平行 我如何 1 识别这些 相邻路径 即如何找到比某个阈值更接近的路径 以及 2 将它们合并成一条路径 即如
  • 优雅的折线“左移”测试

    Given X Y 坐标 即车辆的位置 X Y 数组 它们是折线中的顶点 请注意 折线仅由直线段组成 没有圆弧 我想要的是 计算车辆是在折线的左侧还是右侧 当然还是在顶部 我的做法 迭代所有线段 并计算到每个线段的距离 然后 对于最近的段
  • 通过非 sf 列内连接两个 sf 对象

    我尝试使用内连接或左连接连接两个 sf 数据帧 这些数据框内部都有几何列 我不断收到错误 check join x y 中的错误 y 应该是一个数据框 对于空间连接 请使用 st joinFALSE 下面的可重现示例 df1 lt data
  • Three.js :face4 生成三角形而不是正方形

    我正在尝试使用 tree js 自定义几何图形生成一个正方形 但是这段代码 var cubeGeo new THREE Geometry cubeGeo vertices push new THREE Vector3 25 25 25 cu
  • Python 中使用 geoJSON 绘制多边形中的点

    我有一个包含大量多边形 特别是人口普查区 的 geoJSON 数据库 并且有很多长的纬度点 我希望存在一个有效的 Python 代码来识别给定坐标位于哪个人口普查区 但是到目前为止我的谷歌搜索还没有透露任何信息 Thanks 我发现了一个有
  • 有没有办法在 JTS 中将自相交多边形转换为多重多边形?

    取无效多边形POLYGON 0 100 100 100 0 0 100 0 0 100 一个带有未声明交点的煮蛋定时器形状 许多说明说 JTS 可以使用以下命令创建此版本的有效版本 buffer method Geometry input
  • Paper.js 中的事件处理程序

    我是 Paper js 的新手 在阅读教程时我对事件系统感到好奇 这就是事件处理中描述的方式tutorial http paperjs org tutorials interaction mouse tool events var path
  • 多边形内的 SQL 地理点在 STIntersect 上不返回 true(但使用 Geometry 返回 true)

    我不想仅仅为了在 STIntersect 中返回 true 而将地理数据转换为几何图形 下面是 SQL 中的代码 DECLARE point GEOGRAPHY GEOGRAPHY Point 1 1 4326 DECLARE polygo

随机推荐

  • 亚马逊 MWS API 中的请求限制问题

    我正在测试 API 示例使用 C 编写的 Amazon MWS API 用于提交 Feed但是在代码中设置 AWS Secret key access key 等之后 我收到了 RequestThrottled 错误 因此详细说明了这是什么
  • Java中将字节转换为长度为4的布尔数组

    我需要在 Java 中将一个字节转换为 4 个布尔值的数组 我该怎么办 根据 Michael Petrotta 对您问题的评论 您需要决定应该针对生成的布尔数组测试 8 位字节中的哪些位 出于演示目的 我们假设您想要最右边的四个位 那么类似
  • 将鼠标悬停在 nightwatchjs 中的链接上

    我一直在使用nightwatch js并且总是在元素周围点击 有没有办法让我们将鼠标悬停在链接或按钮上 Try the browser moveToElement命令 您还可以在之后触发回调moveToElement完成 browser w
  • 保护ajax请求完整性的最佳方法

    我正在构建一个 Drupal 网站 其中包含大量用户特定信息 这些信息将使用 jQuery ajax 发布 它本身的信息不是很敏感 重要的是验证表单数据没有被 Firebug 等工具篡改 并确保该信息确实是从指定用户请求的 换句话说 我试图
  • while($row = mysql_fetch_assoc($result)) - 如何 foreach $row?

    我正在开发一个简单的订单系统 我所坚持的代码如下 if isset GET cart cart array total 0 foreach SESSION cart as id foreach items as product if pro
  • 我使用 gRPC 生成 java 代码“@javax.annotation.Generate”,它报告“错误:(20,18) java: 找不到符号”。怎么解决?

    我使用 gRPC 生成代码 javax annotation Generate 如下图所示 然后我使用maven构建项目 它报告 Error 20 18 java cannot find symbol 如下图所示 怎么解决 你可以加java
  • 创建聊天布局?

    我尝试在 xml 中创建一个 android 聊天布局 但我无法得到我想要的东西 这是我能得到的最接近的
  • 使用 O/R 映射时从哪里开始设计?对象还是数据库表?

    我正在启动一个新的数据库应用程序 我想知道是否最好从对象开始设计 使用 UML 并相应地构建数据库模式 或者从设计数据库 使用 ER 开始并创建对象是否会更好因此 这两种方法的优点和缺点是什么 我认为这并不重要 但以防万一 我计划使用 Ja
  • “删除不必要的使用”在 Visual Studio 2015 中不起作用

    我有几个项目的解决方案 Remove unnecessary usings正在参与除一个项目之外的所有项目 为什么Remove unnecessary usings命令not在一些项目中工作 Edit 正如你所看到的Before图像没有Re
  • CompletableFuture 链结果

    我试图将方法的调用 结果链接到下一个调用 我收到编译时错误 methodE 因为如果无法从上一次调用中获取 objB 的引用 如何将上一个调用的结果传递到下一个链 我完全误解了这个过程吗 Object objC CompletableFut
  • 抽象类与所有方法抽象和接口之间的区别?

    我有一次面试 面试官首先问我具有所有抽象方法的抽象类和接口之间有什么区别 我回答说 如果以后需要继承一些东西 如果你已经扩展了一个类 你就无法继承 然后 他说这是一种情况 永远不需要延长任何其他课程 你必须执行合同 在这种情况下 抽象类和接
  • 为什么欧洲/柏林时区的偏移量为 0:53?

    示例代码 from datetime import datetime timezone import pytz tzstring Europe Berlin t1 datetime 2016 6 16 2 0 tzinfo pytz tim
  • 找到最接近某个值的公约数的有效算法?

    我有两个号码 x1 and x2 对于一个号码y 我想计算的公约数x1 and x2尽可能接近y 有一个有效的算法吗 我相信是时候重新表述我的问题并且更加清楚了 这与整数无关 所以 假设我们有两个数字x1 and x2 比如说 用户输入一个
  • React 访问 axios 拦截器中的 redux 存储

    I want to access redux store in axios s interceptor which configures jwt token so I import the store into the API js fil
  • Toolkit.getDefaultToolkit().createImage() 与 ImageIO.read()

    我正在使用 Swing 创建一个 UI 我想在JLabel 我使用的代码如下 JLabel label new JLabel new ImageIcon ImageIO read new File img jpg 如果我使用的话效果很好pn
  • 对矩阵的每个元素使用 max

    gt x lt array 10 10 dim c 4 5 gt x 1 2 3 4 5 1 10 6 2 2 6 2 9 5 1 3 7 3 8 4 0 4 8 4 7 3 1 5 9 如何将 max x 0 应用于每个元素 以便得到这个
  • JavaFX TreeView 的多种对象类型? (和更多)

    我目前有以下对象数据结构 Item 字符串名称 信息的数组列表 特点 字符串名称 收集Item Account 字符串名称 收集特点 最多 8 个 我想制作一个如下所示的 TreeView Root invisible Jake Accou
  • 在 Linux 上使用 Mono 运行 SignalR .Net 客户端 - 可能吗?

    有谁有运行经验SignalR net 客户端在单声道上 我正在考虑将其用于需要运行跨平台的进程 需要连接到互联网托管的 SignalR Hub 我创建了一个在 mono 框架下使用 signalr 客户端工作的示例项目 https gith
  • PHP访问控制系统

    我是使用 PHP 和 MySQL 创建 Web 应用程序的团队的一员 该应用程序将有多个具有不同角色的用户 该应用程序还将以地理分布的方式使用 因此 我们需要创建一个在以下两个级别运行的访问控制系统 控制特定 php 页面的用户权限 即根据
  • 三次贝塞尔曲线上的最近点?

    如何沿着三次贝塞尔曲线找到最接近平面上任意点 P 的点 B t 我编写了一些快速而简单的代码来估计任意阶贝塞尔曲线的这一点 注意 这是伪暴力 而不是封闭式解决方案 Demo http phrogz net svg closest point