- Private Function FindLineCircleIntersections(ByVal cx As _
- Single, ByVal cy As Single, ByVal radius As Single, _
- ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As _
- Single, ByVal y2 As Single, ByRef ix1 As Single, ByRef _
- iy1 As Single, ByRef ix2 As Single, ByRef iy2 As _
- Single) As Integer
- Dim dx As Single
- Dim dy As Single
- Dim A As Single
- Dim B As Single
- Dim C As Single
- Dim det As Single
- Dim t As Single
- dx = x2 - x1
- dy = y2 - y1
- A = dx * dx + dy * dy
- B = 2 * (dx * (x1 - cx) + dy * (y1 - cy))
- C = (x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy) - _
- radius * radius
- det = B * B - 4 * A * C
- If (A <= 0.0000001) Or (det < 0) Then
- ' No real solutions.
- Return 0
- ElseIf det = 0 Then
- ' One solution.
- t = -B / (2 * A)
- ix1 = x1 + t * dx
- iy1 = y1 + t * dy
- Return 1
- Else
- ' Two solutions.
- t = (-B + Sqrt(det)) / (2 * A)
- ix1 = x1 + t * dx
- iy1 = y1 + t * dy
- t = (-B - Sqrt(det)) / (2 * A)
- ix2 = x1 + t * dx
- iy2 = y1 + t * dy
- Return 2
- End If
- End Function
Si devuelve 0 no hay colisión, si devuelve 1 hay colisión, si devuelve 2 hay "solapamiento" --> eso vale para seguir aplicando las leyes físicas pertinentes hasta conseguir que retorne 1 y en ese moemento es cuando se debe producir el calculo del rebote del circulo con la linea.