Asscalc Expressions: Unterschied zwischen den Versionen

Aus WiFX - The Karaoke Wiki for ASSCalc, NyuFX, Lua, AFX, Tenfex & Templater
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „Expressions sind reine Mathefunktionen zum berechnen verschiedenster Dinge. Es sind die absoluten Basics an Mathe, aber die meißten Funktionen wie ein Bezier ode…“)
 
 
(17 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
Expressions sind reine Mathefunktionen zum berechnen verschiedenster Dinge. Es sind die absoluten Basics an Mathe, aber die meißten Funktionen wie ein Bezier oder ähnliches lassen sich auch leicht damit beschreiben. Grundsätzlich beachtet Calc '''keine''' Punkt vor Strich Rechnung, sondern berechnet alles schön der Reihe nach. Um dies zu kontrollieren sollte man viel auf die () und Notepad C++ zurück greifen mit der Scriptvieweinstellung für Lua. Alle Mathefunktionen können in Variablen abgelegt werden oder direkt in anderen Expressions oder Commands wieder benutzt und verschachtelt werden. (Achtung Commands können nicht ineinander verschachtelt werden, dies gilt nur für Expressions!).
 
Expressions sind reine Mathefunktionen zum berechnen verschiedenster Dinge. Es sind die absoluten Basics an Mathe, aber die meißten Funktionen wie ein Bezier oder ähnliches lassen sich auch leicht damit beschreiben. Grundsätzlich beachtet Calc '''keine''' Punkt vor Strich Rechnung, sondern berechnet alles schön der Reihe nach. Um dies zu kontrollieren sollte man viel auf die () und Notepad C++ zurück greifen mit der Scriptvieweinstellung für Lua. Alle Mathefunktionen können in Variablen abgelegt werden oder direkt in anderen Expressions oder Commands wieder benutzt und verschachtelt werden. (Achtung Commands können nicht ineinander verschachtelt werden, dies gilt nur für Expressions!).
  
 +
==Addieren==
 
       |      expr '+' expr { $$.value = $1.value + $3.value }
 
       |      expr '+' expr { $$.value = $1.value + $3.value }
  
 
Addition von zwei Variablen oder Zahlen.
 
Addition von zwei Variablen oder Zahlen.
  
'''<u>Beispiel:</u>
+
'''<u>Beispiel:</u>'''
  
 
test1=test2+4
 
test1=test2+4
'''
+
 
 +
==Subtrahieren==
 
       |      expr '-' expr  { $$.value = $1.value - $3.value }
 
       |      expr '-' expr  { $$.value = $1.value - $3.value }
  
Zeile 17: Zeile 19:
 
test1=test2-4
 
test1=test2-4
 
'''
 
'''
 +
 +
==Multiplizieren==
 
       |      expr '*' expr  { $$.value = $1.value * $3.value }
 
       |      expr '*' expr  { $$.value = $1.value * $3.value }
  
Zeile 25: Zeile 29:
 
test1=test2*4
 
test1=test2*4
 
'''
 
'''
 +
 +
==Dividieren==
 
       |      expr '/' expr  { $$.value = $1.value / $3.value }
 
       |      expr '/' expr  { $$.value = $1.value / $3.value }
  
Zeile 33: Zeile 39:
 
test1=test2/4
 
test1=test2/4
 
'''
 
'''
 +
 +
==Potenzieren==
 
       |      expr '^' expr  { $$.value = pow($1.value, $3.value) }
 
       |      expr '^' expr  { $$.value = pow($1.value, $3.value) }
  
Zeile 41: Zeile 49:
 
test1=test2^4
 
test1=test2^4
 
'''    
 
'''    
 +
 +
==Benutzung von Klammern==
 
       |      '(' expr ')'    { $$.value = $2.value }
 
       |      '(' expr ')'    { $$.value = $2.value }
  
Einklammern von Rechnungen.
+
Einklammern von Rechnungen. Wird benötigt, da ASSCalc kein Punkt vor Strich Rechnung kennt sondern von links nach rechts rechnet!
  
 
'''<u>Beispiel:</u>
 
'''<u>Beispiel:</u>
Zeile 49: Zeile 59:
 
test1=test2-(test3*5)
 
test1=test2-(test3*5)
 
'''
 
'''
 +
 +
==Sinus==
 
       |      SIN '(' expr ')'    { $$.value = sin($3.value); }
 
       |      SIN '(' expr ')'    { $$.value = sin($3.value); }
  
Zeile 57: Zeile 69:
 
test1=SIN(Winkel)
 
test1=SIN(Winkel)
 
'''
 
'''
 +
 +
==COSinus==
 
       |      COS '(' expr ')'    { $$.value = cos($3.value); }
 
       |      COS '(' expr ')'    { $$.value = cos($3.value); }
  
Zeile 65: Zeile 79:
 
test1=COS(Winkel)
 
test1=COS(Winkel)
 
'''
 
'''
 +
 +
==Intround==
 
       |      INTROUND '(' expr ',' expr ')'    { $$.value = (double)(((int)($3.value+0.5)) % ((int)($5.value+0.5))); }
 
       |      INTROUND '(' expr ',' expr ')'    { $$.value = (double)(((int)($3.value+0.5)) % ((int)($5.value+0.5))); }
  
Bitte updaten.
+
'''WICHTIG:''' Die zweite variable/expression darf '''niemals''' kleiner als 0.5 werden, sonst stürzt ASSCalc ab!! MAX(var,0.5) sollte hier also zwingend eingesetzt werden!!
 +
 
 +
weitere erklärung folgt, bekomme es durch testen nicht raus, werde beim hersteller nachfragen ^^
  
 +
==Trunc==
 
       |      TRUNC '(' expr ')'    { $$.value = floor($3.value); }
 
       |      TRUNC '(' expr ')'    { $$.value = floor($3.value); }
  
Rundet eine Variable oder Zahl auf oder ab, je nachdem ob sie größer oder kleiner als 0.5 ist.
+
Rundet eine Variable oder Zahl IMMER '''AB'''. Man kann mit dieser Funktion auch Fließkommastellen realisieren, welche Calc bei der Standardausgabe TVAL OF einfach abschneidet (so wie TRUNC ^^). Bei Berechnungen werden diese aber weiterhin berücksichtig, weswegen eine TRUNC Funktion manchmal sehr sinnvoll sein kann, wenn man im Berechnungsprozess eine Ganzzahl braucht. Hierfür solltet ihr euch mit dem Rundungssystem von ASSCalc auskennen => TVAL OF und POS OF in Commands anschauen!
  
'''<u>Beispiel:</u>
+
===Beispiel:===
  
 
test1=TRUNC(33.44) => 33
 
test1=TRUNC(33.44) => 33
 +
 +
test1=TRUNC(1.9999) => 1
 +
 +
 +
===Beispiel für Kommaausgabe mit POS OF:===
 +
 +
 +
test=1.123456                     
 +
 +
''=>        Setzt die Variable''
 +
 +
 +
ganzzahl=TRUNC(test)             
 +
 +
''=>        Schneidet die Kommastellen ab      => 1''
 +
 +
 +
rest=test-ganzzahl               
 +
 +
''=>        speichert die Kommastellen ab      => 0.123456''
 +
 +
 +
kommastellen=10000               
 +
 +
''=>        Gibt bei der POS OF Lösung die Anzahl der Kommastellen an''
 +
 +
 +
pos of ganzzahl                   
 +
 +
''=>        Gibt die Ganzzahl aus              => 1''
 +
 +
 +
"."                               
 +
 +
''=>        Gibt den Punkt aus                  => .''
 +
 +
 +
pos of rest*kommastellen         
 +
 +
''=>        Gibt die Kommastellen aus, die Anzahl definiert sich durch die Variable kommmastellen (10er,100er,1000er Stelle usw.)''
 +
 +
''=>        POS OF gibt die Zahl aus '''ohne ab oder aufzurunden!!!'''''
 +
 +
''=>        1.12345''
 +
 +
 +
===Beispiel für Kommaausgabe mit TVAL OF:===
 +
 +
 +
test=1.123456                     
 +
 +
''=>        Setzt die Variable''
 +
 +
 +
ganzzahl=TRUNC(test)             
 +
 +
''=>        Schneidet die Kommastellen ab      => 1''
 +
 +
 +
rest=test-ganzzahl               
 +
 +
''=>        speichert die Kommastellen ab      => 0.123456''
 +
 +
 +
pos of ganzzahl                   
 +
 +
''=>        Gibt die Ganzzahl aus              => 1''
 +
 +
 +
"."                               
 +
 +
''=>        Gibt den Punkt aus                  => .''
 +
 +
 +
rest                             
 +
 +
''=>        Gibt die Kommastellen aus. Als Standard wird hierbei die 1000er Variante genutzt, sprich 3 Kommastellen. ''
 +
 +
''=>        Will man mehr oder weniger Stellen ausgeben, muss man die Zahl durch 10/100/1000 etc. multiplizieren oder dividieren''
 +
 +
''=>        TVAL OF gibt die Zahl aus '''und rundet auf oder ab, je nachdem ob die nachfolgende Zahl >= 5 oder <= 5 ist!!!'''''
 +
 +
''=>        1.123''
 +
 +
 +
rest*10                           
 +
 +
''=>        1.1235''
 +
 +
 +
tval of rest*100                 
 +
 +
''=>        1.12346''
 +
 +
 +
rest*1000                         
 +
 +
''=>        1.123456''
 +
 +
 
'''
 
'''
 +
 +
==Sign==
 
       |      SIGN '(' expr ')'    { $$.value = $3.value/(abs($3.value)+0.0001); }
 
       |      SIGN '(' expr ')'    { $$.value = $3.value/(abs($3.value)+0.0001); }
  
Bitte updaten.
+
Gibt das Vorzeichen einer Variable zurück: 1,0,-1
  
 +
Bei dieser Expression gibt es ein paar Besonderheiten. Grundlegen sollte hier TRUNC() verwendet werden, auch wenn dies keine Rundung bietet, da alle Zahlen unter 1 oder kleiner als -1 gegenläufig sind. Das heißt SIGN gibt bei 0.12 statt 0 oder 1000 mal 1200000 zurück! Kommazahlen sind eh ein Thema für sich bei dieser Funktion. Betrachtet man die Ausgabe von 18.456, würde man 1456 heraus bekommen im Output. Über POS OF ausgegeben, würde dies natürlich 1 ergeben (oder -1 je nach Vorzeichen). Da man aber sehr warscheinlich weiter mit dem Vorzeichen arbeiten will und dies zum multiplizieren verwendet, würde man die Zahl mit den Kommastellen multiplizieren, was teilweise gewollt sein kann, größtenteils aber nicht.
 +
 +
Man muss sich also überlegen, ob man vor der Funktion TRUNC() benutzt oder danach. Macht bei manchen Berechnungen viel aus. Auch das
 +
 +
 +
'''<u>Beispiel:</u>
 +
 +
 +
SIGN(-120) -> -999
 +
 +
''Info: hier sieht man, das eine vorher mit TRUNC() versehen Funktion keinen Sinn ergibt, genau so wie danach, weil es 0 ergeben würde. Der Trick ist einfach immer eine Kommazahl wie unten die -18.2429 zu benutzen, da diese einen Rest bietet und so die Zahl mindestens -1 groß sein wird beim Output. Danach kann man auf diese wieder TRUNC() anwenden.''
 +
 +
 +
SIGN(0) -> 0
 +
 +
 +
SIGN(120) -> 1000
 +
 +
 +
SIGN(0.5429) -> 5429000
 +
 +
 +
SIGN(-18.2429) -> -1012
 +
 +
==Min==
 
       |      MIN '(' expr ',' expr ')'    { if( $3.value<$5.value )$$.value = $3.value; else $$.value = $5.value; }
 
       |      MIN '(' expr ',' expr ')'    { if( $3.value<$5.value )$$.value = $3.value; else $$.value = $5.value; }
 
Macht eine Grenzenabfrage, welche eine Variable überprüft und wenn diese einen Wert '''überschreitet''', wird der Wert auf die zweite Variable gesetzt, sprich die Variable ist immer '''MAXIMAL''' so groß wie der angegebene Wert.
 
Macht eine Grenzenabfrage, welche eine Variable überprüft und wenn diese einen Wert '''überschreitet''', wird der Wert auf die zweite Variable gesetzt, sprich die Variable ist immer '''MAXIMAL''' so groß wie der angegebene Wert.
  
 +
==Max==
 
       |      MAX '(' expr ',' expr ')'    { if( $3.value>$5.value )$$.value = $3.value; else $$.value = $5.value; }
 
       |      MAX '(' expr ',' expr ')'    { if( $3.value>$5.value )$$.value = $3.value; else $$.value = $5.value; }
 
Macht eine Grenzenabfrage, welche eine Variable Überprüft und wenn diese einen Wert '''unterschreitet''', wird der Wert auf die zweite Angabe gesetzt, sprich die Variable ist immer '''MINIMAL''' so groß wie der angegebene Wert.
 
Macht eine Grenzenabfrage, welche eine Variable Überprüft und wenn diese einen Wert '''unterschreitet''', wird der Wert auf die zweite Angabe gesetzt, sprich die Variable ist immer '''MINIMAL''' so groß wie der angegebene Wert.
Zeile 89: Zeile 236:
 
'''<u>Beispiel:</u>
 
'''<u>Beispiel:</u>
  
      Alphalevel 0 und 255 im wechsel:
+
Alphalevel 0 und 255 im wechsel:
  
        in p1loop:  hex of MAX(onoff,0)
 
                    onoff=onoff*(-1)
 
  
        in p1h:     onoff=255
+
''in p1loop:'' 
 +
 
 +
hex of MAX(onoff,0)
 +
 
 +
onoff=onoff*(-1)
 +
 
 +
 
 +
''in p1h:
 +
 
 +
onoff=255
 
'''
 
'''
 +
 +
==Switch==
 
       |      SWITCH '(' expr ',' expr ',' expr ')'    { if( $3.value<0.5 )$$.value = $5.value; else $$.value = $7.value; }
 
       |      SWITCH '(' expr ',' expr ',' expr ')'    { if( $3.value<0.5 )$$.value = $5.value; else $$.value = $7.value; }
  
Zeile 109: Zeile 265:
 
''Info: setzt die Variable wab beim erreichen des Wertes 4 auf 0 zurück, da 4/7 = 0,571''
 
''Info: setzt die Variable wab beim erreichen des Wertes 4 auf 0 zurück, da 4/7 = 0,571''
  
 +
==Pixbuff==
 
       |      PIXBUF '(' expr ',' expr ')'    { $$.value = get_pixbuf( $3.value, $5.value ); }
 
       |      PIXBUF '(' expr ',' expr ')'    { $$.value = get_pixbuf( $3.value, $5.value ); }
  
 
Überprüft an einer Position X,Y ob ein von ASSCalc gerenderter Silbenpixel schwarz oder weiß ist und gibt einen bolschen Wert zurück, welcher in LOWKILL als Pixelidentifiere genutzt werden kann.
 
Überprüft an einer Position X,Y ob ein von ASSCalc gerenderter Silbenpixel schwarz oder weiß ist und gibt einen bolschen Wert zurück, welcher in LOWKILL als Pixelidentifiere genutzt werden kann.
 +
 
Nochmal zur Info: ''loopvar und loopvar2 sind feste AssCalc Variablen, welche automatisch Pro Loop erhöht werden. Reset auf 0 pro P-Layer-Durchlauf''
 
Nochmal zur Info: ''loopvar und loopvar2 sind feste AssCalc Variablen, welche automatisch Pro Loop erhöht werden. Reset auf 0 pro P-Layer-Durchlauf''
 +
 
'''<u>Beispiel:</u>
 
'''<u>Beispiel:</u>
  
 
LOWKILL( pixbuf(loopvar,loopvar2), 0.5 ) => entscheidet ob Code ausgeführt wird für einen Pixel oder nicht. Somit kann man einen Buchstaben leicht als Pixel nachbilden.
 
LOWKILL( pixbuf(loopvar,loopvar2), 0.5 ) => entscheidet ob Code ausgeführt wird für einen Pixel oder nicht. Somit kann man einen Buchstaben leicht als Pixel nachbilden.
 
'''
 
'''
 +
 +
 
Hier noch ein Beitrag von OJ:
 
Hier noch ein Beitrag von OJ:
 
   
 
   
 
  ''UPDATE:  
 
  ''UPDATE:  
 +
 
hpsx=TRUNC(curx-nsizthisone*0.5)
 
hpsx=TRUNC(curx-nsizthisone*0.5)
 +
 
Position X Seite Links => anfang Silbe X
 
Position X Seite Links => anfang Silbe X
 
 
 +
 
hpsy=TRUNC(cury-nysizthisone*0.5)
 
hpsy=TRUNC(cury-nysizthisone*0.5)
 +
 
Position Y Oben => Anfang Silbe Y
 
Position Y Oben => Anfang Silbe Y
 +
 
 
 
hpex=TRUNC(hpsx+2+nsizthisone)
 
hpex=TRUNC(hpsx+2+nsizthisone)
 +
 
Position X Seite Rechts => Ende Silbe X
 
Position X Seite Rechts => Ende Silbe X
 +
 
 
 
hpey=TRUNC(hpsy+2+nysizthisone)
 
hpey=TRUNC(hpsy+2+nysizthisone)
 +
 
Position Y Unten => Ende Silbe
 
Position Y Unten => Ende Silbe
 +
 
 
 
loopfile2 "p1 in.txt" ((hpex-hpsx),(hpey-hpsy))
 
loopfile2 "p1 in.txt" ((hpex-hpsx),(hpey-hpsy))
=> loopfile2((Ende X - Anfang X),(Ende Y - Anfang Y))  
+
 
 +
=> loopfile2((Ende X - Anfang X),(Ende Y - Anfang Y))
 +
 
=> Matrix aus (Silbenbreite,Silbenhöhe)
 
=> Matrix aus (Silbenbreite,Silbenhöhe)
 +
 
=> Erster X Achsendurchlauf 0 => loopvar gibt diesen Wert zurück und Zählt automatisch +1 wenn Y Reihe bei erreichen von Ende Y auf 0 resetet wird
 
=> Erster X Achsendurchlauf 0 => loopvar gibt diesen Wert zurück und Zählt automatisch +1 wenn Y Reihe bei erreichen von Ende Y auf 0 resetet wird
 +
 
=> Erster Y Achsendurchlauf Yposloop 0 -> Ende Y => loopvar2 gibt diesen Wert zurück und Zählt automatisch +1 pro Loopdurchlauf  
 
=> Erster Y Achsendurchlauf Yposloop 0 -> Ende Y => loopvar2 gibt diesen Wert zurück und Zählt automatisch +1 pro Loopdurchlauf  
 +
 
  und resetet sich automatisch bei erreichen von Ende Y
 
  und resetet sich automatisch bei erreichen von Ende Y
 +
 
 
Jeder Pixel des Rechtecks, welches um die Silbe gezogen wurde wird nun auf seinen TRUE Wert überprüft,  
+
Jeder Pixel des Rechtecks, welches um die Silbe gezogen wurde wird nun auf seinen TRUE Wert überprüft, dh. asscalc generiert den Buchstaben konstant neu und überprüf ob er gefüllt ist oder nicht.
dh. asscalc generiert den Buchstaben konstant neu und überprüf ob er gefüllt ist oder nicht.
+
 
 
 +
 
Die wird per Pixbuff überprüft:
 
Die wird per Pixbuff überprüft:
 +
 
pixbuf(loopvar,loopvar2)
 
pixbuf(loopvar,loopvar2)
 +
 
=> Aktuelle Position in Achse X und Aktuelle Position in Achse Y ergibt den Standort im Rechteck
 
=> Aktuelle Position in Achse X und Aktuelle Position in Achse Y ergibt den Standort im Rechteck
 +
 
=> Ergibt dieser den Wert TRUE, wird von asscalc die Zahl 1 zurück gegeben
 
=> Ergibt dieser den Wert TRUE, wird von asscalc die Zahl 1 zurück gegeben
 +
 
=> Bei FALSE wird der Wert 0 zurück gegeben
 
=> Bei FALSE wird der Wert 0 zurück gegeben
 +
 
=> Dies wird mit dem Lowkill überprüft LOWKILL( pixbuf(loopvar,loopvar2), 0.5 )  
 
=> Dies wird mit dem Lowkill überprüft LOWKILL( pixbuf(loopvar,loopvar2), 0.5 )  
 +
 
=> LOWKILL( 1 >= 0.5 ) ergibt "NO", wird also ausgeführt, dh. ein Pixel wird generiert
 
=> LOWKILL( 1 >= 0.5 ) ergibt "NO", wird also ausgeführt, dh. ein Pixel wird generiert
 +
 
=> LOWKILL( 0 >= 0.5 ) ergibt "YES", wird also NICHT ausgeführt, dh. kein Pixel wird generiert  
 
=> LOWKILL( 0 >= 0.5 ) ergibt "YES", wird also NICHT ausgeführt, dh. kein Pixel wird generiert  
 +
 
 
 
In der Datei selbst muss noch die aktuelle Position gebildet werden
 
In der Datei selbst muss noch die aktuelle Position gebildet werden
 +
 
=> thisx=hpsx+loopvar+1 die +1 ist eine Korrektur da X nie passgenau sitzt
 
=> thisx=hpsx+loopvar+1 die +1 ist eine Korrektur da X nie passgenau sitzt
 +
 
=> thisy=hpsy+loopvar2+18 die +18 ist eine Korrektur da Y nie passgenau sitzt''
 
=> thisy=hpsy+loopvar2+18 die +18 ist eine Korrektur da Y nie passgenau sitzt''
  
 
+
 
 +
==UMinus==  
 
       |      '-' expr  %prec UMINUS { $$.value = -$2.value }
 
       |      '-' expr  %prec UMINUS { $$.value = -$2.value }
  
Zeile 168: Zeile 355:
 
var=-1
 
var=-1
 
'''
 
'''
 +
 +
==Variablen Erzeugen/Ausgeben==
 
       |      IDENTIFIER { $$.value = get_identifier( $1 ); }
 
       |      IDENTIFIER { $$.value = get_identifier( $1 ); }
  
Zeile 176: Zeile 365:
 
var
 
var
 
'''
 
'''
 +
 +
==Array Erzeugen/Ausgeben==
 
       |      IDENTIFIER '[' expr ']' { $$.value = get_identifier_arr( $1, $3.value ); }
 
       |      IDENTIFIER '[' expr ']' { $$.value = get_identifier_arr( $1, $3.value ); }
 
Array ausgeben in Calc.
 
Array ausgeben in Calc.
Zeile 185: Zeile 376:
 
array[1]
 
array[1]
 
'''
 
'''
 +
 +
==Findindex==
 
       |      FINDINDEX '(' IDENTIFIER ',' expr ')' { $$.value = find_index_arr( $3, $5.value ); }
 
       |      FINDINDEX '(' IDENTIFIER ',' expr ')' { $$.value = find_index_arr( $3, $5.value ); }
  
Update bitte.
 
  
 +
Gibt die Position des ersten Werts im Array, der größer ist als der Wert der angegeben wurde. Auch hier gibt es wieder eine Besonderheit, und zwar wird die Arrayposition um minus 1 zurück gegeben. Somit ist die Funktion an zwei Bedingungen geknüpft. Die aktuelle Array Position, welche zurück gegeben wird muss kleiner sein als der Angegebene Wert, die nachfolgende Position muss aber größer sein als der angegebene Wert, sonst wird die nächste Position überprüft. Eine Anwendung wäre eine Liste mit Timings, welche über tstart / tend abgefragt wird, um heraus zu finden, welches Timing in den Bereich der aktuellen Silbe fällt oder umgekehrt.
 +
 +
In dieser Funktion muss der Arrayname '''ohne [ ]''' angegeben werden. Sprich ''arrayname[x]'' ergibt in der Expression ''arrayname''.
 +
 +
''FINDINDEX ( arrayname_ohne_[] , Wert_mit_dem_geprüft_wird )''
 +
 +
 +
'''<u>Beispiel:</u>
 +
 +
arrayt[0] = 22
 +
 +
arrayt[1] = 33
 +
 +
arrayt[2] = 44
 +
 +
arrayt[3] = 55
 +
 +
check=45
 +
 +
 +
FINDINDEX ( arrayt , check )
 +
 +
 +
out.ass: 2000
 +
 +
''=> Position 2 wird zurück gegeben.''
 +
 +
 +
==Texfindbool==
 
       |      TEXTFINDBOOL IDENTIFIER { $$.value = textfind_identifier( $2.name ); }
 
       |      TEXTFINDBOOL IDENTIFIER { $$.value = textfind_identifier( $2.name ); }
  
Sucht in einer Line nach einem TEXT und gibt TRUE / 1 zurück, wenn er in dieser vorkommt. Siehe auch asscalc Commands zu diesem Thema
+
Sucht in einer Line nach einem TEXT und gibt TRUE / 1 zurück, wenn er in dieser vorkommt. So können TEXTFIND Events z.B. als Trigger im loopfile genutzt werden (loopfile "bla.txt" 1*textcheck) oder in einem LOWKILL(), da 0 oder 1 zurüc gegeben wird. Siehe auch [[Asscalc Commands]] zu diesem Thema.
 +
 
 +
 
 +
'''<u>Beispiel:</u>
 +
 
 +
textfindbool Hallo
  
 +
==Zahl Ausgeben==
 
       |      NUMBER
 
       |      NUMBER
  

Aktuelle Version vom 8. Juni 2013, 09:45 Uhr

Expressions sind reine Mathefunktionen zum berechnen verschiedenster Dinge. Es sind die absoluten Basics an Mathe, aber die meißten Funktionen wie ein Bezier oder ähnliches lassen sich auch leicht damit beschreiben. Grundsätzlich beachtet Calc keine Punkt vor Strich Rechnung, sondern berechnet alles schön der Reihe nach. Um dies zu kontrollieren sollte man viel auf die () und Notepad C++ zurück greifen mit der Scriptvieweinstellung für Lua. Alle Mathefunktionen können in Variablen abgelegt werden oder direkt in anderen Expressions oder Commands wieder benutzt und verschachtelt werden. (Achtung Commands können nicht ineinander verschachtelt werden, dies gilt nur für Expressions!).

Addieren

      |       expr '+' expr { $$.value = $1.value + $3.value }

Addition von zwei Variablen oder Zahlen.

Beispiel:

test1=test2+4

Subtrahieren

      |       expr '-' expr   { $$.value = $1.value - $3.value }

Subtraktion von zwei Variablen oder Zahlen.

Beispiel:

test1=test2-4

Multiplizieren

      |       expr '*' expr   { $$.value = $1.value * $3.value }

Multiplikation von zwei Variablen oder Zahlen.

Beispiel:

test1=test2*4

Dividieren

      |       expr '/' expr   { $$.value = $1.value / $3.value }

Division von zwei Variablen oder Zahlen.

Beispiel:

test1=test2/4

Potenzieren

      |       expr '^' expr   { $$.value = pow($1.value, $3.value) }

Potenzieren mit zwei Variablen oder Zahlen. Um eine Wurzel 2. Grades zu ziehen schreibt man es als Potenz X^1/2 ; für die dritte Wurzel X^1/3 usw.

Beispiel:

test1=test2^4

Benutzung von Klammern

      |       '(' expr ')'    { $$.value = $2.value }

Einklammern von Rechnungen. Wird benötigt, da ASSCalc kein Punkt vor Strich Rechnung kennt sondern von links nach rechts rechnet!

Beispiel:

test1=test2-(test3*5)

Sinus

      |       SIN '(' expr ')'    { $$.value = sin($3.value); }

Gibt den Sinus einer Variablen oder Zahl zurück.

Beispiel:

test1=SIN(Winkel)

COSinus

      |       COS '(' expr ')'    { $$.value = cos($3.value); }

Gibt den Cosinus einer Variablen oder Zahl zurück.

Beispiel:

test1=COS(Winkel)

Intround

      |       INTROUND '(' expr ',' expr ')'    { $$.value = (double)(((int)($3.value+0.5)) % ((int)($5.value+0.5))); }

WICHTIG: Die zweite variable/expression darf niemals kleiner als 0.5 werden, sonst stürzt ASSCalc ab!! MAX(var,0.5) sollte hier also zwingend eingesetzt werden!!

weitere erklärung folgt, bekomme es durch testen nicht raus, werde beim hersteller nachfragen ^^

Trunc

      |       TRUNC '(' expr ')'    { $$.value = floor($3.value); }

Rundet eine Variable oder Zahl IMMER AB. Man kann mit dieser Funktion auch Fließkommastellen realisieren, welche Calc bei der Standardausgabe TVAL OF einfach abschneidet (so wie TRUNC ^^). Bei Berechnungen werden diese aber weiterhin berücksichtig, weswegen eine TRUNC Funktion manchmal sehr sinnvoll sein kann, wenn man im Berechnungsprozess eine Ganzzahl braucht. Hierfür solltet ihr euch mit dem Rundungssystem von ASSCalc auskennen => TVAL OF und POS OF in Commands anschauen!

Beispiel:

test1=TRUNC(33.44) => 33

test1=TRUNC(1.9999) => 1


Beispiel für Kommaausgabe mit POS OF:

test=1.123456

=> Setzt die Variable


ganzzahl=TRUNC(test)

=> Schneidet die Kommastellen ab => 1


rest=test-ganzzahl

=> speichert die Kommastellen ab => 0.123456


kommastellen=10000

=> Gibt bei der POS OF Lösung die Anzahl der Kommastellen an


pos of ganzzahl

=> Gibt die Ganzzahl aus => 1


"."

=> Gibt den Punkt aus => .


pos of rest*kommastellen

=> Gibt die Kommastellen aus, die Anzahl definiert sich durch die Variable kommmastellen (10er,100er,1000er Stelle usw.)

=> POS OF gibt die Zahl aus ohne ab oder aufzurunden!!!

=> 1.12345


Beispiel für Kommaausgabe mit TVAL OF:

test=1.123456

=> Setzt die Variable


ganzzahl=TRUNC(test)

=> Schneidet die Kommastellen ab => 1


rest=test-ganzzahl

=> speichert die Kommastellen ab => 0.123456


pos of ganzzahl

=> Gibt die Ganzzahl aus => 1


"."

=> Gibt den Punkt aus => .


rest

=> Gibt die Kommastellen aus. Als Standard wird hierbei die 1000er Variante genutzt, sprich 3 Kommastellen.

=> Will man mehr oder weniger Stellen ausgeben, muss man die Zahl durch 10/100/1000 etc. multiplizieren oder dividieren

=> TVAL OF gibt die Zahl aus und rundet auf oder ab, je nachdem ob die nachfolgende Zahl >= 5 oder <= 5 ist!!!

=> 1.123


rest*10

=> 1.1235


tval of rest*100

=> 1.12346


rest*1000

=> 1.123456


Sign

      |       SIGN '(' expr ')'    { $$.value = $3.value/(abs($3.value)+0.0001); }

Gibt das Vorzeichen einer Variable zurück: 1,0,-1

Bei dieser Expression gibt es ein paar Besonderheiten. Grundlegen sollte hier TRUNC() verwendet werden, auch wenn dies keine Rundung bietet, da alle Zahlen unter 1 oder kleiner als -1 gegenläufig sind. Das heißt SIGN gibt bei 0.12 statt 0 oder 1000 mal 1200000 zurück! Kommazahlen sind eh ein Thema für sich bei dieser Funktion. Betrachtet man die Ausgabe von 18.456, würde man 1456 heraus bekommen im Output. Über POS OF ausgegeben, würde dies natürlich 1 ergeben (oder -1 je nach Vorzeichen). Da man aber sehr warscheinlich weiter mit dem Vorzeichen arbeiten will und dies zum multiplizieren verwendet, würde man die Zahl mit den Kommastellen multiplizieren, was teilweise gewollt sein kann, größtenteils aber nicht.

Man muss sich also überlegen, ob man vor der Funktion TRUNC() benutzt oder danach. Macht bei manchen Berechnungen viel aus. Auch das


Beispiel:


SIGN(-120) -> -999

Info: hier sieht man, das eine vorher mit TRUNC() versehen Funktion keinen Sinn ergibt, genau so wie danach, weil es 0 ergeben würde. Der Trick ist einfach immer eine Kommazahl wie unten die -18.2429 zu benutzen, da diese einen Rest bietet und so die Zahl mindestens -1 groß sein wird beim Output. Danach kann man auf diese wieder TRUNC() anwenden.


SIGN(0) -> 0


SIGN(120) -> 1000


SIGN(0.5429) -> 5429000


SIGN(-18.2429) -> -1012

Min

      |       MIN '(' expr ',' expr ')'    { if( $3.value<$5.value )$$.value = $3.value; else $$.value = $5.value; }

Macht eine Grenzenabfrage, welche eine Variable überprüft und wenn diese einen Wert überschreitet, wird der Wert auf die zweite Variable gesetzt, sprich die Variable ist immer MAXIMAL so groß wie der angegebene Wert.

Max

      |       MAX '(' expr ',' expr ')'    { if( $3.value>$5.value )$$.value = $3.value; else $$.value = $5.value; }

Macht eine Grenzenabfrage, welche eine Variable Überprüft und wenn diese einen Wert unterschreitet, wird der Wert auf die zweite Angabe gesetzt, sprich die Variable ist immer MINIMAL so groß wie der angegebene Wert.

Beispiel:

Alphalevel 0 und 255 im wechsel:


in p1loop:

hex of MAX(onoff,0)

onoff=onoff*(-1)


in p1h:

onoff=255

Switch

      |       SWITCH '(' expr ',' expr ',' expr ')'    { if( $3.value<0.5 )$$.value = $5.value; else $$.value = $7.value; }

Zu allererst, es benötigt 'immer eine zusätzlich Leerzeile unter der Funktion. Gilt allgemein bei Expression- und Command-Fehlern.

Wenn die erste Variable < 0.5 ist, dann ist der zurückgegebene Wert die zweite Variable, ansonsten die dritte Variable.

Beispiel:

wab=wab+1 wab=SWITCH(wab/7,wab,0)

Info: setzt die Variable wab beim erreichen des Wertes 4 auf 0 zurück, da 4/7 = 0,571

Pixbuff

      |       PIXBUF '(' expr ',' expr ')'    { $$.value = get_pixbuf( $3.value, $5.value ); }

Überprüft an einer Position X,Y ob ein von ASSCalc gerenderter Silbenpixel schwarz oder weiß ist und gibt einen bolschen Wert zurück, welcher in LOWKILL als Pixelidentifiere genutzt werden kann.

Nochmal zur Info: loopvar und loopvar2 sind feste AssCalc Variablen, welche automatisch Pro Loop erhöht werden. Reset auf 0 pro P-Layer-Durchlauf

Beispiel:

LOWKILL( pixbuf(loopvar,loopvar2), 0.5 ) => entscheidet ob Code ausgeführt wird für einen Pixel oder nicht. Somit kann man einen Buchstaben leicht als Pixel nachbilden.


Hier noch ein Beitrag von OJ:

UPDATE:

hpsx=TRUNC(curx-nsizthisone*0.5)

Position X Seite Links => anfang Silbe X


hpsy=TRUNC(cury-nysizthisone*0.5)

Position Y Oben => Anfang Silbe Y


hpex=TRUNC(hpsx+2+nsizthisone)

Position X Seite Rechts => Ende Silbe X


hpey=TRUNC(hpsy+2+nysizthisone)

Position Y Unten => Ende Silbe


loopfile2 "p1 in.txt" ((hpex-hpsx),(hpey-hpsy))

=> loopfile2((Ende X - Anfang X),(Ende Y - Anfang Y))

=> Matrix aus (Silbenbreite,Silbenhöhe)

=> Erster X Achsendurchlauf 0 => loopvar gibt diesen Wert zurück und Zählt automatisch +1 wenn Y Reihe bei erreichen von Ende Y auf 0 resetet wird

=> Erster Y Achsendurchlauf Yposloop 0 -> Ende Y => loopvar2 gibt diesen Wert zurück und Zählt automatisch +1 pro Loopdurchlauf

und resetet sich automatisch bei erreichen von Ende Y


Jeder Pixel des Rechtecks, welches um die Silbe gezogen wurde wird nun auf seinen TRUE Wert überprüft, dh. asscalc generiert den Buchstaben konstant neu und überprüf ob er gefüllt ist oder nicht.


Die wird per Pixbuff überprüft:

pixbuf(loopvar,loopvar2)

=> Aktuelle Position in Achse X und Aktuelle Position in Achse Y ergibt den Standort im Rechteck

=> Ergibt dieser den Wert TRUE, wird von asscalc die Zahl 1 zurück gegeben

=> Bei FALSE wird der Wert 0 zurück gegeben

=> Dies wird mit dem Lowkill überprüft LOWKILL( pixbuf(loopvar,loopvar2), 0.5 )

=> LOWKILL( 1 >= 0.5 ) ergibt "NO", wird also ausgeführt, dh. ein Pixel wird generiert

=> LOWKILL( 0 >= 0.5 ) ergibt "YES", wird also NICHT ausgeführt, dh. kein Pixel wird generiert


In der Datei selbst muss noch die aktuelle Position gebildet werden

=> thisx=hpsx+loopvar+1 die +1 ist eine Korrektur da X nie passgenau sitzt

=> thisy=hpsy+loopvar2+18 die +18 ist eine Korrektur da Y nie passgenau sitzt


UMinus

      |       '-' expr  %prec UMINUS { $$.value = -$2.value }

Setzt eine Variable auf Minus.

Beispiel:

var=(-var)

var=var*(-1)

var=-1

Variablen Erzeugen/Ausgeben

      |       IDENTIFIER { $$.value = get_identifier( $1 ); }

Variable ausgeben in Calc.

Beispiel:

var

Array Erzeugen/Ausgeben

      |       IDENTIFIER '[' expr ']' { $$.value = get_identifier_arr( $1, $3.value ); }

Array ausgeben in Calc.

Beispiel:

array[bla]

array[1]

Findindex

      |       FINDINDEX '(' IDENTIFIER ',' expr ')' { $$.value = find_index_arr( $3, $5.value ); }


Gibt die Position des ersten Werts im Array, der größer ist als der Wert der angegeben wurde. Auch hier gibt es wieder eine Besonderheit, und zwar wird die Arrayposition um minus 1 zurück gegeben. Somit ist die Funktion an zwei Bedingungen geknüpft. Die aktuelle Array Position, welche zurück gegeben wird muss kleiner sein als der Angegebene Wert, die nachfolgende Position muss aber größer sein als der angegebene Wert, sonst wird die nächste Position überprüft. Eine Anwendung wäre eine Liste mit Timings, welche über tstart / tend abgefragt wird, um heraus zu finden, welches Timing in den Bereich der aktuellen Silbe fällt oder umgekehrt.

In dieser Funktion muss der Arrayname ohne [ ] angegeben werden. Sprich arrayname[x] ergibt in der Expression arrayname.

FINDINDEX ( arrayname_ohne_[] , Wert_mit_dem_geprüft_wird )


Beispiel:

arrayt[0] = 22

arrayt[1] = 33

arrayt[2] = 44

arrayt[3] = 55

check=45


FINDINDEX ( arrayt , check )


out.ass: 2000

=> Position 2 wird zurück gegeben.


Texfindbool

      |       TEXTFINDBOOL IDENTIFIER { $$.value = textfind_identifier( $2.name ); }

Sucht in einer Line nach einem TEXT und gibt TRUE / 1 zurück, wenn er in dieser vorkommt. So können TEXTFIND Events z.B. als Trigger im loopfile genutzt werden (loopfile "bla.txt" 1*textcheck) oder in einem LOWKILL(), da 0 oder 1 zurüc gegeben wird. Siehe auch Asscalc Commands zu diesem Thema.


Beispiel:

textfindbool Hallo

Zahl Ausgeben

      |       NUMBER

Zahl ausgeben in Calc.


Beispiel:

1 234 0.3