从Mathematica样条曲线图形中提取坐标

时间:2015-03-04 15:19:54

标签: wolfram-mathematica

如何提取构成以下图形的所有点的坐标(这里只是一个例子)?

 spl = BSplineCurve[{{-.4, -.3}, {0, -.6}, {.4, -.3}, {0, -1.2}}, 
      SplineClosed -> True] ;
 Graphics[{Red, Thick, spl}] 

问题在于,如果我将//FullForm添加到最后一行,则输出中没有点坐标,因此没有用于进行提取的模式: 使用PlotCoutourPlot输出,我会编码Flatten[Cases[Normal@output, Line[x_] :> x, Infinity], 1]
这是不可能的。

2 个答案:

答案 0 :(得分:2)

b样条本身就是一个图形基元,所以你不能像那样拉出“线”。

您需要使用相关的BSplineFunction来生成积分:

 pts=BSplineFunction[{{-.4, -.3}, {0, -.6}, {.4, -.3}, {0, -1.2}}, 
        SplineClosed -> True] /@ Range[0, 1, .01];


 Graphics@Line@pts

enter image description here

如果您需要从图形中提取,您可以这样做:

Cases[graphics, BSplineCurve[a__] :> BSplineFunction[a], Infinity]

但您仍然需要提供一个参数值表来获取您的积分。

答案 1 :(得分:2)

要提取您可以使用的控制点:

curveData=Cases[graphics, BSplineCurve[a__] :>  a, Infinity]

图形中找到了多少BSplineCurves?

Length[curveData]

这是其中一个的控制点

curveData// First // MatrixForm

如果你有一个BSplineFunction列表,你可以找到更多

所以首先将BSplineCurves转换为BSplineFunctions作为上一篇文章

bfs =Cases[graphics, BSplineCurve[a__] :> BSplineFunction[a], Infinity]

然后你可以去

Inputform[bfs] 

并解析结果,但更清晰:

cdata = Cases[bfs, BSplineFunction[a__] :> a, Infinity]; 
d = Partition[cdata, 9];

这是Mathematica 11.其他版本可能需要不同的分区

d的每个元素都是这样的:

d[[1]] // MatrixForm

1
{{0.,1.}}
{3}
{False}
{{{0.,0.,0.},{0.,298.986,167.077},{0.,497.083,497.459},{0.,503.603,839.898}},Automatic}
{{0.,0.,0.,0.,1.,1.,1.,1.}}
{0}
MachinePrecision
Unevaluated

第5个元素包含控制点坐标。第六个对应于结。其他元素看起来很熟悉,但我们不要发布我们的猜测!