Click here to Skip to main content
15,895,799 members
Articles / Programming Languages / Visual Basic

Mathemathics Framework

Rate me:
Please Sign up or sign in to vote.
4.76/5 (56 votes)
16 Sep 2008CPOL6 min read 75.4K   6.2K   171  
.NET Mathematical Framework
Imports System.Math
Imports BV.Core
Imports IMidRange
Imports BV.Math


''' <summary>
''' Clase Base de las escalas: guarda informacion acerca de las
''' condiciones del vector, como ser la los Maximos, los Minimos,
''' la Escala, el Offset.... asi como los valores de Screen. 
''' Permite hacer la conversion de valores de funcion a valores 
''' de Screen con los metodos Calc 
''' </summary>
''' <remarks>revisado 2/11/04</remarks>
Public Class ScaleBasic
    Inherits ScaleBase
    Implements IScale

    Public Enum LocalEngineState
        EInitializing
        EScreenReady
        ERangeReady
        EReady
        EError
    End Enum

    Protected intSecondMaxValue As Single                     'guarda el segundo maximo
    Protected intSecondMinValue As Single                     'guarda el segundo minimo

    Protected intScreenMax As Single                             'Minimo valor del Screen devuelto
    Protected intScreenMin As Single
    Protected intEngineState As LocalEngineState               'estado de la clase

    'va desde intScreenMin a intScreenMax
    Protected PEscale As Single                         'valor de escala o pendiente, se actualiza solo cuando se lee
    Protected POffset As Single                         'Offset, valor promedio, se actualiza solo cuando se lee
    Protected POriginOrdinate As Single                 'ordenada al origen, se actualiza solo cuando se lee

    'aveces (como en GDI+), el maximo y el minimo tienen valores invertidos
    Protected intAllowScreenInversion As Boolean

#Region "Constructor"

    'el constructor
    Public Sub New()
        intAllowScreenInversion = False
        Reset()
        blnIsCalculated = False
    End Sub

#End Region

#Region "Properties"

#Region "Screen Sector"

    ''' <summary>
    ''' Permite invertir la escala (maximos y  m�nimos de salida)
    ''' dando una escala inversa
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property AllowScreenInversion() As Boolean
        Get
            Return Me.intAllowScreenInversion
        End Get
        Set(ByVal Value As Boolean)
            intAllowScreenInversion = Value
        End Set
    End Property

    ''' <summary>
    ''' Rango de los valores de Salida
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable Property OutputRange() As RangeF
        Get
            Return New RangeF(Me.intScreenMax, Me.intScreenMin)
        End Get
        Set(ByVal Value As RangeF)
            Me.intScreenMax = Value.Max
            Me.intScreenMin = Value.Min
        End Set
    End Property

    ''' <summary>
    ''' M�ximo valor de salida
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property OutputMax() As Single Implements IScale.ScreenMax
        Get
            Return intScreenMax
        End Get
    End Property

    ''' <summary>
    ''' M�nimo Valor en la escala de Salida
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property OutputMin() As Single Implements IScale.ScreenMin
        Get
            Return intScreenMin
        End Get
    End Property

    ''' <summary>
    ''' Diferencia entre los valores maximos y m�nimos de salida
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property OutputDY() As Single Implements IScale.ScreenDY
        Get
            Return (intScreenMax - intScreenMin)
        End Get
    End Property

    ''' <summary>
    ''' Valor medio de los valores de salida
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property OutputOffset() As Single Implements IScale.ScreenOffset
        Get
            Return 0.5F * (intScreenMax + intScreenMin)
        End Get
    End Property


#End Region

#Region "Read Only"

    ''' <summary>
    ''' Segundo valor maximo encontrado
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property SecondMax() As Double
        Get
            Return Me.intSecondMaxValue
        End Get
    End Property

    ''' <summary>
    ''' Segundo Valor m�nimo encontrado
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property SecondMin() As Double
        Get
            Return Me.intSecondMaxValue
        End Get
    End Property

    ''' <summary>
    ''' M�ximo valor de entrada
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Property Max() As Single
        Get
            If Me.intEngineState = LocalEngineState.EReady OrElse Me.intEngineState = LocalEngineState.ERangeReady Then
                If intMax < BVMathFunctions.intOverflow Then
                    Return intMax
                Else
                    Return intSecondMaxValue
                End If
            End If
            Return 1
        End Get
        Set(ByVal Value As Single)
            MyBase.Max = Value
        End Set
    End Property

    ''' <summary>
    ''' M�nimo Valor de entrada
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Property Min() As Single 'Implements IScale.Min
        Get
            If Me.intEngineState = LocalEngineState.EReady OrElse Me.intEngineState = LocalEngineState.ERangeReady Then
                If intMin > -BVMathFunctions.intOverflow Then
                    Return intMin
                Else
                    Return intSecondMinValue
                End If
            End If
            Return 0
        End Get
        Set(ByVal Value As Single)
            MyBase.Min = Value
        End Set
    End Property

    ''' <summary>
    ''' En una escala lineal, representa a la ordenada al origens
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>leer solo una vez, sino ralentiza una operacion reiterativa!!!!</remarks>
    Public Overridable ReadOnly Property OriginOrdinate() As Single Implements IScale.OriginOrdinate
        Get
            If Not blnIsCalculated Then
                CalcInternalValues()
            End If
            Return POriginOrdinate
        End Get
    End Property

    ''' <summary>
    ''' Diferencia entre el maximo y m�nimo de entrada
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable ReadOnly Property GetDY() As Single Implements IScale.GetDY
        Get
            Return (Max - Min)
        End Get
    End Property

    ''' <summary>
    ''' En una escala lineal, representa a la pendiente
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable ReadOnly Property Scale() As Single Implements IScale.Scale
        Get
            If Not blnIsCalculated Then
                CalcInternalValues()
            End If
            Return PEscale
        End Get
    End Property

    ''' <summary>
    ''' Valor promedio de entrada
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable ReadOnly Property Offset() As Single Implements IScaleInfo.Offset
        Get
            POffset = (Max + Min) / 2
            Return POffset
        End Get
    End Property

    ''' <summary>
    ''' Valor promedio trasladado a la salida
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable ReadOnly Property ScaledOffset() As Single
        Get
            POffset = 0.5 * (Max + Min) * Scale
            Return POffset
        End Get
    End Property

    Public ReadOnly Property State() As LocalEngineState
        Get
            Return intEngineState
        End Get
    End Property

#End Region

#End Region

#Region "Reset and Setup"

    ''' <summary>
    ''' Reinicializa la clase
    ''' </summary>
    ''' <remarks></remarks>
    Public Overridable Overloads Sub Reset()
        intMax = -BVMathFunctions.intOverflow
        intSecondMaxValue = -BVMathFunctions.intOverflow
        intMin = BVMathFunctions.intOverflow
        intSecondMinValue = BVMathFunctions.intOverflow

        intScreenMin = 0
        intScreenMax = 200  'es una distancia apreciable y coherente
        Me.intEngineState = LocalEngineState.EInitializing
        blnIsCalculated = False
    End Sub

    ''' <summary>
    ''' resetea todo, pero da la opcion de mantener los valores de
    ''' Salida
    ''' </summary>
    ''' <param name="ResetScreenValues"></param>
    ''' <remarks>
    ''' Minimo de Salida = 0
    ''' M�ximo de salida = 1
    ''' </remarks>
    Public Overridable Overloads Sub Reset(ByVal ResetScreenValues As Boolean)
        intMax = -BVMathFunctions.intOverflow
        intSecondMaxValue = -BVMathFunctions.intOverflow
        intMin = BVMathFunctions.intOverflow
        intSecondMinValue = BVMathFunctions.intOverflow

        If ResetScreenValues Then
            intScreenMin = 0
            intScreenMax = 1
        End If

        intEngineState = LocalEngineState.EInitializing
        blnIsCalculated = False
    End Sub

    ''' <summary>
    ''' Utilizado para setear externamente los maximos y minimos
    ''' </summary>
    ''' <param name="A"></param>
    ''' <param name="B"></param>
    ''' <remarks></remarks>
    Public Overloads Overrides Sub Reset(ByVal A As Single, ByVal B As Single) 'implements 
        Me.Assign(A, B)
        intSecondMaxValue = Max
        intSecondMinValue = Min

        blnIsCalculated = False
        If intEngineState = LocalEngineState.EScreenReady Then
            Me.intEngineState = LocalEngineState.EReady
        ElseIf intEngineState = LocalEngineState.EInitializing Then
            Me.intEngineState = LocalEngineState.ERangeReady
        End If
    End Sub

    ''' <summary>
    ''' Utilizado para setear externamente los maximos y minimos y el Screen
    ''' </summary>
    ''' <param name="A"></param>
    ''' <param name="B"></param>
    ''' <param name="ScrMax"></param>
    ''' <param name="ScrMin"></param>
    ''' <remarks></remarks>
    Public Overridable Overloads Sub Reset(ByVal A As Single, ByVal B As Single, ByVal ScrMax As Single, ByVal ScrMin As Single) Implements IMidRange.IScale.Reset
        ResetScreen(ScrMax, ScrMin)

        Me.Assign(A, B)
        intSecondMaxValue = Max
        intSecondMinValue = Min

        blnIsCalculated = False
        intEngineState = LocalEngineState.EReady
    End Sub

    ''' <summary>
    ''' Utilizado para setear el Screen
    ''' </summary>
    ''' <param name="ScrMax"></param>
    ''' <param name="ScrMin"></param>
    ''' <remarks></remarks>
    Public Overridable Sub ResetScreen(ByVal ScrMax As Integer, ByVal ScrMin As Integer) Implements IMidRange.IScaleScreen.ResetScreen
        If Not intAllowScreenInversion Then
            If ScrMin > ScrMax Then
                Stop
                Throw New SystemException("Min Value of Screen " & ScrMin & "Must be lower that ScrMax: " & ScrMax)
                Exit Sub
            End If
        End If

        intScreenMin = ScrMin
        intScreenMax = ScrMax

        If intEngineState = LocalEngineState.ERangeReady Then
            Me.intEngineState = LocalEngineState.EReady
        ElseIf intEngineState = LocalEngineState.EInitializing Then
            Me.intEngineState = LocalEngineState.EScreenReady
        End If

        blnIsCalculated = False
    End Sub

    ''' <summary>
    ''' Utilizado para setear el Screen
    ''' </summary>
    ''' <param name="ScrMax"></param>
    ''' <param name="ScrMin"></param>
    ''' <remarks></remarks>
    Public Overridable Sub ResetScreen(ByVal ScrMax As Single, ByVal ScrMin As Single)
        If Not intAllowScreenInversion Then
            If ScrMin > ScrMax Then
                Stop
                Throw New SystemException("Min Value of Screen " & ScrMin & "Must be lower that ScrMax: " & ScrMax)
                Exit Sub
            End If
        End If

        intScreenMin = ScrMin
        intScreenMax = ScrMax

        If intEngineState = LocalEngineState.ERangeReady Then
            Me.intEngineState = LocalEngineState.EReady
        ElseIf intEngineState = LocalEngineState.EInitializing Then
            Me.intEngineState = LocalEngineState.EScreenReady
        End If

        blnIsCalculated = False
    End Sub


#End Region

#Region "Methods"

    Protected Overridable Sub CalcInternalValues()
        If Max = Min Then
            PEscale = 1         'funcion constante!!!
            POriginOrdinate = Max
        Else
            PEscale = (intScreenMax - intScreenMin) / (Max - Min)
            POriginOrdinate = (Max * intScreenMin - Min * intScreenMax) / (Max - Min)
        End If

        blnIsCalculated = True
    End Sub

#End Region

#Region "Calc Methods"

    Public Overridable Function Calc(ByVal Value As Single) As Single Implements IScaleCalc.Calc
        If Not blnIsCalculated Then
            CalcInternalValues()
        End If
        Try
            If Math.Abs(Value) < BVMathFunctions.intOverflow Then
                Calc = Value * PEscale + POriginOrdinate
            Else
                If Math.Sign(Value) * Math.Sign(PEscale) >= 0 Then
                    Return 3 * intScreenMin
                Else
                    Return 3 * intScreenMax
                End If
            End If

        Catch ex As OverflowException
            If Math.Sign(Value) * Math.Sign(PEscale) >= 0 Then
                Return 3 * intScreenMin
            Else
                Return 3 * intScreenMax
            End If
        Catch ex As Exception
            'unknown error
            Return BVMathFunctions.intOverflow
        End Try
    End Function

    Public Overridable Function CalcInv(ByVal Value As Single) As Single Implements IScaleCalc.CalcInv
        If Not Me.blnIsCalculated Then
            Me.CalcInternalValues()
        End If

        If PEscale <> 0 Then
            Return (Value - POriginOrdinate) / PEscale
        Else
            If Value > POriginOrdinate Then
                Return BVMathFunctions.intOverflow
            Else
                Return -BVMathFunctions.intOverflow
            End If
        End If
    End Function

#End Region

End Class

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Engineer Universidad Tecnológica Nacional
Argentina Argentina
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions