WPF在运行时修改路径数据

时间:2013-09-16 08:55:25

标签: c# wpf path geometry

您好我有一个来自GetFlattenedPathGeometry的路径,我可以遍历数字和段来获取要添加到PointCollection的点。

然后,我将每个point.x / y乘以比例因子,以获得原始路径数据的完整缩放版本。 (不使用scaletransform,因为它不符合我的要求)。

如果我使用类似的东西:

public static PathGeometry GetPathGeometry(PointCollection polygonCorners)
{
    List<PathSegment> pathSegments = new List<PathSegment> { new     PolyLineSegment(polygonCorners, true) };
    PathGeometry pathGeometry = new PathGeometry();
    pathGeometry.Figures.Add(new PathFigure(polygonCorners[0], pathSegments, true));
    return pathGeometry;
} 

它返回一个新的路径几何,但不处理排除路径几何的椭圆,因为路径只是一条连续的线。

有没有办法将PointCollection转换为Path.Data(例如:用“M”“L”等)让我重用Geometry.Parse(新字符串)?

这是我用来获得flattenedgeometry pointcollection的代码:

PathGeometry g = path.Data.GetFlattenedPathGeometry();
foreach (var f in g.Figures)
{
    foreach (var s in f.Segments)
    {
        if (s is PolyLineSegment)
        {
            foreach (var pt in ((PolyLineSegment) s).Points)
            {
                strGeom += pt.ToString();
                Point ptn = new Point(pt.X * ScaleX, pt.Y * ScaleY);
                pcol.Add(ptn);
            }
        }
    }
}

&LT;编辑图像&gt;

以下是从几何图形中减去矩形和椭圆的原始路径。

enter image description here

这就是从代码中重新创建的内容。

enter image description here

如果我使用原始的GetFlattenedPathGeometry,它看起来像原始,但我需要将点缩放到新的分辨率。

希望这更清楚。

2 个答案:

答案 0 :(得分:1)

您只需在PathGeometry上调用ToString即可立即获取整个路径数据字符串:

var sourceGeometry = path.Data.GetFlattenedPathGeometry();
var geometryString = sourceGeometry.ToString(CultureInfo.InvariantCulture);
var targetGeometry = Geometry.Parse(geometryString);

为什么不能在调用GetFlattenedPathGeometry之前将ScaleTransform应用于整个几何体?以下对我来说非常适合(在不包括CombinedGeometry中有两个EllipseGeometries):

var pathGeometry = path.Data.Clone();
pathGeometry.Transform = new ScaleTransform(0.5, 0.5);
var scaledGeometry = pathGeometry.GetFlattenedPathGeometry();

编辑:从你在问题和评论中写的内容来看,我猜你实际想要做的就是添加或组合具有不同缩放因子的几何。如果这是真的,那么您的扁平几何方法到目前为止很复杂,因为您可以使用以下两种方法轻松实现:

private PathGeometry AddGeometries(
    Geometry geometry1, Geometry geometry2, double scale)
{
    geometry2 = geometry2.Clone();
    geometry2.Transform = new ScaleTransform(scale, scale);
    var pathGeometry = PathGeometry.CreateFromGeometry(geometry1);
    pathGeometry.AddGeometry(geometry2);
    return pathGeometry;
}

private PathGeometry CombineGeometries(
    Geometry geometry1, Geometry geometry2, GeometryCombineMode mode, double scale)
{
    geometry2 = geometry2.Clone();
    geometry2.Transform = new ScaleTransform(scale, scale);
    return Geometry.Combine(geometry1, geometry2, mode, null);
}

给定一个在其Data属性中具有某些几何体的Path,您现在可以使用这样的调用添加(或组合)一个带有缩放因子的任意其他几何体:

Geometry newGeometry1 = ...
double scale1 = ...
path.Data = AddGeometries(path.Data, newGeometry1, scale1);

Geometry newGeometry2 = ...
double scale2 = ...
path.Data = CombineGeometries(path.Data, newGeometry2,
            GeometryCombineMode.Exclude, scale2);

答案 1 :(得分:0)

坚持不懈地找到答案。

获取flattenedpathgeometry的每个点并为每个点添加比例并使用新点重新创建相同的flattenedpathgeometry的代码。希望它可以帮到某人。谢谢克莱门斯。感谢你的努力。

path.Data = Geometry.Parse(CurrentObject.Geometry1);
PathGeometry g = path.Data.GetFlattenedPathGeometry();

PathGeometry g = path.Data.GetFlattenedPathGeometry();

foreach (var f in g.Figures)
{
Point pt1 = f.StartPoint;
pt1.X = pt1.X * ScaleX;
pt1.Y = pt1.Y * ScaleY;
strGeom += "M" + pt1.ToString();
    foreach (var s in f.Segments)
    if (s is PolyLineSegment)
    {
        count = 0;
        foreach (var pt in ((PolyLineSegment)s).Points)
    {
        int scount = ((PolyLineSegment)s).Points.Count;
        if (count == 0)
        {
            Point pts = new Point(pt.X * ScaleX, pt.Y * ScaleY);
            strGeom += "L" + pts.ToString();
        }
        else if (count < scount)
        {
            Point pts = new Point(pt.X * ScaleX, pt.Y * ScaleY);
            strGeom += " " + pts.ToString();
        }
        else if (count == scount)
        {
            Point pts = new Point(pt.X * ScaleX, pt.Y * ScaleY);
            strGeom += " " + pts.ToString() + "Z";
        }
        count++;
    }
    }
}
path.Data = Geometry.Parse(strGeom);

这是从远程会话发送的路径的图像:1366x768缩放到1920x1080

enter image description here