2013-04-21 46 views
2

c#中是否有預定義的方法可以進行碰撞檢測?如何做c#碰撞檢測?

我是新來的c#和我試圖得到兩個橢圓的碰撞檢測是否有任何預定義的方式可以實現碰撞檢測?

我已經有繪製橢圓的代碼,那麼啓動碰撞檢測的好方法是什麼?

private void timer1_Tick(object sender, EventArgs e) 
    { 
     //Remove the previous ellipse from the paint canvas. 
     canvas1.Children.Remove(ellipse); 

     if (--loopCounter == 0) 
      timer.Stop(); 

     //Add the ellipse to the canvas 
     ellipse = CreateAnEllipse(20, 20); 
     canvas1.Children.Add(ellipse); 

     Canvas.SetLeft(ellipse, rand.Next(0, 500)); 
     Canvas.SetTop(ellipse, rand.Next(0, 310)); 
    } 

    // Customize your ellipse in this method 
    public Ellipse CreateAnEllipse(int height, int width) 
    { 
     SolidColorBrush fillBrush = new SolidColorBrush() { Color = Colors.Yellow}; 
     SolidColorBrush borderBrush = new SolidColorBrush() { Color = Colors.Black }; 

     return new Ellipse() 
     { 
      Height = height, 
      Width = width, 
      StrokeThickness = 1, 
      Stroke = borderBrush, 
      Fill = fillBrush 
     }; 
    } 

這是繪製橢圓然後被移除並出現在另一個位置的代碼。

+0

你能發表該代碼的例子嗎? – 2013-04-21 15:57:13

+0

wpf不是一個遊戲框架,它沒有類似精靈般的功能,如碰撞檢測。你可以做的最好的辦法是獲得兩個橢圓的邊界矩形,並使用'RectangleF.IntersectsWith'。否則,您將不得不計算兩個橢圓的接近角度,即該角度的半徑,然後查看兩個半徑的長度是否小於或等於兩個橢圓的焦點之間的距離。 – 2013-04-21 16:05:42

回答

5

我已經測試了這一點,它的工作,對我來說

enter image description here

var x1 = Canvas.GetLeft(e1); 
var y1 = Canvas.GetTop(e1); 
Rect r1 = new Rect(x1, y1, e1.ActualWidth, e1.ActualHeight); 


var x2 = Canvas.GetLeft(e2); 
var y2 = Canvas.GetTop(e2); 
Rect r2 = new Rect(x2, y2, e2.ActualWidth, e2.ActualHeight); 

if (r1.IntersectsWith(r2)) 
    MessageBox.Show("Intersected!"); 
else 
    MessageBox.Show("Non-Intersected!"); 
+0

你幫我,我有一個主意!從你的回答 – 2014-03-26 18:13:25

1

至少我想你肯定應該給看看XNA framework,它有方法做碰撞檢測的負荷。

看看這個其他link關於如何在c#中手動實現它可能會有所幫助。

+1

xna是矯枉過正,因爲OP不開發遊戲。 – David 2013-04-21 16:21:48

0

只要你的橢圓總是圓(即其WidthHeight屬性設置爲相同的值),他們總是有Canvas.LeftCanvas.Top屬性設置,下面的輔助方法檢查碰撞:

public static bool CheckCollision(Ellipse e1, Ellipse e2) 
{ 
    var r1 = e1.ActualWidth/2; 
    var x1 = Canvas.GetLeft(e1) + r1; 
    var y1 = Canvas.GetTop(e1) + r1; 
    var r2 = e2.ActualWidth/2; 
    var x2 = Canvas.GetLeft(e2) + r2; 
    var y2 = Canvas.GetTop(e2) + r2; 
    var d = new Vector(x2 - x1, y2 - y1); 
    return d.Length <= r1 + r2; 
} 
2

會像下面的工作?

var ellipse1Geom = ellipse1.RenderedGeometry; 
var ellipse2Geom = ellipse2.RenderedGeometry; 
var detail = ellipse1Geom.FillContainsWithDetail(ellipse2Geom); 
if(detail != IntersectionDetail.Empty) 
{ 
    // We have an intersection or one contained inside the other 
} 

Geometry.FillContainsWithDetail(Geometry)方法被定義爲

返回描述當前幾何結構和給定的幾何之間的交點的值。