CSharp - 如何将GeneralTransform应用到几何图形数据并返回 new 几何图元?

  显示原文与译文双语对照的内容

有了一些Geometry数据和Transform如何转换应用于Geometry获取新Geometry与之进行数据转换?

比如: 我有个Path对象将会有Path .Data设置为其PathGeometry对象,我想转换的点 PathGeometry对象在位使用运营变革,而不仅应用转换到PathGeometry将要在渲染时使用。

p .S 。 我知道Transform类有一个方法 Point Transform.Transform(Point p)可用于转换Point但除掉有方法可以转换任意几何图形一次?

编辑: 查看我当前找到的repply 解决方案?

时间: 原作者:

你可以试着使用Geometry .Combine 。 在应用过程中的转换合并。 一个catch就是Combine只能工作在你Geometry已经熟悉,所以单行将不起作用。

下面是一个示范的作用了我。

PathGeometry geometry = new PathGeometry();
geometry.Figures.Add(new PathFigure(new Point(10, 10), new PathSegment[] { new LineSegment(new Point(10, 20), true), new LineSegment(new Point(20, 20), true) }, true));
ScaleTransform transform = new ScaleTransform(2, 2);
PathGeometry geometryTransformed = Geometry.Combine(geometry, geometry, GeometryCombineMode.Intersect, transform);

我找到了解决其在其中任意转换可应用于路径几何图形,这要归功于 Todd White 是答:?

基本上Geometry .Combine用于将所需几何体与Geometry .Empty使用Union,并给出所需的转换。 得到的变换几何使用给定的转换。

PathGeometry geometryTransformed = Geometry.Combine(Geometry.Empty, geometry, GeometryCombineMode.Union, transform);
原作者:

我没有使用接受回答以来返回中的几何图形格式与原始文件不同,所以我用它:

Geometry inputGeometry = new PathGeometry();
var inputGeometryClone = inputGeometry.Clone(); // we need a clone since in order to
                                                // apply a Transform and geometry might be readonly
inputGeometryClone.Transform = new TranslateTransform(); // applying some transform to it
var result = inputGeometryClone.GetFlattenedPathGeometry();
原作者:

这是我的发现可以做得到的转换几何图形与所有图信息不变:

var geometry = new PathGeometry();
geometry.Figures.Add(new PathFigure(new Point(10, 10), new PathSegment[] { new LineSegment(new Point(10, 20), true), new LineSegment(new Point(20, 20), true) }, true));
geometry.Transform = new ScaleTransform(2, 2);

var transformedGeometry = new PathGeometry ();
// this copies the transformed figures one by one into the new geometry
transformedGeometry.AddGeometry (geometry); 
原作者:

我有同样的问题并且需要也行( 不仅几何图形与区域) 。

我只用PathGeometry,所以这可能不是一般的解决方案要查找,但这工作了我:

pathgeometry.Transform = transform;
PathGeometry transformed =  PathGeometry.CreateFromGeometry(pathgeometry);
原作者:

没有一个快速的解决方案基于Geometry .Combine工作对于路径由单个LineElement 。 所以我就解决问题的,如下所示( But很艰难我也限于PathGeometry ) :

public static class GeometryHelper
{
public static PointCollection TransformPoints(PointCollection pc, Transform t)
{
  PointCollection tp = new PointCollection(pc.Count);
  foreach (Point p in pc)
    tp.Add(t.Transform(p));
  return tp;
}
public static PathGeometry TransformedGeometry(PathGeometry g, Transform t)
{
  Matrix m = t.Value;
  double scaleX = Math.Sqrt(m.M11 * m.M11 + m.M21 * m.M21);
  double scaleY = (m.M11 * m.M22 - m.M12 * m.M21) / scaleX;
  PathGeometry ng = g.Clone();
  foreach (PathFigure f in ng.Figures)
  {
    f.StartPoint = t.Transform(f.StartPoint);
    foreach (PathSegment s in f.Segments)
    {
      if (s is LineSegment)
        (s as LineSegment).Point = t.Transform((s as LineSegment).Point);
      else if (s is PolyLineSegment)
        (s as PolyLineSegment).Points = TransformPoints((s as PolyLineSegment).Points, t);
      else if (s is BezierSegment)
      {
        (s as BezierSegment).Point1 = t.Transform((s as BezierSegment).Point1);
        (s as BezierSegment).Point2 = t.Transform((s as BezierSegment).Point2);
        (s as BezierSegment).Point3 = t.Transform((s as BezierSegment).Point3);
      }
      else if (s is PolyBezierSegment)
        (s as PolyBezierSegment).Points = TransformPoints((s as PolyBezierSegment).Points, t);
      else if (s is QuadraticBezierSegment)
      {
        (s as QuadraticBezierSegment).Point1 = t.Transform((s as QuadraticBezierSegment).Point1);
        (s as QuadraticBezierSegment).Point2 = t.Transform((s as QuadraticBezierSegment).Point2);
      }
      else if (s is PolyQuadraticBezierSegment)
        (s as PolyQuadraticBezierSegment).Points = TransformPoints((s as PolyQuadraticBezierSegment).Points, t);
      else if (s is ArcSegment)
      {
        ArcSegment a = s as ArcSegment;
        a.Point = t.Transform(a.Point);
        a.Size = new Size(a.Size.Width * scaleX, a.Size.Height * scaleY); // NEVER TRIED
      }
    }
  }
  return ng;
}
}
原作者:

不幸的是,我觉得有一个方法或属性执行你在说些什么。 至少,我找不到一个。 ( 伟大的问题啊)

好像你会用手工计算( 就如你建议) 。。。 即调用 Point Transform .Transform( Point p ) 中每个数据点 PathGeometry 。。。 创建新PathGeometry进程中。

可能不是所需答案。 ( Rueful Grin )

原作者:

有两件事你得考虑一下:

  1. 几何图形从Freezable继承,因此无法修改该几何图形对象到位如果被定格了。
  2. 可以扫描PathGeometry图形和线段和转换的列表上的所有点他们但某些类型,像ArcSegment包括大小和角度,你不能改变它们。
原作者:
...