对于绘图应用程序,我将鼠标移动坐标保存到数组,然后使用lineTo绘制它们.生成的线条不平滑.如何在所有聚集点之间生成单条曲线?
我用谷歌搜索但我只找到了3个绘制线的函数:对于2个样本点,只需使用lineTo.对于3个样本点,quadraticCurveTo,对于4个样本点,bezierCurveTo.
(我尝试在阵列中每4个点绘制一个bezierCurveTo,但这会导致每4个采样点扭结,而不是连续的平滑曲线.)
如何编写一个函数来绘制一个包含5个样本点的平滑曲线?
如何沿着最接近平面中任意点P的三次贝塞尔曲线找到点B(t)?
问题:如果它们不是单值的,那么如何将曲线拟合到平面上的点?
对于所示的示例,如何将曲线(如黑色曲线)与嘈杂的蓝色数据拟合?它类似于样条平滑,但我不知道数据的顺序.
Matlab是首选,但伪代码很好.或者指向这个问题的正确术语的指针会很棒.
谢谢
我有一个允许用户绘制曲线的程序.但是这些曲线看起来并不好看 - 它们看起来摇摇晃晃,手绘.
所以我想要一种能够自动平滑它们的算法.我知道平滑过程中存在固有的模糊性,因此每次都不会是完美的,但是这些算法似乎确实存在于几个绘图包中并且它们工作得很好.
是否有类似这样的代码示例?C#会很完美,但我可以翻译其他语言.
我试图沿其轮廓提取脉冲的曲率(见下图).脉冲在长度和高度的网格上计算:使用有限差分在C++中实现的150 x 100个单元格.
我提取了所有具有相同值(轮廓/水平集)的点,并将它们标记为下图中的红色实线.其他颜色可以忽略不计.
然后我试图通过以下方法从这已经很嘈杂(由于网格离散化)轮廓线找到曲率:
(移动平均线已经应用)
1)通过切线的曲率
点P处的线的曲率由下式定义:
因此,曲率是P和N之间的角度增量的角度δ的石灰.由于我的点之间有一定的距离,我无法对石灰进行足够的近似,因此曲率计算不正确.我用圆圈测试它,它自然具有恒定的曲率.但我无法重现这一点(只有1位有效数字是正确的).
2)由arclength参数化的线的二阶导数
我计算了关于arclength的线的一阶导数,用移动平均线平滑,然后再次得到导数(二阶导数).但在这里我也只有1个有效数字正确.不幸的是,采用导数将已经固有的噪声倍增到更高的水平.
3)用圆圈局部近似线
由于圆半径的倒数是曲率,我使用以下方法:
到目前为止这是最好的(2位正确的有效数字),但我需要进一步改进.所以我的新想法如下:
我不想使用离散点处的值来确定曲率,而是想用三维样条曲面近似脉冲轮廓.然后我从中提取某个值的水平集,以获得平滑的点线,我可以从中找到一个很好的曲率.
到目前为止,我找不到可以生成这样的Bezier样条曲面的C++库.你能指点我吗?
您是否认为这种方法值得一试,或者我的曲率会失去太多精确度?
你知道其他任何方法吗?
非常友好的问候,Jan
编辑:似乎我不能以新用户的身份发布图片,所以我从我的问题中删除了所有这些图片,即使我觉得它们很重要,可以解释我的问题.有什么办法我还能给他们看吗?
edit2:好的,完成了:)
我有一个关于如何在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)
但我怎么得到:
如何删除或添加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等形状中获取数据.
我正试图制作一个颠簸图表(如平行坐标,但有一个有序的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) 从这个似乎有关于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++库来为我提供解决大型三次样条函数(大约1000个点)的函数,任何人都知道吗?
我有一个复杂的曲线定义为表中的一组点,如此(完整的表在这里):
# 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)