从 Mathematica 样条图形中提取坐标
Extracting coordinates from a Mathematica spline graphics
如何提取构成以下图形的所有点的坐标(这里只是举例)?
spl = BSplineCurve[{{-.4, -.3}, {0, -.6}, {.4, -.3}, {0, -1.2}},
SplineClosed -> True] ;
Graphics[{Red, Thick, spl}]
问题是,如果我将 //FullForm
添加到最后一行,则输出中没有点坐标,因此没有可用于提取的模式:
使用 Plot
或 CoutourPlot
输出我会编码 Flatten[Cases[Normal@output, Line[x_] :> x, Infinity], 1]
这在这里是不可能的。
b 样条曲线本身是一个图形基元,因此您不能像那样拉出 "line"。
您需要使用相关的BSplineFunction
来生成您的积分:
pts=BSplineFunction[{{-.4, -.3}, {0, -.6}, {.4, -.3}, {0, -1.2}},
SplineClosed -> True] /@ Range[0, 1, .01];
Graphics@Line@pts
如果你需要从图形中提取你可以这样做:
Cases[graphics, BSplineCurve[a__] :> BSplineFunction[a], Infinity]
但您仍然需要为其提供 table 个参数值才能获得积分。
要仅提取控制点,您可以:
curveData=Cases[graphics, BSplineCurve[a__] :> a, Infinity]
在图形中找到了多少 BSplineCurves?
Length[curveData]
这里是其中一个的控制点
curveData// First // MatrixForm
如果您有 BSplineFunctions 列表,您可以找到更多
所以首先将 BSplineCurves 转换为 BSplineFunctions,就像之前的那样 post
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
第五个元素包含控制点坐标。第六个对应于结。其他元素看起来很熟悉,但让我们不要 post 我们的猜测!
如何提取构成以下图形的所有点的坐标(这里只是举例)?
spl = BSplineCurve[{{-.4, -.3}, {0, -.6}, {.4, -.3}, {0, -1.2}},
SplineClosed -> True] ;
Graphics[{Red, Thick, spl}]
问题是,如果我将 //FullForm
添加到最后一行,则输出中没有点坐标,因此没有可用于提取的模式:
使用 Plot
或 CoutourPlot
输出我会编码 Flatten[Cases[Normal@output, Line[x_] :> x, Infinity], 1]
这在这里是不可能的。
b 样条曲线本身是一个图形基元,因此您不能像那样拉出 "line"。
您需要使用相关的BSplineFunction
来生成您的积分:
pts=BSplineFunction[{{-.4, -.3}, {0, -.6}, {.4, -.3}, {0, -1.2}},
SplineClosed -> True] /@ Range[0, 1, .01];
Graphics@Line@pts
如果你需要从图形中提取你可以这样做:
Cases[graphics, BSplineCurve[a__] :> BSplineFunction[a], Infinity]
但您仍然需要为其提供 table 个参数值才能获得积分。
要仅提取控制点,您可以:
curveData=Cases[graphics, BSplineCurve[a__] :> a, Infinity]
在图形中找到了多少 BSplineCurves?
Length[curveData]
这里是其中一个的控制点
curveData// First // MatrixForm
如果您有 BSplineFunctions 列表,您可以找到更多
所以首先将 BSplineCurves 转换为 BSplineFunctions,就像之前的那样 post
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
第五个元素包含控制点坐标。第六个对应于结。其他元素看起来很熟悉,但让我们不要 post 我们的猜测!