相关疑难解决方法(0)

如何将Bézier曲线拟合为一组数据?

我有一组数据点(我可以精简)我需要适应Bézier曲线.我需要速度超过准确性,但合身应该足够好,以便可识别.我也正在寻找一种我可以使用的算法,它没有充分利用库(特别是NumPy).

我已经阅读了几篇研究论文,但没有足够的细节可以完全实现.有没有开源示例?

python algorithm bezier curve-fitting

27
推荐指数
2
解决办法
3万
查看次数

平滑手绘曲线

我有一个允许用户绘制曲线的程序.但是这些曲线看起来并不好看 - 它们看起来摇摇晃晃,手绘.

所以我想要一种能够自动平滑它们的算法.我知道平滑过程中存在固有的模糊性,因此每次都不会是完美的,但是这些算法似乎确实存在于几个绘图包中并且它们工作得很好.

是否有类似这样的代码示例?C#会很完美,但我可以翻译其他语言.

c# bezier spline smoothing

25
推荐指数
2
解决办法
2万
查看次数

SVG路径上的Catmull-Rom插值

我正在尝试使用SVG路径创建高性能,美观的铅笔工具.

我正在记录鼠标坐标以绘制路径.为了获得高保真路径(精确到用户的动作),我需要为每个像素移动记录一个点.

保持路径中的每个点都会产生大量的点,这对于后来的协作功能来说并不理想(来回发送大量的点效率不高),而且每次我需要操作它们时解析大路径是瓶颈

在路径的线性区域上,删除冗余点,仅保留表示段所需的点 - 我使用Ramer-Douglas-Peucker算法执行此操作.

但是简化路径会将其转换为低保真多边形

此时,路径实际上只是连接线 - 因此路径看起来是锯齿状的.

一种可能的解决方案是将路径点与Cubic Bezier连接 - 但是这在简化路径上不起作用.每个点之间的距离太大,以至于Cubic Bezier"坐得"不错,因此平滑的路径不再准确地表示用户的预期路径.

另一个解决方案是在原始路径上简单地使用"后处理"算法,例如Schneider算法 - 这个算法实际上不会实时工作,因为它是一个性能猪

理想的解决方案

(我认为)可以使用的解决方案是使用Centripetal Catmull-Rom插值.

Centripetal Catmull Rom与其他Catmull-Rom变种

在我研究过的所有算法中,这似乎是最有希望的:

  1. 它不会在狭窄的角落产生自我交叉
  2. 它更适合点,因此它更准确地代表原始路径.

的Catmull-ROM,其插入了一系列的常规X/Y点或完成原始路径必须由曲线的算法?

svg curve-fitting computational-geometry catmull-rom-curve

12
推荐指数
1
解决办法
2458
查看次数

找到一个点的"运动方向"(角度)

我正在开展一个非常酷的项目,我正在收集有关光标移动的数据,但我遇到了一个问题,我认为我可以使用一些帮助.我不断阅读有关光标x和y位置的数据(以及其他相关数据),一旦光标超过y维度的某个阈值,我需要计算运动方向(角度).让我用一个图来说明我画的:

在此输入图像描述

往往会发生的是光标以略微的直线移动,但随后朝向运动的末端弯曲.我需要计算θ,即蓝色矢量相对于正x轴的角度.我想出的想法是使用最后2个样本来很大程度上确定移动方向是什么,否则如果我使用太多样本,我会扭曲实际角度.为了给出一个极端的案例,让我跟进另一张图片:

在此输入图像描述

这里每个点代表一个样本.请注意,如果我使用BOTH点,我想要的真实角度将是错误的(同样,我需要找到光标最后移动的方向,这是在行尾绘制的矢量).我不希望这个案子出现太多,但想知道是否有办法解决它,如果它.

最后,请注意,这些运动可以在第一或第二象限中发生,如果这有所不同.

我真的很感激这里的任何帮助.我用C++编写代码,但我想我可以翻译任何答案.谢谢.

c++ algorithm math matlab angle

8
推荐指数
1
解决办法
1323
查看次数

通过预定点的 SVG 曲线

我是 SVG 的初学者。

我需要一条穿过点列表的 SVG 曲线。它是一个用 C++ 计算的数学函数,输出结果应该写入 SVG 文件中。我的问题是pathSVG 中的标签没有穿过所有点。相反,它会在中间跳过其中一些,而只是倾向于它们。SVG是否有任何设施可以使曲线通过整个点并以自动方式适当弯曲曲线?

数学曲线

<svg height="400" width="450">
  <path d="M 80 90 C 190 40, 300 60, 380 160" stroke="blue" stroke-width="5" fill="none" />
  <path d="M 80 90 L 190 40, 300 60, 380 160" stroke="green" stroke-width="1" fill="none"/>
  <g stroke="black" stroke-width="3" fill="black">
    <circle id="pointC" cx="80" cy="90" r="3" stroke="black"/>
    <circle id="pointA" cx="190" cy="40" r="3" stroke="green"/>
    <circle id="pointC" cx="300" cy="60" r="3" stroke="red"/>
    <circle id="pointB" cx="380" cy="160" r="3" stroke="blue"/>
  </g>
  Sorry, your browser does not support …
Run Code Online (Sandbox Code Playgroud)

math svg curve-fitting

7
推荐指数
1
解决办法
5820
查看次数

如何生成多点线性插值?

我有一个线性插值方法.这是在已知(x1,y1)(x2,y2)和x0时计算插值.它是计算y0值.但是当多点知道时我需要这样做.

我不是在谈论双线性或三线性插值.

math multipoint linear-interpolation

5
推荐指数
1
解决办法
3907
查看次数

三次贝塞尔曲线 - 得到给定 X 的 Y - 控制点的 X 增加的特殊情况

我已经阅读 一些 关于在三次贝塞尔曲线的 X 处找到 Y 的讨论,并且还阅读了有关此事的这篇文章

我的情况比一般情况更受限制,我想知道是否有比上述讨论中提到的一般情况更好的解决方案。

我的情况:

  • X不同控制点的值在增加。即: X3 > X2 > X1 > X0
  • 此外,作为上述结果,X(t)也是严格单调递增的。

有没有考虑到这些约束的有效算法?

math bezier cubic-bezier

5
推荐指数
1
解决办法
1546
查看次数

使形状适合点

我试图将已知的明确定义的形状(例如,盒子,圆柱体;具有可配置的位置,旋转和尺寸)拟合到一组点,这些点具有通过采样3D网格生成的法线。我当前的方法是为每个形状定义自定义拟合函数,并将其传递给第三方优化函数:

fitness = get_fitness(shape_parameters, points)
best_parameters = external.optimise(get_fitness, initial_parameters, points)
Run Code Online (Sandbox Code Playgroud)

(作为参考,我目前正在使用Python 3并scipy.optimize.minimize带有边界,但是语言无关紧要)。

矩形的适应度函数看起来像

def get_fitness(parameters, points):
    side_fitnesses = []
    for side in [top, right, bottom, left, back, front]:
        dists = get_side_distances(parameters, points, side)
        ndevs = get_side_normal_deviations(parameters, points, side)
        side_fitnesses.append(combine_dists_and_ndevs(dists, ndevs))
    fitnesses = choose_best_side_for_each_point(side_fitnesses)
    return mean(fitnesses)
Run Code Online (Sandbox Code Playgroud)

但是,这意味着我必须确定异常值(有/没有缓存),并且一次只能拟合一个形状。

例如(在2D中),对于这些点(具有法线),我想要以下结果:

装有法线的盒子

请注意,返回了多个形状,并且忽略了异常值。通常,输入数据中可以有许多,一种或零种形状。后处理可以删除无效(例如,太小)的结果。

注意:我真正的问题是3D。我具有真实世界对象的3D网格表示的片段,这意味着我除了上面的示例中的点/法线(例如面部区域和连接性)外,还具有更多信息。

进一步阅读:

PS:我不确定StackOverflow是否是此问题的最佳StackExchange网站

algorithm shapes data-fitting

5
推荐指数
1
解决办法
353
查看次数

有界曲率插值

在下面的代码中,我使用scipy.interpolate.splprep例程使用 B 样条线来插值一组点。显然,左图中的这条曲线在第6点附近相当“尖锐”:曲率太大(见右图)。

在此输入图像描述

我希望曲率限制为<10。我可以通过增加平滑系数来改善这一点s,例如将其设置为s=8

在此输入图像描述

这满足了我的曲率限制。然而,我目前必须s通过反复试验找到这个平滑因子(而且,较高s并不一定意味着曲率较低)。无论如何我可以明确地限制曲率吗?基于这个问题我知道理论上是可能的。

代码(Python小提琴)

python curve spline scipy smoothing

5
推荐指数
1
解决办法
543
查看次数

是否可以从三次贝塞尔曲线方程中表达“t”变量?

我只想通过片段着色器绘制贝塞尔曲线以连接编辑器中的节点。我知道定义贝塞尔曲线的所有 4 个点。并且为每个像素调用片段着色器,所以我可以检查:如果 gl_Coord.x 的“t”在 0 和 1 之间,然后将 frag_color 设置为红色。我想避免着色器中效率低下的循环。我认为最好的方法是检查曲线上的点。但是如何为贝塞尔曲线做到这一点?

是否可以从三次贝塞尔方程表达“t”变量?

x = ((1-t)^3 * p0.x) + (3 * (1-t)^2 * t * p1.x) + (3 * (1 - t) * t^2 * p2.x) + (t^3 * p3.x);

t = ?
Run Code Online (Sandbox Code Playgroud)

网站 Wolfram Aplha 给我那个公式(在 GetBezierT 函数中)。但是公式给了我错误的“t”值,我有一半的抛物线而不是曲线:

#version 150
.....
layout (origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
out vec4 frag_color;
.....
vec4 BackgroundColor = vec4(0.15, 0.15, 0.15, 1.0);
vec2 p0 = vec2(61.0f,87.0f);
vec2 p1 = vec2(181.0f, 39.0f);
vec2 p2 = …
Run Code Online (Sandbox Code Playgroud)

algorithm math glsl cubic-bezier

4
推荐指数
1
解决办法
1155
查看次数

将多项式曲线转换为Bezier曲线控制点

如何以幂形式给出曲线计算控制点?假设我有p(t)=(x(t),y(t))和4个控制点.

x(t) = 2t 
y(t) = (t^3)+3(t^2)
Run Code Online (Sandbox Code Playgroud)

math bezier 2d

0
推荐指数
1
解决办法
1771
查看次数