2016-08-17 2 views
1

Я хочу, чтобы объединить 2 кривые, как этот: enter image description here Тогда вот мой код:Geometry.Combine не работает для кривых

// Create a path to draw a geometry with. 
Path myPath = new Path(); 
myPath.Stroke = Brushes.Black; 
myPath.StrokeThickness = 1; 
var gmy1 = (StreamGeometry)StreamGeometry.Parse("M100,100C110,118.333333333333 138.333333333333,206.666666666667 160,210 181.666666666667,213.333333333333 205,123.333333333333 230,120 255,116.666666666667 280,186.666666666667 310,190 340,193.333333333333 396.666666666667,156.666666666667 410,140 423.333333333333,123.333333333333 393.333333333333,98.3333333333333 390,90"); 
var gmy2 = (StreamGeometry)StreamGeometry.Parse("M180,241.25L180,241.25 230,290 300,246.66667175293 330,160"); 
var gmy = Geometry.Combine(gmy1, gmy2, GeometryCombineMode.Union, null); 
myPath.Data = gmy; 
// Add path shape to the UI. 
this.panel1.Children.Add(myPath); 

Но результат таков:

enter image description here

Как объединить кривые в WPF? И из-за ограничения проекта мы должны реализовать это без макета и xaml. Это означает, что нам нужен тип результата Geometry.

+1

какой-либо причине не объединить их как строки перед разбором? Если вы объедините эти две строки и проанализируете полученную строку, получится то, что вы хотите. –

+0

Спасибо, это может решить мою проблему. Я никогда не думал об этом. –

ответ

3

В более общем, чем конкатенация пути строки:

Если у вас есть набор произвольных геометрий и хотите сгруппировать их, использовать GeometryGroup:

Geometry gmy1 = ...; 
Geometry gmy2 = ...; 
var gmy = new GeometryGroup(); 
gmy.Children.Add(gmy1); 
gmy.Children.Add(gmy2); 
myPath.Data = gmy; 
0

Просто добавьте оба из них в Grid или Canvas, Combine делает пересекающуюся комбинацию, вы просто хотите наложить их. В качестве альтернативы добавьте оба из них в GeometryGroup и добавьте это на свою панель.

+0

Да, это так. Но из-за ограничения проекта мы должны реализовать это без макета и xaml. Есть ли аналогичный метод для комбинирования для кривых? –

+0

О чем ты говоришь? Вы уже вызываете 'this.panel1.Children.Add', вам просто нужно позвонить это дважды. –

+1

Вы также можете использовать группу геометрии. –

1

Easy:

Path myPath = new Path(); 
myPath.Stroke = Brushes.Black; 
myPath.StrokeThickness = 1; 
var gmy1 = (StreamGeometry)StreamGeometry.Parse("M100,100C110,118.333333333333 138.333333333333,206.666666666667 160,210 181.666666666667,213.333333333333 205,123.333333333333 230,120 255,116.666666666667 280,186.666666666667 310,190 340,193.333333333333 396.666666666667,156.666666666667 410,140 423.333333333333,123.333333333333 393.333333333333,98.3333333333333 390,90"); 
var gmy2 = (StreamGeometry)StreamGeometry.Parse("M180,241.25L180,241.25 230,290 300,246.66667175293 330,160"); 

var gmy = (StreamGeometry)StreamGeometry.Parse(gmy1.ToString() + gmy2.ToString()); 

myPath.Data = gmy; 
// Add path shape to the UI. 
this.panel1.Children.Add(myPath); 

Путь языка определения является язык. Используйте его как один. StreamGeometry.ToString() unparses a Geometry Вернитесь к своему описанию языка определения пути, которое затем можно объединить с другим.

Обратите внимание, что это работает, потому что каждый начинается с M для команды Move: он запускает новую строку. У меня нет думаю есть реальный случай, когда вы столкнулись с какими-либо проблемами с этим (и он не позволит вам начать с L для линии), но теория не совсем моя самая сильная тема.

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