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