2013-04-28 64 views
1

我有幾個隨機大小的畫布對象並應用RenderTransform角度。 內部畫布我有幾何對象(線)。WPF如何檢查應用轉換時的幾何交叉點?

我正在使用綁定的寬度和高度來加載父路徑畫布對象的路徑。

enter image description here

<Path x:Name="gem2_Copy" Stretch="Fill" Stroke="Black" Opacity="0.345" RenderTransformOrigin="0.5,0.5" Width="{Binding ActualWidth, ElementName=canvas}" Height="{Binding ActualHeight, ElementName=canvas}"> 
      <Path.Data> 
       <PathGeometry> 
        <PathFigure IsClosed="True" IsFilled="True"> 
         <LineSegment Point="0,0"> 

         </LineSegment> 
         <LineSegment Point="5,5"> 

         </LineSegment> 
         <LineSegment Point="0,5"> 

         </LineSegment>  
        </PathFigure> 
       </PathGeometry>  
      </Path.Data> 

      </Path> 

如何檢查的PathFigure與其他道路相交的幾何? 我algoritm檢查線交叉,但由於路徑分線點我可以不適用它始終是: 0,0 5,5 0,5

,我需要全局座標。我怎樣才能將路徑點轉換爲全局座標,並考慮到渲染轉換角度改變,路徑寬度和高度改變?

foreach (var figure in geom.Figures) 
{ 
    foreach (LineSegment segment in figure.Segments) 
    { 
     // I have here 0,0;5,5;0,5 
    } 
} 

回答

1

已經找到怎麼辦主要部分:

// Get scale transformation (find scale factor) 
    var w = (gem2_Copy.ActualWidth/gem2_Copy.Data.Bounds.Width); 
    var h = (gem2_Copy.ActualHeight/gem2_Copy.Data.Bounds.Height); 
    var transform = new ScaleTransform(w, h); 

    foreach (var figure in geom.Figures) 
    { 
     foreach (LineSegment segment in figure.Segments) 
     { 
     // Use scale transformation to change geometry points position. 
     var scaled=transform.Transform(segment.Point); 

     // Translate point to screen coordinates (including rotation) 
     var onScreen = canvas.TranslatePoint(scaled, root); 

     // Use line intersection formula 
     } 
    } 

代碼,可以找到交集:

public static Vector? Intersects(Point a1, Point a2, Point b1, Point b2) 
    { 
     Vector b = a2 - a1; 
     Vector d = b2 - b1; 
     var bDotDPerp = b.X * d.Y - b.Y * d.X; 

     if (bDotDPerp == 0) 
      return null; 

     Vector c = b1 - a1; 
     var t = (c.X * d.Y - c.Y * d.X)/bDotDPerp; 
     if (t < 0 || t > 1) 
     { 
      return null; 
     } 

     var u = (c.X * b.Y - c.Y * b.X)/bDotDPerp; 
     if (u < 0 || u > 1) 
     { 
      return null; 
     } 

     return new Vector(a1.X, a1.Y) + t * b; 
    }