2010-12-14 1 views
3

мой вопрос прост.Преобразование геометрии в путь в wpf (со смесью?)

как я могу преобразовать этот код:

<Path> 
    <Path.Data> 
     <EllipseGeometry Center="5,4" RadiusX="4" RadiusY="4"/> 
    </Path.Data> 
</Path> 

в нечто вроде

<Path Data="M 0 5 L 3 10 10 0"/> 

(обратите внимание, что второй один производит птичку, а не эллипс Это было только для целей иллюстрации. и моя цель состоит в том, чтобы: найти, какая последовательность дает эллипс)

Редактировать: Я также прочитал документ о кривых Безье в xaml и полностью осознал, что могу просто произвести t он правильный код, вычисляя точные точки кривой Безье, чтобы получить эллипс, но я не хочу идти на хлопот делать это вычисление самостоятельно, поэтому мне было интересно, есть ли простой способ сделать это (в Blend, возможно,)

+0

Дубликат http://stackoverflow.com/questions/5227830/convert-geometry-path-to- minilanguage-string – jpierson

ответ

7

Это показывает, как это сделать из кода. Я не уверен, что это решит вашу проблему или нет - вы говорите «со смесью»? в названии, и я не знаю, как это сделать в Blend. Но я надеюсь, что это может помочь.

Первый шаг должен был бы преобразовать EllipseGeometry в PathGeometry:

var geom = new EllipseGeometry(new Point(5, 4), 4, 4); 
var pathGeometry = PathGeometry.CreateFromGeometry(geom); 

После того, как вы получили PathGeometry вы можете просто позвонить ToString и это даст вам строковое представление:

string pathText = pathGeometry.ToString(); 

В моей системе это дает следующий довольно подробный текст:

"M9,4C 9,6.20913899932317 7.20913899932317,8 5,8 2.79086100067683,8 1,6.20913899932317 1,4 1,1.79086100067683 2.79086100067683,0 5,0 7.20913899932317,0 9,1.79086100067683 9,4z»

Теперь, если вы хотите, чтобы в конечном итоге именно что вы получили бы, если бы вы кормили эту строку в Xaml, вам нужно еще один шаг, потому что Xaml формы вы поставки:

<Path Data="M 0 5 L 3 10 10 0"/> 

не производит PathGeometry. Он создает StreamGeometry, что является чуть более эффективным, но фиксированным представлением пути. (Основное различие в том, что вы не можете разжиться отдельных объектов, представляющих различные фигуры и в более сегментами StreamGeometry, в то время как вы можете с PathGeometry. StreamGeometry дешевле, в результате.)

Вы можете получить StreamGeometry из текста пути:

var streamGeometry = StreamGeometry.Parse(pathText); 

И затем, если вы хотите, чтобы в Path просто построить его:

var p = new Path { Data = streamGeometry }; 

в зависимости от того, что вашей точной цели есть, могут быть более эффективные способы сделать это. (StreamGeometry - более эффективное представление, потому что оно заканчивается созданием гораздо меньшего количества объектов. Но маршрут, с помощью которого мой код добирается до этого представления, не очень эффективен, поэтому вам может быть лучше просто остановить с PathGeometry, что самый первый фрагмент кода производит ,В качестве альтернативы, если ваша цель состоит в том, чтобы просто получить текст пути, то PathGeometry также будет достаточным для ваших нужд.)

+0

Это действительно больше, чем я хотел. первые два этапа и результат: «M9,4C9,6.20913899932317 7.20913899932317,8 5,8 2,79086100067683,8 1,6,20913899932317 1,4 1,1.79086100067683 2,79086100067683,0 5,0 7.20913899932317,0 9,1.79086100067683 9,4z« где только что я хотел. Отлично! Остальное - хороший бонус :) (я не знал, что StreamGeometry лучше ... Я посмотрю на это – David

+0

Я бы не сказал, что StreamGeometry всегда «лучше». Это более эффективно с точки зрения памяти, но в результате вы теряете некоторую гибкость. –