1

嗨,我有一条来自 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 点集合的代码:

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);
            }
        }
    }
}

< 编辑图像 >

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

在此处输入图像描述

这是从代码重新创建的样子。

在此处输入图像描述

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

希望这能让它更清楚。

4

2 回答 2

1

您可以简单地调用ToStringPathGeometry 来一次获取整个路径数据字符串:

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

为什么不能在调用 GetFlattenedPathGeometry 之前将 ScaleTransform 应用于整个几何?以下内容对我来说非常有效(在排除的 CombinedGeometry 中有两个 EllipseGeometry):

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);
于 2013-09-16T09:34:33.913 回答
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

在此处输入图像描述

于 2013-09-16T11:21:17.867 回答