Code archives/Algorithms/MathEx Module

This code has been declared by its author to be Public Domain code.

Download source code

MathEx Module by JoshK2007
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

Pete Rigz2009
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...


Bobysait2009
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