C# WPF -> 如何从网格上的拉伸(均匀)多边形获取坐标
C# WPF -> How to get the coordinates from a stretched(uniform) polygon on a grid
我进行了大量搜索以找到解决我的问题的方法。找不到任何东西。
我就是这样做的:
我通过网格上的点数组渲染多边形。多边形自动调整自身大小以匹配网格大小(均匀)。我使用以下行获得新的拉伸坐标并使用方法创建椭圆:
var transform = myPolygon.RenderedGeometry.Transform;
foreach (var point in myPolygon.Points)
{
var transformedPoint = transform.Transform(point);
CreateEllipse(5, 5, Convert.ToDouble(Convert.ToString(transformedPoint).Split(';')[0]), Convert.ToDouble(Convert.ToString(transformedPoint).Split(';')[1]), gridPoly);
}
Ellipse CreateEllipse(double width, double height, double desiredCenterX, double desiredCenterY, Grid grid)
{
Ellipse ellipse = new Ellipse { Width = width, Height = height };
double left = desiredCenterX - (width / 2);
double top = desiredCenterY - (height / 2);
ellipse.Stroke = System.Windows.Media.Brushes.Black;
ellipse.Fill = System.Windows.Media.Brushes.DarkBlue;
ellipse.Margin = new Thickness(left, top, 0, 0);
grid.Children.Add(ellipse);
return ellipse;
}
问题是,如果我将多边形放在网格上,然后将椭圆放在网格上,它们将呈现精确的一半大小,而不是在正确的位置,甚至不是相对的。如果我将拉伸设置为 'none'.
,也会发生同样的情况
如果我在 canvas 上渲染我的多边形和椭圆,它们会在每个多边形点上精确渲染,一切都很完美。另外,canvas不支持stretch.Uniform。而且我需要动态地将多边形适合其父对象。
我的问题是,如何使用点位置数据在自动调整大小的多边形上渲染椭圆?
你还要考虑两件事。
首先,Grid 可以根据其 HorizontalAlignment 和 VerticalAlignment 属性对齐(即移动)整个拉伸的 Polygon。如果您不想自己计算,可以通过 myPolygon.TransformToAncestor(grid)
:
获得合适的 GeneralTransform 对象
var polygonGeometryTransform = myPolygon.RenderedGeometry.Transform;
var polygonToGridTransform = myPolygon.TransformToAncestor(gridPoly);
foreach (var point in myPolygon.Points)
{
var transformedPoint = polygonToGridTransform.Transform(
polygonGeometryTransform.Transform(point));
CreateEllipse(5, 5, transformedPoint.X, transformedPoint.Y, gridPoly);
}
其次,当您相对于网格的左上角对椭圆进行绝对定位时,您必须将它们的 HorizontalAlignment 设置为 Left
并将 VerticalAlignment 设置为 Top
:
ellipse.HorizontalAlignment = HorizontalAlignment.Left;
ellipse.VerticalAlignment = VerticalAlignment.Top;
grid.Children.Add(ellipse);
也就是说,您通常不会为绝对定位设置元素的边距。为椭圆使用单独的 Canvas 并设置它们的 Canvas.Left
和 Canvas.Top
属性会更简洁。
我进行了大量搜索以找到解决我的问题的方法。找不到任何东西。
我就是这样做的:
我通过网格上的点数组渲染多边形。多边形自动调整自身大小以匹配网格大小(均匀)。我使用以下行获得新的拉伸坐标并使用方法创建椭圆:
var transform = myPolygon.RenderedGeometry.Transform;
foreach (var point in myPolygon.Points)
{
var transformedPoint = transform.Transform(point);
CreateEllipse(5, 5, Convert.ToDouble(Convert.ToString(transformedPoint).Split(';')[0]), Convert.ToDouble(Convert.ToString(transformedPoint).Split(';')[1]), gridPoly);
}
Ellipse CreateEllipse(double width, double height, double desiredCenterX, double desiredCenterY, Grid grid)
{
Ellipse ellipse = new Ellipse { Width = width, Height = height };
double left = desiredCenterX - (width / 2);
double top = desiredCenterY - (height / 2);
ellipse.Stroke = System.Windows.Media.Brushes.Black;
ellipse.Fill = System.Windows.Media.Brushes.DarkBlue;
ellipse.Margin = new Thickness(left, top, 0, 0);
grid.Children.Add(ellipse);
return ellipse;
}
问题是,如果我将多边形放在网格上,然后将椭圆放在网格上,它们将呈现精确的一半大小,而不是在正确的位置,甚至不是相对的。如果我将拉伸设置为 'none'.
,也会发生同样的情况如果我在 canvas 上渲染我的多边形和椭圆,它们会在每个多边形点上精确渲染,一切都很完美。另外,canvas不支持stretch.Uniform。而且我需要动态地将多边形适合其父对象。
我的问题是,如何使用点位置数据在自动调整大小的多边形上渲染椭圆?
你还要考虑两件事。
首先,Grid 可以根据其 HorizontalAlignment 和 VerticalAlignment 属性对齐(即移动)整个拉伸的 Polygon。如果您不想自己计算,可以通过 myPolygon.TransformToAncestor(grid)
:
var polygonGeometryTransform = myPolygon.RenderedGeometry.Transform;
var polygonToGridTransform = myPolygon.TransformToAncestor(gridPoly);
foreach (var point in myPolygon.Points)
{
var transformedPoint = polygonToGridTransform.Transform(
polygonGeometryTransform.Transform(point));
CreateEllipse(5, 5, transformedPoint.X, transformedPoint.Y, gridPoly);
}
其次,当您相对于网格的左上角对椭圆进行绝对定位时,您必须将它们的 HorizontalAlignment 设置为 Left
并将 VerticalAlignment 设置为 Top
:
ellipse.HorizontalAlignment = HorizontalAlignment.Left;
ellipse.VerticalAlignment = VerticalAlignment.Top;
grid.Children.Add(ellipse);
也就是说,您通常不会为绝对定位设置元素的边距。为椭圆使用单独的 Canvas 并设置它们的 Canvas.Left
和 Canvas.Top
属性会更简洁。