您好我有一个来自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;
以下是从几何图形中减去矩形和椭圆的原始路径。
这就是从代码中重新创建的内容。
如果我使用原始的GetFlattenedPathGeometry,它看起来像原始,但我需要将点缩放到新的分辨率。
希望这更清楚。
答案 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