WPF:كيفية تطبيق GeneralTransform إلى البيانات الهندسة و العودة الجديدة الهندسة ؟

StackOverflow https://stackoverflow.com/questions/249971

سؤال

وجود بعض البيانات الهندسة و تحويل كيف يمكن تحويل تطبيقها على الهندسة للحصول على هندسة جديدة مع البيانات انها حولت ؟

مثلا:لدي الكائن مسار هذا الطريق.مجموعة البيانات إلى PathGeometry كائن أريد أن tranform النقاط من PathGeometry كائن في مكان باستخدام تحويل وعدم تطبيق تحويل إلى PathGeometry التي سيتم استخدامها في وقت التحميل.

P. S.وأنا أعلم أن تحويل فئة لديها طريقة Point Transform.Transform(Point p) التي يمكن استخدامها لتحويل نقطة لكن هل هناك طريقة لتحويل التعسفي الهندسة في آن واحد ؟

تحرير:أرى repply عن الموجودة حاليا الحل

هل كانت مفيدة؟

المحلول

يمكنك محاولة استخدام الهندسة.الجمع بين.هذا ينطبق تحويل خلال الجمع.الصيد واحد هو أن الجمع بين يعمل فقط إذا كان لديك هندسة مساحة, حتى سطر واحد لن ينجح.

هنا عينة التي عملت بالنسبة لي.

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

نصائح أخرى

لقد وجدت الحل الذي التعسفي بتحويل يمكن تطبيقها على مسار الهندسة ، وذلك بفضل تود الأبيض's الجواب:

أساسا الهندسة.الجمع بين استخدام الجمع بين هندسة المطلوب مع الهندسة.فارغة باستخدام اتحاد المطلوب تحويل يعطى.مما أدى الهندسة تتحول مع تحول.

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

هذا هو ما وجدته يمكنك القيام به للحصول على تحول الهندسة مع كل شخصية على معلومات سليمة:

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

أنا لم استخدم الإجابة المقبولة منذ عودته الهندسة في شكل مختلف عن الأصلي, لذا تستخدم هذه:

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

أيا من الحلول السريعة على أساس الهندسة.الجمع بين الأعمال في حالة مسار مصنوعة من واحد LineElement.لذلك أنا حل المشكلة بالطريقة الصعبة, مثل هذا (ولكن أنا أيضا محدودة 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;
}
}

للأسف, أنا لا أعتقد أن هناك طريقة أو المنشأة أن تفعل ما كنت طالبا.على الأقل أنا لا يمكن العثور على واحد.(السؤال الكبير!)

يبدو أنه سيكون لديك للقيام بذلك يدويا (كما توحي لك نفسك) ...هذا هو نداء نقطة تحول.تحويل(النقطة p) كل نقطة في PathGeometry ...خلق جديد PathGeometry في هذه العملية.

ربما ليست الإجابة التي تريدها. (حزين ابتسامة)

كان عندي نفس المشكلة و تحتاج خطوط وكذلك (ليس فقط هندستها مع المنطقة).

أنا فقط باستخدام PathGeometry حتى هذا قد لا يكون الحل العام الذي تبحث عنه, ولكن هذا عمل بالنسبة لي:

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

هناك اثنين من الأشياء التي يجب عليك أن تنظر:

  1. الهندسة يرث من تجميدها لا يمكنك تعديل هندسة الكائن في المكان إذا كان المجمدة.
  2. يمكنك مسح PathGeometry قائمة الأرقام و قطاعات و تحويل جميع النقاط في نفوسهم ولكن بعض الأنواع مثل ArcSegment يشمل الأحجام والزوايا, لا يمكن تحويلها.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top