; Almost anything that has to do
; with values or certain ranges
; will at one point be converted
; to something else.
;
; Take for example a progressbar
; drawn using a hollow rectangle
; and a filled rectangle.
;
; You have 100 tasks to complete
; and after each task you want to
; update the progressbar.
Tasks = 100
; The progressbar is drawn horizontally
; and has a width of the current screen.
Width = GraphicsWidth ()
; Here's an example program:
SetBuffer BackBuffer ()
For Task = 1 To Tasks
Position = Task * Width / Tasks ; <--
Color 0 , 64 , 128
Rect 0 , 0 , Position , 100 , True
Color 255 , 255 , 255
Rect 0 , 0 , Width , 100 , False
Flip
Cls
Next
WaitKey
; Note the arrow where the magic occurs.
; Here's basically how it works:
;
; Input value
;
; |
; \|/
;
; Formula
;
; |
; \|/
;
; Output value
;
; Okay, that looks just
; like any other formula.
; But this time you actually
; take out the old range
; and insert a new one.
;
; Input ( Old Range ) --> Output ( New Range )
;
; The principle is a lot like
; converting one type of variable
; to another type of variable.
;
; Here's the basic construct:
;
; Old Value -> Divide by Old Range -> Multiply with New Range -> New Value
;
; In a formula:
;
; New Value = Old Value / Old Range * New Range
;
; Take a look at the formula from the progressbar program.
;
; Position = Task * Width / Tasks
;
; Task is the old value.
; Tasks is the old range.
; Width is the new range.
; Position is the new value.
;
; The order of multiplication/division
; can be swapped to increase accuracy.
;
; For example you have an old value.
Old_Value = 1
; And an old range.
Old_Range = 5
; You want to convert it to a new range.
New_Range = 100
; Let's calculate it.
New_Value = Old_Value / Old_Range * New_Range
; What's in it?
Print New_Value
WaitKey
; Zero!
;
; Here's what happened:
;
; 0 = 1 / 5 * 100
;
; The division happened first.
;
; 1 / 5 = 0.2
;
; And because we were using
; straight integers,
; the value was rounded to 0.
;
; I guess you know what happens next.
;
; 0 * 100 = 0
;
; So let's use floats you say.
; Alright.
New_Value = Float Old_Value / Old_Range * New_Range
Print New_Value
WaitKey
; This seems to work nicely.
;
; But what if we just swap
; the order of operations instead?
New_Value = Old_Value * New_Range / Old_Range
Print New_Value
WaitKey
; That works too :)
;
; So we've now calculated
; that 1 out of 5 is actually 20%
; where our old range is 5
; and our new range is 100.
;
; Old Value
;
; |---|---.---.---.---| Old Range
; ' ' '^'--..__
; ' ' `^`^--..__
; ' ' '^'^--..__
; ' ' `^`^--.._
; |-----|-----.-----.-----.-----.-----.-----.-----.-----.-----| New Range
;
; New Value
;
; When you use floats
; you can actually say that
; you normalize the old value
; to a (universal) range of 1.
;
; Uni_Value = Old_Value / Old_Range
;
; You could also call this the factor
; and people usually refer to this as the delta.
;
; There are countless number of occasions
; where you can apply this technique.
; Both in the computerworld as well as in real life.
; And I don't mean just numbers :o)
;
; What if I said each range can have
; its own starting value as well?
; Maybe you understand this already.
;
; An old value,
; with an offset/starting value,
; could be in the range of [10..20].
Old_Value = 15
; And you want to convert it
; to a new range, being [0..5].
;
; So, the old range offset is 10.
Old_Offset = 10
; And the old range is 20 - 10 = 10
Old_Range = 10
; The new offset would be..
New_Offset = 0
; And the new range is 5 - 0 = 5
New_Range = 5
; Before we can convert the value
; from the old range to the new range
; we'd have to normalize it to an offset of zero.
; Yes, exactly like with the factor/delta.
Old_Value = Old_Value - Old_Offset
; Now we can convert it to the new range.
New_Value = Old_Value * New_Range / Old_Range
; And add the new range offset,
; even though it's 0.
New_Value = New_Value + New_Offset
Print New_Value
WaitKey
; Satisfied? :)
;
; You can also put the entire thing in 1 big formula.
New_Value = ( Old_Value - Old_Offset ) * New_Range / Old_Range + New_Offset
; Voila! :)
;
; This is basically also how you can make
; a zoom-in function on a radar screen
; just to name something.