§Algorithm§


☆もっと高速に−線分交差判定−☆

 線分交差判定といっても、すべての与えられた線分に対して、同様な計算を 行って判定していたのでは、無駄が多いように見えます。場合によっては もっと単純な軽い判定で行えるはずです。そこで、 『場合分けによるラフチェック』を もっと簡単に−線分交差判定−のプロシージャ に追加して、次のように変更します。

'構造体
Private Type POINT
    x As Double
    y As Double
End Type

'座標 p1,p2 を結ぶ線分と座標 p3,p4 を結ぶ線分が交差しているかを調べる
'ただし、線分が重なっている場合(3点,4点が一直線上にある)、「交差している」、と判定します。
Private Function intersectionEX(p1 As POINT, p2 As POINT, _ 
                               p3 As POINT, p4 As POINT) As Boolean
    'x座標によるチェック
    If (p1.x >= p2.x) Then
        If ((p1.x < p3.x And p1.x < p4.x) Or (p2.x > p3.x And p2.x > p4.x)) Then
            intersectionEX = False: Exit Function
        End If
    Else
        If ((p2.x < p3.x And p2.x < p4.x) Or (p1.x > p3.x And p1.x > p4.x)) Then
            intersectionEX = False: Exit Function
        End If
    End If
    'y座標によるチェック
    If (p1.y >= p2.y) Then
        If ((p1.y < p3.y And p1.y < p4.y) Or (p2.y > p3.y And p2.y > p4.y)) Then
            intersectionEX = False: Exit Function
        End If
    Else
        If ((p2.y < p3.y And p2.y < p4.y) Or (p1.y > p3.y And p1.y > p4.y)) Then
            intersectionEX = False: Exit Function
        End If
    End If
    
    If (((p1.x - p2.x) * (p3.y - p1.y) + (p1.y - p2.y) * (p1.x - p3.x)) * _
        ((p1.x - p2.x) * (p4.y - p1.y) + (p1.y - p2.y) * (p1.x - p4.x)) > 0#) Then
        intersectionEX = False: Exit Function
    End If
    If (((p3.x - p4.x) * (p1.y - p3.y) + (p3.y - p4.y) * (p3.x - p1.x)) * _
        ((p3.x - p4.x) * (p2.y - p3.y) + (p3.y - p4.y) * (p3.x - p2.x)) > 0#) Then
        intersectionEX = False: Exit Function
    End If
    intersectionEX = True

End Function

例えば、次のように明らかに交差していない場合、このラフチェックで 判定できます。

 この判定を行うことにより、より高速化できます。 さらに、4点が一直線上にある場合についても正確に判定可能です。


(この判定は万能か?)

・・・といったら、そうではありません。与えられる線分の範囲が狭ければ、 ラフチェックであまり引っかからなくなるので、無駄な処理となってしまう 可能性もあります。色々な範囲で交差判定の速度を測ってみるのも面白いかも知れません。


(Special Thanks)

線分交差判定や場合分け、ラフチェックにおける高速化などについて、 (株)ハル研究所さまの御好意で、勉強させていただきました。


(サンプルプログラムの動作確認)

機種 PC-9821V13S
OS Windows95
開発ツール Visual Basic Ver.4.0
更新日 00/07/22

ダウンロード rapidCross.lzh(3.10KB)

Visual Basic Ver.5.0,Ver.6.0でも問題なく動作すると思います。
なお、このコーナーに掲載されているプログラムコード、およびプログラムファ イルが原因で生じた損害などに関して一切の責任を負うことはできません。

★こちらは従来通り、掲載されているプログラムコード、およびプログラムファ イルを無断で配布・転載することは、原則として禁止です。


Algorithmインデックス トップ


Copyright(C)2000 Tomoya. All rights reserved.