簡體   English   中英

在線檢測碰撞

[英]Detecting collision on line

如何檢測在線碰撞,最好是單擊鼠標?

我不使用XNA。 我只使用簡單的WinForms。 我不是在創造游戲。

編輯:我實現了從brone鏈接的解決方案,並得到了非常奇怪的結果。 這是小片段。 我做錯了什么? 粘貼鏈接

點與線之間的最小距離:

http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/

在他的“一般幾何”部分中有更多參考資料:

http://local.wasp.uwa.edu.au/~pbourke/geometry/

如果能夠使用線性代數,則需要檢測從測試點到線段上最近點的距離。

  • 令AB為您的線段。
  • 令C為您的鼠標指針。
  • 令D為AB上的一點,以使線段CD最小。

您想找到CD的長度。 由於AB和CD垂直,因此您知道AB的斜率是CD斜率的倒數倒數。 您知道C和一個斜率,因此可以找到CD的一般公式。 然后,找到AB與CD的交點,得出D點。

一旦有了D點,找到CD的長度就變得微不足道了。 如果該距離小於某個閾值,則表明您已經單擊了感興趣的線段附近。

好吧,由於我不記得它是如何工作的,所以我不會花時間解釋它。 但是我是用C ++編寫的,回溯到1995年代。 我敢肯定,這樣做的方式要優雅得多,因為我當時只寫了大約兩年的代碼。 無論如何,它將轉換為C#:

static bool PointHitSegment(Point[] line, Point hitPoint, int errorMargin)
{
    if (hitPoint.X >= (Math.Max(line[0].X, line[1].X) + errorMargin) ||
        hitPoint.X <= (Math.Min(line[0].X, line[1].X) - errorMargin) ||
        hitPoint.Y >= (Math.Max(line[0].Y, line[1].Y) + errorMargin) ||
        hitPoint.Y <= (Math.Min(line[0].Y, line[1].Y) - errorMargin))
        return false;

    if (line[0].X == line[1].X || line[0].Y == line[1].Y)
        return true;

    double y1, y2, x1, x2;
    double m, b;
    int ny;

    if (Math.Abs(line[0].Y - line[1].Y) <= Math.Abs(line[0].X - line[1].X))
    {
        y1 = line[0].Y;
        y2 = line[1].Y;
        x1 = line[0].X;
        x2 = line[1].X;
    }
    else
    {
        y1 = line[0].X;
        y2 = line[1].X;
        x1 = line[0].Y;
        x2 = line[1].Y;

        int tmp = hitPoint.Y;
        hitPoint.Y = hitPoint.X;
        hitPoint.X = tmp;
    }

    m = (y2 - y1) / (x2 - x1);
    b = y1 - m * x1;

    ny = (int)((m * ((double)hitPoint.X) + b) + 0.5);

    if (Math.Abs(hitPoint.Y - ny) > errorMargin)
        return false;

    return true;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM