Я создаю плагин autocad, который получает точки из существующей геометрии, передает его в другие окна и создает объект с той же геометрией на холсте, что и полилиния. Объект Autocad является полилинией, поэтому некоторые точки (вершины) должны быть перегружены.Полилинии, расширенные на холсте при перетаскивании с использованием PointCollection C# WPF
Я собираю точки из AutoCAD, длиной вершин и преобразования, в центре объекта в реальных координатах на холсте. Затем, когда я рисую его, я получаю это:
Точки, которые я собираю правильны, они трансформируются simetrically. А код для рисования на холсте здесь:
private void drawOnCanvas(List<Point> points)
{
// Create a black Brush
SolidColorBrush blackBrush = new SolidColorBrush();
blackBrush.Color = Colors.Black;
// Create a polyline
Polyline poly = new Polyline();
poly.Stroke = blackBrush;
poly.StrokeThickness = 4;
// Create a collection of points for a polyline
PointCollection polygonPoints = new PointCollection();
for (int i = 0; i < points.Count-1; i++)
{
polygonPoints.Add(points[i]);
}
// Set Polyline.Points properties
poly.Points = polygonPoints;
// Add polyline to the page
canvas.Children.Add(poly);
}
Когда я вхожу отладчик, точки отображаются так:
Как вы видите, точки определяются в правильном направлении.
private void canvas_MouseMove(object sender, MouseEventArgs e)
{
Point p = Mouse.GetPosition(canvas);
coords.Content = p.ToString();
}
Когда я читаю координаты с mouseMove, удлиненная сторона длиннее примерно на половину длины (50/2).
Почему это происходит и как решить эту проблему?
Обновлено Решение:
for (int i = 0; i < points.Count - 1; i += 2)
{
pathGeometry = pathGeometry + "M" + points[i].X.ToString("F2") + " " + points[i].Y.ToString("F2") + " " + "L" + points[i + 1].X.ToString("F2") + " " + points[i + 1].Y.ToString("F2") + " ";
}
canvas.Children.Add(new Path { Stroke = Brushes.Brown, StrokeThickness = 3, Data = Geometry.Parse(pathGeometry) });
Обновлено Решение 2: (Бетер раствор)
PathFigure figures = new PathFigure();
figures.StartPoint = points[0];
points.RemoveAt(0);
figures.Segments = new PathSegmentCollection(points.Select((p, i) => new LineSegment(p, i % 2 == 0)));
PathGeometry pg = new PathGeometry();
pg.Figures.Add(figures);
canvas.Children.Add(new Path { Stroke = Brushes.Brown, StrokeThickness = 3, Data = pg });
двух нот. Вы можете написать 'poly.Stroke = Brushes.Black;' вместо создания нового SolidColorBrush. У PointCollection есть конструктор, который принимает аргумент 'IEnumerable', поэтому вы можете удалить весь оператор' for' и просто написать 'poly.Points = new PointCollection (points);'. Весь метод может быть записан как 'canvas.Children.Add (новая полилиния {Stroke = Brushes.Black, StrokeThickness = 4, Points = new PointCollection (points)});' –
Clemens
спасибо, что указали это, но я могу ' t использовать 'Points = new PointCollection (points)', так как я набираю 1 балл меньше .. см. в моем коде 'for (int i = 0; i
dodoria1992
Вы можете написать 'new PointCollection (points.Take (points.Count - 1))'. 'Take' - это метод расширения в' System.Linq.Enumerable'. – Clemens