2015-03-04 2 views
2

Как извлечь координаты всех точек, которые составляют следующую графику (здесь просто пример)?Извлечение координат из графики сплайна Mathematica

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

Проблема заключается в том, что если добавить //FullForm к последней строке нет координат точки на выходе, так что никакой закономерности не использовать, чтобы сделать эту добычу: С Plot или CoutourPlot выходом я бы кодированным Flatten[Cases[[email protected], Line[x_] :> x, Infinity], 1]
это невозможно здесь.

ответ

2

B-сплайн сам по себе является графическим примитивом, поэтому вы не можете вытащить «линию».

Вы должны использовать соответствующий BSplineFunction для генерации точек:

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


[email protected]@pts 

enter image description here

Если вам нужно извлечь из графика вы можете сделать это:

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

но вы все равно нужно передать ему таблицу значений параметров, чтобы получить свои очки.

+0

Спасибо! Вы открыли мне дверь для множества новых возможностей. – wojtek

2

Чтобы извлечь только контрольные точки вы можете пойти:

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

сколько BSplineCurves были найдены в графике?

Length[curveData] 

вот контрольные точки одного из них

curveData// First // MatrixForm 

Если у вас есть список BSplineFunctions вы можете узнать гораздо больше

поэтому сначала преобразовать 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[[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-й элемент содержит координаты контрольной точки. Шестой соответствует узлам. Другие элементы выглядят знакомыми, но не будем публиковать наши догадки!

Смежные вопросы