On 10/11/2013 08:20 AM, Jussi Lahtinen wrote:
> My brains jammed to think about that wrap function, and I think if you want
> function that wraps screen like in old video
> games, then is that C implementation really correct?
>
> They say that Wrap(-1, 1, 4) should return 3, but if you have traveled two
> steps over border of the screen (1 -> 0, 0 -> -1),
> then you should come up two steps from other border (4 -> 3, 3 -> 2).
> So Wrap(-1,
> 1, 4) should be 2.
>
> C implementation is only for integers, but if you also need to use floats
> then,
> Wrap(0.5, 1, 4) should be 3.5, and Wrap(4.5, 1, 4) should be 1.5.
>
> Because if Wrap(0, 1, 4) = 4, then what would be Wrap(0.5, 1, 4) and
> Wrap(-0.5,
> 1, 4)?
> They cannot both be 3.5!!
>
> C implementation connects borders with one step between them, my
> implementation connects the borders
> with zero steps. So that Wrap(0.999, 1, 4) = 3.999, Wrap(4.001, 1, 4) =
> 1.001, Wrap(1,1,4) = 1 and Wrap(4,1,4)=4.
>
> So I think this gives correct answers:
>
> Private Function MyWrap(fX As Float, fLowerBound As Float, fUpperBound As
> Float) As Float
>
> Dim fRange As Float = fUpperBound - fLowerBound
>
> If fX < fLowerBound Then
> Return fUpperBound - Abs(fmod((fX - fLowerBound), fRange))
> Else If fX > fUpperBound Then
> Return fmod(fX - fLowerBound, fRange) + fLowerBound
> Else
> Return fX
> Endif
>
> End
>
>
> It needs declaration of fmod:
> Private Extern fmod(fNumber As Float, fDenom As Float) As Float In "libm:6"
>
>
> Jussi
Thou art a genius. It works brilliantly. Here's my final code:
---
Public Extern fmod(fNumber As Float, fDenom As Float) As Float In "libm:6"
Public Function Wrap_Single(Minimum As Single, Maximum As Single, Value
As Single) As Single
' Constrain value to specified range.
' General declarations.
Dim Spread As Single ' Range between minimum and maximum values.
' Calculate and return wrapped value.
If Value < Minimum Then
Spread = Maximum - Minimum
Return Maximum - Abs(fmod((Value - Minimum), Spread))
Else If Value > Maximum Then
Spread = Maximum - Minimum
Return fmod(Value - Minimum, Spread) + Minimum
Else
Return Value
Endif
End
---
Thanks for the help. I've been on an code efficiency binge lately and
this helps a lot.
--
Kevin Fishburne
Eight Virtues
www: http://sales.eightvirtues.com
e-mail: [email protected]
phone: (770) 853-6271
------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk
_______________________________________________
Gambas-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gambas-user