我有一个允许用户绘制曲线的程序.但是这些曲线看起来并不好看 - 它们看起来摇摇晃晃,手绘.
所以我想要一种能够自动平滑它们的算法.我知道平滑过程中存在固有的模糊性,因此每次都不会是完美的,但是这些算法似乎确实存在于几个绘图包中并且它们工作得很好.
是否有类似这样的代码示例?C#会很完美,但我可以翻译其他语言.
我正在尝试使用SVG路径创建高性能,美观的铅笔工具.
我正在记录鼠标坐标以绘制路径.为了获得高保真路径(精确到用户的动作),我需要为每个像素移动记录一个点.
保持路径中的每个点都会产生大量的点,这对于后来的协作功能来说并不理想(来回发送大量的点效率不高),而且每次我需要操作它们时解析大路径是瓶颈
在路径的线性区域上,删除冗余点,仅保留表示段所需的点 - 我使用Ramer-Douglas-Peucker算法执行此操作.
此时,路径实际上只是连接线 - 因此路径看起来是锯齿状的.
一种可能的解决方案是将路径点与Cubic Bezier连接 - 但是这在简化路径上不起作用.每个点之间的距离太大,以至于Cubic Bezier"坐得"不错,因此平滑的路径不再准确地表示用户的预期路径.
另一个解决方案是在原始路径上简单地使用"后处理"算法,例如Schneider算法 - 这个算法实际上不会实时工作,因为它是一个性能猪
(我认为)可以使用的解决方案是使用Centripetal Catmull-Rom插值.

在我研究过的所有算法中,这似乎是最有希望的:
是的Catmull-ROM,其插入了一系列的常规X/Y点或完成原始路径必须由曲线的算法?
我正在开展一个非常酷的项目,我正在收集有关光标移动的数据,但我遇到了一个问题,我认为我可以使用一些帮助.我不断阅读有关光标x和y位置的数据(以及其他相关数据),一旦光标超过y维度的某个阈值,我需要计算运动方向(角度).让我用一个图来说明我画的:
往往会发生的是光标以略微的直线移动,但随后朝向运动的末端弯曲.我需要计算θ,即蓝色矢量相对于正x轴的角度.我想出的想法是使用最后2个样本来很大程度上确定移动方向是什么,否则如果我使用太多样本,我会扭曲实际角度.为了给出一个极端的案例,让我跟进另一张图片:
这里每个点代表一个样本.请注意,如果我使用BOTH点,我想要的真实角度将是错误的(同样,我需要找到光标最后移动的方向,这是在行尾绘制的矢量).我不希望这个案子出现太多,但想知道是否有办法解决它,如果它.
最后,请注意,这些运动可以在第一或第二象限中发生,如果这有所不同.
我真的很感激这里的任何帮助.我用C++编写代码,但我想我可以翻译任何答案.谢谢.
我是 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) 我有一个线性插值方法.这是在已知(x1,y1)(x2,y2)和x0时计算插值.它是计算y0值.但是当多点知道时我需要这样做.
我不是在谈论双线性或三线性插值.
我试图将已知的明确定义的形状(例如,盒子,圆柱体;具有可配置的位置,旋转和尺寸)拟合到一组点,这些点具有通过采样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网站
在下面的代码中,我使用scipy.interpolate.splprep例程使用 B 样条线来插值一组点。显然,左图中的这条曲线在第6点附近相当“尖锐”:曲率太大(见右图)。
我希望曲率限制为<10。我可以通过增加平滑系数来改善这一点s,例如将其设置为s=8:
这满足了我的曲率限制。然而,我目前必须s通过反复试验找到这个平滑因子(而且,较高s并不一定意味着曲率较低)。无论如何我可以明确地限制曲率吗?基于这个问题我知道理论上是可能的。
我只想通过片段着色器绘制贝塞尔曲线以连接编辑器中的节点。我知道定义贝塞尔曲线的所有 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) 如何以幂形式给出曲线计算控制点?假设我有p(t)=(x(t),y(t))和4个控制点.
x(t) = 2t
y(t) = (t^3)+3(t^2)
Run Code Online (Sandbox Code Playgroud)