2012-01-07 86 views
0

在我的WPF多點觸控應用程序中,我想檢查路徑是否與另一路徑重疊。如何檢查2個WPF路徑(使用MatrixTransform)是否重疊

我該怎麼做?我發現在互聯網上不同的解決方案,但沒有工作,因爲需求的結合,:

  • 2路徑不規則形狀的(這樣界限不工作:沒有矩形)
  • 路徑上的一個MatrixTransform應用
  • 路徑可以旋轉和縮放(使用MatrixTransform)(因爲操縱事件)
  • 的RenderTransformOrigin爲0.5,0.5

我怎樣才能做到這一點?

示例:在本例中,藍色和紅色星星重疊,紅色和綠色不重疊。

<Window x:Class="WPFTest.OtherWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="OtherWindow" Height="300" Width="300" > 
<Canvas > 
    <Path x:Name="path1" Data="M17,0 L23,11 34,13 27,21 28,32 18,24 8,30 9,19 0,11 13,11 z" Fill="#99FF0000" Stroke="Black" RenderTransformOrigin="0.5,0.5"> 
     <Path.RenderTransform> 
      <MatrixTransform Matrix="1,0,0,1,50,50"/> 
     </Path.RenderTransform> 
    </Path> 
    <Path x:Name="path2" Data="M17,0 L23,11 34,13 27,21 28,32 18,24 8,30 9,19 0,11 13,11 z" Fill="#990000FF" Stroke="Black" RenderTransformOrigin="0.5,0.5"> 
     <Path.RenderTransform> 
      <MatrixTransform Matrix="0.777817459305202,0.777817459305202,-0.777817459305202,0.777817459305202,35,45"/> 
     </Path.RenderTransform> 
    </Path> 
    <Path x:Name="path3" Data="M17,0 L23,11 34,13 27,21 28,32 18,24 8,30 9,19 0,11 13,11 z" Fill="#9900FF00" Stroke="Black" RenderTransformOrigin="0.5,0.5"> 
     <Path.RenderTransform> 
      <MatrixTransform Matrix="0.777817459305202,0.777817459305202,-0.777817459305202,0.777817459305202,82,55"/> 
     </Path.RenderTransform> 
    </Path> 
</Canvas> 

如何檢查這從後面的代碼?

感謝,

吉姆

回答

0

如果它是可以接受的,您可以使用轉換幾何形狀Path.Data代替(render-)轉化路徑(當然是有缺點,他們的行程將不縮放)。 一旦你使用了這種變換的幾何圖形,你可以通過Geometry.FillContainsWithDetail來確定它們的相互交集,它爲你提供了一個相交類型的枚舉值。

您的XAML可能如下所示。請注意,因爲幾何體沒有像變換原點那樣的東西,所以我修改了幾何體,以使座標原點位於其中心。我還將產生的偏移量添加到MatrixTransform偏移值。

<Canvas> 
    <Path Name="redStar" Fill="#99FF0000" Stroke="Black"> 
     <Path.Data> 
      <PathGeometry Figures="M0,-16 L6,-5 17,-3 10,5 11,16 1,8 -9,14 -8,3 -17,-5 -4,-5 z"> 
       <PathGeometry.Transform> 
        <MatrixTransform Matrix="1,0,0,1,67,66"/> 
       </PathGeometry.Transform> 
      </PathGeometry> 
     </Path.Data> 
    </Path> 
    <Path Name="blueStar" Fill="#990000FF" Stroke="Black"> 
     <Path.Data> 
      <PathGeometry Figures="M0,-16 L6,-5 17,-3 10,5 11,16 1,8 -9,14 -8,3 -17,-5 -4,-5 z"> 
       <PathGeometry.Transform> 
        <MatrixTransform Matrix="0.777817459305202,0.777817459305202,-0.777817459305202,0.777817459305202,52,61"/> 
       </PathGeometry.Transform> 
      </PathGeometry> 
     </Path.Data> 
    </Path> 
    <Path Name="greenStar" Fill="#9900FF00" Stroke="Black"> 
     <Path.Data> 
      <PathGeometry Figures="M0,-16 L6,-5 17,-3 10,5 11,16 1,8 -9,14 -8,3 -17,-5 -4,-5 z"> 
       <PathGeometry.Transform> 
        <MatrixTransform Matrix="0.777817459305202,0.777817459305202,-0.777817459305202,0.777817459305202,99,71"/> 
       </PathGeometry.Transform> 
      </PathGeometry> 
     </Path.Data> 
    </Path> 
</Canvas> 

下面的代碼將決定交點:

Geometry redGeometry = redStar.Data; 
Geometry blueGeometry = blueStar.Data; 
Geometry greenGeometry = greenStar.Data; 

Trace.TraceInformation("red/blue intersection: {0}", redGeometry.FillContainsWithDetail(blueGeometry)); 
Trace.TraceInformation("blue/green intersection: {0}", blueGeometry.FillContainsWithDetail(greenGeometry)); 
Trace.TraceInformation("green/red intersection: {0}", greenGeometry.FillContainsWithDetail(redGeometry)); 

redGeometry.Transform = new MatrixTransform(1, 0, 0, 1, 70, 90); 

Trace.TraceInformation("red/blue intersection: {0}", redGeometry.FillContainsWithDetail(blueGeometry)); 
+0

感謝您的答覆。我測試了它,它工作。但是,當我嘗試更新代碼中的轉換(通過:redGeometry.Transform = new MatrixTransform(......))時,該對象在屏幕上正確轉換,但FillContainsWithDetail不返回正確的值。有任何想法嗎? – Jim 2012-01-07 21:44:45

+0

查看已更改的答案,數據而不是RenderedGeometry應該可以工作。 – Clemens 2012-01-07 23:43:05

+0

Jim,如果將frm RenderedGeometry更改爲Data,它是否按預期工作?如果是,請考慮通過點擊接受打勾接受答案。 – Clemens 2012-01-26 08:56:47