Code archives/Algorithms/MathEx Module
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Some much-needed math functions including Curve(), RGBA(), and others | |||||
Strict Rem bbdoc: End Rem Module leadwerks.mathex ModuleInfo "Version: 1.0.0" ModuleInfo "Author: Joshua Klint" ModuleInfo "Copyright: Leadwerks Corporation" ModuleInfo "www.leadwerks.com" Import brl.math Rem bbdoc: End Rem Function Curve:Float(newvalue:Float,oldvalue:Float,increments#) Local sign,slip# sign=Sgn(oldvalue-newvalue) slip#=(oldvalue-newvalue)/increments If Abs(slip)<m slip=m*Sgn(slip) oldvalue=oldvalue-slip If sign<>Sgn(oldvalue-newvalue) Return newvalue Return oldvalue EndFunction Rem bbdoc: EndRem Function Radians:Float(Degrees:Float) Return Degrees*Pi/180.0 EndFunction Rem bbdoc: EndRem Function Degrees:Float(Radians:Float) Return Radians/Pi*180.0 EndFunction Rem bbdoc: End Rem Function CurveAngle#(newangle#,oldangle#,increments#) If increments>1 oldangle=oldangle Mod 360.0 newangle=newangle Mod 360.0 If (oldangle+360)-newangle<newangle-oldangle oldangle=360+oldangle If (newangle+360)-oldangle<oldangle-newangle newangle=360+newangle oldangle=oldangle-(oldangle-newangle)/increments EndIf If increments<=1 oldangle=newangle Return oldangle EndFunction Rem bbdoc: End Rem Function Dbl!(val!) Return val! EndFunction Rem bbdoc: End Rem Function Log2#(num#) Return Log(num)/0.693147 End Function Rem bbdoc: EndRem Function Pow2:Int(val,mode=0) Return Round(2^Round(Log2(val))) EndFunction Rem bbdoc: End Rem Function Round(val#) Local dec# dec#=val-Floor(val) If dec<0.5 Return Floor(val) Else Return Ceil(val) EndFunction Rem bbdoc: End Rem Function Red:Int(hue) Return (hue & $000000FF) EndFunction Rem bbdoc: End Rem Function Green:Int(hue) Return (hue & $0000FF00) Shr 8 EndFunction Rem bbdoc: End Rem Function Blue:Int(hue) Return (hue & $00FF0000) Shr 16 EndFunction Rem bbdoc: End Rem Function Alpha:Int(hue) Return (hue & $FF000000) Shr 24 EndFunction Rem bbdoc: End Rem Function RGB:Int(r,g,b) Return r+(g Shl 8)+(b Shl 16)+(255 Shl 24) End Function Rem bbdoc: End Rem Function RGBA:Int(r,g,b,a) Return r+(g Shl 8)+(b Shl 16)+(a Shl 24) End Function Rem bbdoc: End Rem Function Clamp:Float(value:Float,minvalue:Float=0.0,maxvalue:Float=1.0) value=Max(value,minvalue) value=Min(value,maxvalue) Return value EndFunction |
Comments
| ||
Thanks for this. Is the curve function right? Variable m is not declared so it doesn't compile, and seeing that m is not used prior to that condition I'm guessing something must be missing... |
| ||
For the Curve function, I don't really understand all the stuff... My function is just like this : Function Curve#(newvalue#,oldvalue#,increments#) If increments<=1 Return newvalue Return oldvalue+(newvalue-oldvalue)/increments End Function for the CurveAngle : I converted into blitz3d and it seems to have an issue Function CurveAngle#(newangle#,oldangle#,increments#) If increments<=1 Return newangle If increments>1 oldangle=oldangle Mod (360) newangle=newangle Mod (360) If (oldangle+360)-newangle<newangle-oldangle oldangle=360+oldangle If (newangle+360)-oldangle<oldangle-newangle newangle=360+newangle oldangle=oldangle-(oldangle-newangle)/increments EndIf Return oldangle End Function Function CurveAngle_#(an#,ao# , inc#) If inc<=1 Return an ao=ao Mod(360) an=an Mod(360) If an-ao>180 ao=ao+360 If ao-an>180 an=an+360 Return ao+(an-ao)/inc End Function Graphics 800,600,0,2 SetBuffer BackBuffer() r=150 r2=170 update=True Repeat If MouseHit(1) update=True If update ang1=Rand(-1000,1000) ang2=Rand(-1000,1000) Cls Color 255,255,180 Text 10,10,"ang1="+ang1 Text 10,25,"ang2="+ang2 For n = 1 To 10 Color 255,255,000 ang=CurveAngle_( ang1 , ang2 , n) Line 200,300,200+r*Cos(ang),300+r*Sin(ang) Text 200+r2*Cos(ang),300+r2*Sin(ang),n Color 000,128,255 Line 200+r2*Cos(ang1),300+r2*Sin(ang1) ,200,300 Line 200,300, 200+r2*Cos(ang2),300+r2*Sin(ang2) Color 255,128,000 ang=CurveAngle( ang1 , ang2 , n) Line 600,300,600+r*Cos(ang),300+r*Sin(ang) Text 600+r2*Cos(ang),300+r2*Sin(ang),n Color 000,128,255 Line 600+r2*Cos(ang1),300+r2*Sin(ang1) ,600,300 Line 600,300, 600+r2*Cos(ang2),300+r2*Sin(ang2) Next Flip update=False EndIf Until KeyHit(1) End CurveAngle_ is my function ( the Yellow "circle" ) CurveAngle is the translation of the bmx's( the Orange "circle" ) +> for some cases, the CurveAngle function draw the wrong way . and here is a new function that perfoms a "modulo" for angle Function Round360#(ang#) Return ang-Int(ang/360)*360 End Function the function CurveAngle become : Function CurveAngle_#(an#,ao# , inc#) If inc<=1 Return an ao=Round360 (ao) an=Round360 (an) If an-ao>180 ao=360+ao If ao-an>180 an=360+an Return ao+(an-ao)/inc End Function |
Code Archives Forum