Ankündigung

Einklappen
Keine Ankündigung bisher.

Lookuptabelle für lineare Approximation

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [eibPC] Lookuptabelle für lineare Approximation

    [highlight=epc]
    //----------------------------------------------------------------------
    // Makros für den Enertex EiBPC
    //
    // Zweck : Makros um aus Stützstellen einen
    // linear interpolierten Wert zu ermitteln
    //
    // Version : V 1.3, März 2012
    //
    // Autor + Copyright : Bernd Meiners
    //
    //----------------------------------------------------------------------
    //
    // // Benutzung: NAME ist hier als eindeutiger Tabellenname gewählt
    //
    // // Zunächst das "Grundeinstellen" der Parameter, also Name, min und max
    // SetupStaticLookupTable( NAME, 0.0f32, 360.0f32 )
    //
    // // Dann pro Datenpunkt den man haben möchte ein XY-Paar anlegen.
    // // Dabei muß darauf Rücksicht genommen werden, das die Werte aufsteigen
    // // und keine negative Steigung entsteht.
    // AddStaticPoint(NAME, 0.0f32, 100.0f32 )
    // AddStaticPoint(NAME, 90.0f32, 100.0f32 )
    // AddStaticPoint(NAME, 95.0f32, 10.0f32 )
    // AddStaticPoint(NAME, 140.0f32, 10.0f32 )
    // AddStaticPoint(NAME, 150.0f32, 30.0f32 )
    // AddStaticPoint(NAME, 170.0f32, 40.0f32 )
    // AddStaticPoint(NAME, 190.0f32, 40.0f32 )
    // AddStaticPoint(NAME, 210.0f32, 30.0f32 )
    // AddStaticPoint(NAME, 220.0f32, 10.0f32 )
    // AddStaticPoint(NAME, 265.0f32, 10.0f32 )
    // AddStaticPoint(NAME, 270.0f32, 100.0f32 )
    // AddStaticPoint(NAME, 360.0f32, 100.0f32 )

    // // Der tatsächliche Vergleich erfolgt in diesem Makro, dort
    // // wir auch der Sonderfall x0 == x1 berücksichtigt.
    // DoStaticLookup(NAME)
    //
    // // Die Berechnung findet dann statt, wenn sich im vorigen Zyklus
    // // der Wert für NAME_xin geändert hat.
    // // Das Ergebnis findet sich direkt nach dem DoStaticLookup
    // // in NAME_yout

    :begin SetupStaticLookupTable( Name, XMin, XMax)
    :info $Legt die LookupTabelle mit den Grundvariablen an$
    // Die Werte für Eingabe und Ausgabe
    Name_xin = 0.0f32
    Name_yout = 0.0f32
    Name_NumPoints = 0u16
    Name_Index = 0u16
    Name_x0 = 0.0f32
    Name_x1 = 0.0f32
    Name_y0 = 0.0f32
    Name_y1 = 0.0f32

    // Bei Änderung immer für neue Berechnung sorgen
    if change( Name_xin ) then {
    Name_x0 = XMin;
    Name_x1 = XMax;
    Name_y0 = 0.0f32;
    Name_y1 = 0.0f32;
    Name_Index = 0u16;
    } endif
    :end

    :begin AddStaticPoint( Name, X0, Y0 )
    :info $Fügt ein Wertepaar an die Lookuptabelle an$
    :var NameX@
    :var NameY@
    :var NamePoint@
    NameX@ = X0
    NameY@ = Y0
    NamePoint@ = 0u16

    if systemstart() then NamePoint@ = Name_Index endif

    // nur neu berechnen, wenn sich der Eingangswert verändert hat
    if change( Name_xin ) and !systemstart() then {
    if Name_Index == 0u16 then {
    Name_x0 = NameX@;
    Name_y0 = NameY@;
    } endif;

    if Name_xin >= NameX@ then {
    if NameX@ > Name_x0 then {
    Name_x0 = NameX@;
    Name_y0 = NameY@;
    } endif;
    } endif;

    if Name_xin <= NameX@ then {
    if NameX@ < Name_x1 then {
    Name_x1 = NameX@;
    Name_y1 = NameY@;
    } endif;
    } endif;
    Name_Index = Name_Index + 1u16;
    } endif

    if systemstart() then {
    Name_NumPoints = max( Name_NumPoints, Name_Index);
    Name_Index = Name_Index + 1u16;
    } endif
    :return
    :end

    :begin DoStaticLookup( Name )
    :info $Führt die Approximation durch$
    // jetzt nur noch eine Lineare Approximation
    if change( Name_xin ) and !systemstart() then {
    if Name_x0 == Name_x1 then {
    Name_yout = Name_y0;
    } endif;

    if Name_x0 < Name_x1 then {
    Name_yout = Name_y0 + (Name_y1 - Name_y0) / (Name_x1 - Name_x0) * ( Name_xin - Name_x0);
    } endif;
    } endif
    :return
    :end
    [/highlight]

Lädt...
X