Microsoft Small Basic

Program Listing: MJZ514
' Brick and Ladder
' Copyright © 2020 Nonki Takahashi. The MIT License.

ll = 500 ' ladder length [cm]
bw = 120 ' width of brick palette [cm]
bh = 150 ' height of brick palette [cm]

GraphicsWindow.Title = "Brick and Ladder"
gw = 600
gh = 600
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
xo = 50
yo = gh - 50

' draw floor
GraphicsWindow.BrushColor = "Gray"
GraphicsWindow.FillRectangle(0, yo, gw, gh - yo)

' draw wall
GraphicsWindow.FillRectangle(0, 0, xo, yo)

' draw brick palette
GraphicsWindow.BrushColor = "FireBrick"
GraphicsWindow.FillRectangle(xo, yo - bh, bw, bh)

' draw ladder
d1 = 0
d2 = ll
SearchDistance()
DrawLadder()
d1 = ll
d2 = 0
SearchDistance()
DrawLadder()

Sub DrawLadder
GraphicsWindow.PenColor = "Black"
GraphicsWindow.PenWidth = 10
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.FontName = "Consolas"
GraphicsWindow.DrawLine(xo, yo - lh, xo + ld, yo)
GraphicsWindow.DrawText(xo + ld, yo + 6, (Math.Round(ld) / 100) + "[m]")
EndSub

Sub SearchDistance
' param d1, d2 - range of distance
' return ld - ladder distance
' return lh - ladder height
e = 1 ' error
While 0.1 < Math.Abs(e)
ld = (d1 + d2) / 2
lh = Math.SquareRoot(ll * ll - ld * ld)
If 0 < lh Then
e = ld / lh * (lh - bh) - bw
EndIf
If (lh = 0) Or (0 <= e) Then
d2 = ld
ElseIf e < 0 Then
d1 = ld
EndIf
EndWhile
EndSub