Frage

Nachdem ich einige Daten Geometrie und eine Transformation wie kann die auf die Geometrie angewendet werden Transformation mit seinen Daten transformiert, um eine neue Geometrie zu bekommen?

Beispiel: Ich habe ein Pfad-Objekt, das hat es Path.Data auf ein PathGeometry Objekt gesetzt, ich will tranform die Punkte des PathGeometry Objekts anstelle einen mit transformieren, und nicht für eine auf die PathGeometry verwandeln, die Zeit machen verwendet wird.

P. S. Ich weiß, dass die Transform-Klasse eine Methode Point Transform.Transform(Point p) hat, die verwendet werden kann, um einen Punkt zu verwandeln, aber ... ist es eine Möglichkeit, eine beliebige Geometrie auf einmal zu transformieren?

Edit:   Siehe meine repply für ein zur Zeit gefunden Lösung

War es hilfreich?

Lösung

Sie könnten versuchen, und verwenden Geometry.Combine. Es gilt ein während der Mähdrescher verwandeln. Ein Haken ist, dass Kombinieren Sie funktioniert nur, wenn Ihr Geometrie Bereich, so einzelne Linien nicht funktionieren.

Hier ist ein Beispiel, das für mich gearbeitet.

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

Andere Tipps

Ich habe eine Lösung, mit der beliebige TRANFORM gefunden kann auf eine Bahngeometrie angewendet werden, dank Todd White 's Antwort:

Im Grunde Geometry.Combine wird verwendet, um die gewünschte Geometrie mit Geometry.Empty mit Union zu verbinden und die gewünschte Transformation gegeben ist. Die sich ergebende Geometrie-Transformation mit dem gegebenen transformiert.

PathGeometry geometryTransformed = Geometry.Combine(Geometry.Empty, geometry, GeometryCombineMode.Union, transform);

Das ist, was ich gefunden Sie tun können, um eine transformierte Geometrie mit all den Figur Informationen zu erhalten intakt:

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

Ich habe verwenden akzeptierte Antwort nicht, da es Geometrie im Format von dem ursprünglichen unterschiedlicher Rückkehr wurde, so habe ich dies:

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

Keine der schnellen Lösungen auf Basis von Geometry.Combine arbeitet im Fall des Weges eines einzelnen LineElement gemacht. So löste ich das Problem auf die harte Art und Weise, wie diese (aber ich bin auch beschränkt auf 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;
}
}

Leider, ich glaube nicht, dass es eine Methode oder Eigenschaft ist zu tun, was Sie fordern. Zumindest kann ich nicht finden. (Gute Frage!)

Es scheint, wie Sie es von Hand würde zu tun haben (wie Sie selbst vorschlagen) ... dass Anruf Punkt Transform.Transform (Punkt p) für jeden Punkt in Ihrem PathGeometry ... Erstellen ein neuer PathGeometry in den Prozess einzubeziehen.

Wahrscheinlich ist nicht die Antwort, die Sie wollen. (Rueful Grin)

Ich habe das gleiche Problem hatte und brauchen auch (nicht nur Geometrien mit Bereich) Linien.

Ich verwende nur PathGeometry, so kann dies nicht die allgemeine Lösung, die Sie suchen, aber das ist für mich:

pathgeometry.Transform = transform;
PathGeometry transformed =  PathGeometry.CreateFromGeometry(pathgeometry);

Es gibt zwei Dinge, die Sie beachten müssen:

  1. Geometrie von Freezable erbt, können Sie das Geometrieobjekt an Ort und Stelle nicht ändern, wenn es gefroren ist.
  2. Sie können die PathGeometry Liste von Zahlen und Segmente scannen und alle Punkte in ihnen verwandeln, aber einige Arten, wie ArcSegment Größen und Winkel enthält, man kann sie nicht verwandeln.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top