标签: spline

如何使用javascript HTML5画布通过N个点绘制平滑曲线?

对于绘图应用程序,我将鼠标移动坐标保存到数组,然后使用lineTo绘制它们.生成的线条不平滑.如何在所有聚集点之间生成单条曲线?

我用谷歌搜索但我只找到了3个绘制线的函数:对于2个样本点,只需使用lineTo.对于3个样本点,quadraticCurveTo,对于4个样本点,bezierCurveTo.

(我尝试在阵列中每4个点绘制一个bezierCurveTo,但这会导致每4个采样点扭结,而不是连续的平滑曲线.)

如何编写一个函数来绘制一个包含5个样本点的平滑曲线?

javascript bezier canvas spline html5-canvas

114
推荐指数
7
解决办法
10万
查看次数

立方贝塞尔曲线上的最近点?

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

graphics geometry bezier curve spline

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

曲线拟合平面上未分类的点

问题:如果它们不是单值的,那么如何将曲线拟合到平面上的点?

对于所示的示例,如何将曲线(如黑色曲线)与嘈杂的蓝色数据拟合?它类似于样条平滑,但我不知道数据的顺序.

Matlab是首选,但伪代码很好.或者指向这个问题的正确术语的指针会很棒.

谢谢

matlab image-processing spline curve-fitting best-fit-curve

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

平滑手绘曲线

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

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

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

c# bezier spline smoothing

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

使用2d/3dsplines从嘈杂的数据点集中查找曲率?(C++)

我试图沿其轮廓提取脉冲的曲率(见下图).脉冲在长度和高度的网格上计算:使用有限差分在C++中实现的150 x 100个单元格.

具有不同曲率的脉冲轮廓

我提取了所有具有相同值(轮廓/水平集)的点,并将它们标记为下图中的红色实线.其他颜色可以忽略不计.

红线=具有相同值的点的数据集

然后我试图通过以下方法从这已经很嘈杂(由于网格离散化)轮廓线找到曲率:

(移动平均线已经应用)

1)通过切线的曲率
两点P和N的曲率逼近

点P处的线的曲率由下式定义:

2点的切线=一点处的曲率

因此,曲率是P和N之间的角度增量的角度δ的石灰.由于我的点之间有一定的距离,我无法对石灰进行足够的近似,因此曲率计算不正确.我用圆圈测试它,它自然具有恒定的曲率.但我无法重现这一点(只有1位有效数字是正确的).

2)由arclength参数化的线的二阶导数

我计算了关于arclength的线的一阶导数,用移动平均线平滑,然后再次得到导数(二阶导数).但在这里我也只有1个有效数字正确.不幸的是,采用导数将已经固有的噪声倍增到更高的水平.

3)用圆圈局部近似线

由于圆半径的倒数是曲率,我使用以下方法:

用圆圈近似曲率

到目前为止这是最好的(2位正确的有效数字),但我需要进一步改进.所以我的新想法如下:

我不想使用离散点处的值来确定曲率,而是想用三维样条曲面近似脉冲轮廓.然后我从中提取某个值的水平集,以获得平滑的点线,我可以从中找到一个很好的曲率.

到目前为止,我找不到可以生成这样的Bezier样条曲面的C++库.你能指点我吗?

您是否认为这种方法值得一试,或者我的曲率会失去太多精确度?

你知道其他任何方法吗?

非常友好的问候,Jan

编辑:似乎我不能以新用户的身份发布图片,所以我从我的问题中删除了所有这些图片,即使我觉得它们很重要,可以解释我的问题.有什么办法我还能给他们看吗?

edit2:好的,完成了:)

c++ algorithm bezier surface spline

22
推荐指数
1
解决办法
7383
查看次数

如何在pythonOCC中使用样条线?

我有一个关于如何在pythonOCC中使用样条线的两部分问题.

首先,我知道我可以创建样条曲线

array = []
array.append(gp_Pnt2d (0,0))
array.append(gp_Pnt2d (1,2))
array.append(gp_Pnt2d (2,3))
array.append(gp_Pnt2d (4,3))
array.append(gp_Pnt2d (5,5))

pt2d_list = point2d_list_to_TColgp_Array1OfPnt2d(array)
SPL1      = Geom2dAPI_PointsToBSpline(pt2d_list).Curve()
display.DisplayShape(make_edge2d(SPL1) , update=True)
Run Code Online (Sandbox Code Playgroud)

我希望bspline可以通过计算得出

BSPL1      = Geom2dAPI_PointsToBSpline(pt2d_list)
Run Code Online (Sandbox Code Playgroud)

但我怎么得到:

  1. bspline的衍生物?
  2. bspline的结?
  3. 结是pt2d_list吗?
  4. bspline的控制点?
  5. 样条系数?

如何删除或添加bspline的结?

其次,在pythonOCC中加载CAD绘图.stp文件时,如下所示:

from OCC import TopoDS, StlAPI
shape = TopoDS.TopoDS_Shape()
stl_reader = StlAPI.StlAPI_Reader()
stl_reader.Read(shape,str(filename))
display.DisplayShape(shape)
Run Code Online (Sandbox Code Playgroud)

如何从knot,bspline和coefficient等形状中获取数据.

python cad spline opencascade

20
推荐指数
1
解决办法
1427
查看次数

在凸起图表中使用曲线

我正试图制作一个颠簸图表(如平行坐标,但有一个有序的x轴)来显示随时间的排名.我可以很容易地制作一个直线图:

library(ggplot2)
set.seed(47)

df <- as.data.frame(as.table(replicate(8, sample(4))), responseName = 'rank')
df$Var2 <- as.integer(df$Var2)

head(df)
#>   Var1 Var2 rank
#> 1    A    1    4
#> 2    B    1    2
#> 3    C    1    3
#> 4    D    1    1
#> 5    A    2    3
#> 6    B    2    4

ggplot(df, aes(Var2, rank, color = Var1)) + geom_line() + geom_point()
Run Code Online (Sandbox Code Playgroud)

精彩.但是,现在,我想让连接线弯曲.尽管每x不超过一y,但geom_smooth提供了一些可能性.loess看起来它应该工作,因为它可以忽略除最近的点之外的点.然而,即使调整最好,我仍然会错过许多积分并超过其他应该平坦的点:

ggplot(df, aes(Var2, rank, color = Var1)) + 
    geom_smooth(method = 'loess', span = .7, se = …
Run Code Online (Sandbox Code Playgroud)

r spline ggplot2

18
推荐指数
1
解决办法
956
查看次数

Catmull-Rom样条 - 它们如何工作?

从这个似乎有关于catmull-rom splines的最详细信息的网站:http://www.mvps.org/directx/articles/catmull/ 它提到需要四个点来创建样条曲线.然而,它没有提到点p0和p3如何影响p1和p2之间的值.

我的另一个问题是如何创建连续样条线?通过使p4 = p2(假设我们有p0,p1,p2,p3,p4,p5,p6 ...... pN),将点p1,p2定义为与p4,p5连续是否容易.

一个更普遍的问题是如何计算catmull rom样条上的切线?它是否必须涉及在样条上取两个点(比如0.01,0.011)并根据毕达哥拉斯得到切线给定输入值给出的位置坐标?

c++ opengl directx graphics spline

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

有没有很好的库来解决C++中的三次样条函数?

我正在寻找一个好的C++库来为我提供解决大型三次样条函数(大约1000个点)的函数,任何人都知道吗?

c++ spline

16
推荐指数
3
解决办法
4万
查看次数

找到从点到复杂曲线的最小距离

我有一个复杂的曲线定义为表中的一组点,如此(完整的表在这里):

#  x   y
1.0577  12.0914
1.0501  11.9946
1.0465  11.9338
...
Run Code Online (Sandbox Code Playgroud)

如果我使用命令绘制此表:

plt.plot(x_data, y_data, c='b',lw=1.)
plt.scatter(x_data, y_data, marker='o', color='k', s=10, lw=0.2)
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

在此输入图像描述

我手动添加红点和段的地方.我需要的是一种计算每个点的那些段的方法,即:找到从该2D空间中的给定点到插值曲线的最小距离的方法.

我不能使用到数据点本身的距离(产生蓝色曲线的黑点),因为它们不是以相等的间隔定位,有时它们是接近的,有时它们相距很远,这深深地影响了我的结果.线.

由于这不是一个表现良好的曲线,我不能确定我能做什么.我尝试使用UnivariateSpline进行内插,但它返回的非常差:

# Sort data according to x.
temp_data = zip(x_data, y_data)
temp_data.sort()
# Unpack sorted data.
x_sorted, y_sorted = zip(*temp_data)

# Generate univariate spline.
s = UnivariateSpline(x_sorted, y_sorted, k=5)
xspl = np.linspace(0.8, 1.1, 100)
yspl = s(xspl)

# Plot.
plt.scatter(xspl, yspl, marker='o', color='r', s=10, lw=0.2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我也试过增加插值点的数量但是弄得一团糟:

# Sort data according …
Run Code Online (Sandbox Code Playgroud)

python interpolation numpy spline scipy

16
推荐指数
2
解决办法
6686
查看次数