Basic Univers
Procedure Circles_Faster_Collision(cx1.f, cy1.f, radius1.f, cx2.f, cy2.f, radius2.f)
dCenter.f =(cx2 - cx1) *(cx2 - cx1) +(cy2 - cy1) *(cy2 - cy1)
dRadius.f =(radius1 + radius2) *(radius1 + radius2)
If dCenter <= dRadius
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure Circles_Fast_Collision(cx1.f, cy1.f, radius1.f, cx2.f, cy2.f, radius2.f)
d.f = Sqr((cx2 - cx1) *(cx2 - cx1) +(cy2 - cy1) *(cy2 - cy1))
If d <= radius1 + radius2
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure Circles_Collision(x1.f, y1.f, r1.f, x2.f, y2.f, r2.f)
dx.f =(x1 - x2)
dy.f =(y1 - y2)
If Abs(dx) <= r1 And Abs(dy) <= r1
ProcedureReturn #True
EndIf
If dx = 0 And dy = 0
ProcedureReturn #True
Else
dxdy.f = dx / dy
N.f =(r2 * r2 - r1 * r1 - x2 * x2 + x1 * x1 - y2 * y2 + y1 * y1) /(2 *(y1 - y2))
A.f = dxdy * dxdy + 1
B.f = 2 * y1 * dxdy - 2 * N * dxdy - 2 * x1
C.f =(x1 * x1 + y1 * y1 + N * N - r1 * r1 - 2 * y1 * N)
Delta.f = B * B - 4 * A * C
If Delta < 0
ProcedureReturn #False
Else
ProcedureReturn #True
EndIf
EndIf
EndProcedure
ScreenWidth = GetSystemMetrics_(#SM_CXSCREEN)
ScreenHeight = GetSystemMetrics_(#SM_CYSCREEN)
ScreenDepth = 32
If InitSprite() And InitMouse() And InitKeyboard()
If OpenScreen(ScreenWidth, ScreenHeight, ScreenDepth, "")
Quit = #False
Repeat
FlipBuffers()
ClearScreen(0, 0, 0)
ExamineKeyboard()
ExamineMouse()
MouseX = MouseX()
MouseY = MouseY()
If KeyboardPushed(#PB_Key_Escape) : Quit = #True : EndIf
StartDrawing(ScreenOutput())
DrawingMode(4)
If Circles_Faster_Collision(ScreenWidth / 2, ScreenHeight / 2, 200, MouseX, MouseY, 200)
Color = #Red
Else
Color = #White
EndIf
Circle(ScreenWidth / 2, ScreenHeight / 2, 200, Color)
Circle(MouseX, MouseY, 200, Color)
StopDrawing()
Until Quit
EndIf
EndIf
End