Textobjectdaten an Javascriptfunktion übergeben und auswerten

FriedrichLaher shared this problem 5 months ago
Not a Problem

Comments (13)

photo
1

verfluch ist das hier sperrig


Wie kommt eine Javascriptfunktion an die Daten, insbesondere auch, der Eckpunktkoordinaten, eines Textes, wie ist der Parameter zu übergeben?


txt soll eine Referenz auf den Text sein, ang ein Winkel, und Ds ein Punkt

Der folgende Code ist ein noch erfoloserer Versuch meinen Dreher aus meinem letzten Posting zu veralgemeinern

{var a = ggbApplet , c = a.evalCommand , n = '\n'
   , q , r , S , C ,
;
function RoTate(txt, ang, Ds){

    q = Math.floor( 2*ang/Math.PI )
    r = ang - q*Math.PI  / 2
    S = Math.sin(r)
    C = Math.cos(r)

    if ( q & 1) { var h = S; S = C; C = h }
    c('\
        m = {{-'+S+',-'+C+'},{'+C+','+S+'}}\
        (1/2) \
        {{y(Corner('+txt+',4))-y(Corner('+txt+',1))},\
         {x(Corner('+txt+',2))-x(Corner('+txt+',1))}'
      +n+'\
      toDs = m(1);\
      xULC = x('+Ds+')+toDs(1); yULC = y('+Ds+')+toDs(2)'
      +n+'\
      Text1=\
      Text( RotateText('+txt+','+ang+'),\
            (xULC,yULC),true,true )'
    ) */
    a.setVisible(ang,0)
}
}(0)

photo
1

der */ muß weg , sorry für das Durcheinander

photo
1

Der vollständigkeit halber hier ohne JS.

photo
1

Danke Loco für den Hinweis.

Ich nehme an, Du hast auch meinen vorletzten meinen Beitrag dazu, wo ich auch ohne js auskomme, und die Zeichnungen dazu gesehen. Aber für eine bequeme Parameterangabe kann ich es mir nicht ohne js vorstellen.

photo
1

Hallo Friedrich,

ja habe ich und ich habe auch den anderen Beitrag mit der Bemaßung noch nicht vergessen. Bin jedoch so eingespannt, dass ich mich nicht lange genug damit befassen kann. Hatte jedoch leider vergessen, dass ich damals schon die Textrotation von rami verlinkt hatte.


Da ich mich noch nicht genauer mit der JS Mechanik in GGb auseinandersetzen konnte kann ich dir hier und dort auch noch nicht weiter helfen. Trotzdem hätte ich da eine paar Fragen:

  • So wie ich das sehe möchtest du einen Text durch die obige Funktion um einen übergebenen Winkel drehen? Wiso möchtest du dieses Drehen aus der Texteigenschaft auslagern? Oder möchtest du den Text nur initial einmal drehen und dann gedreht belassen?
  • Ist es nicht klüger mit Hilfe von JS jene Objekte zu erzeugen welche dann quasi "GGb-inteligent" sind? Sprich die sich ohne Zutun/ ohne weitere Skripte drehen und anpassen?
  • Können Parameter nicht einfach einmal global als GGb Variable definiert werden? Oder ist das unklug?


Eventuell noch eine Anregung:

Als JS-GGb Laie würde ich JS verwenden um eine Parameterliste, Eingabelisten und Ausgabelisten zu erzeugen. Danach würde ich JS nicht mehr benötigen. Die Parameterliste würde Abstände und ähnliches beinhalten. Die Eingabeliste würde Punktepaare, Texte und weiteres beinhalten. Und die Ausgabeliste würde dann meine Bandwurmdefinition beinhalten welche dann das/die gewünschte(n) Objekt(e) erzeugen würde. Im Prinzip ähnlich zu dem unübersichtlichen Beispiel von damals.

photo
1

In GGB-script ist das Ganze viel, viel (!) einfacher, da geometrische Objekt-Typen und entsprechende Commands existieren (in JS nicht). Den Vorschlag von -Loco- im letzten Abschnitt unterstütze ich.

Zudem ist der Import der Eckpunkte in JS recht sperrig.

photo
1

Hallo.

ich habe eine Frage/ Bitte an Rami, Friedrich, ... als JS Experten.

Ich habe ein kurzes GGB-Script, das in einer Schleife eine Liste aufbaut.

Leider läuft das recht langsam.

Ich würde das gerne durch ein Javascript ersetzen.

Leider sind meine JS Kenntnisse schlicht mangelhaft.

Kann mir da jemand helfen, ein paar Zeilen GGB Script in Javascript umzuwandeln?

Sorry, dass ich mich hier querfunke. Ich würde euch JS Experten gerne per Mail ansprechen, finde da aber keine Möglichkeit.

Danke, Jürgen

photo
1

Wozu per mail, sende doch einfach das ggb-file oder mindestens den ggb-script mit Erläuterungen zu den Input- Output Objekten. Oder eigentlich noch besser: eröffne einen neuen Thread mit diesen Informationen.

photo
1

Hi Rami.

Die GGB ist im Anhang.

Es geht um das Script von Schaltfläche3. Da werden zwei Listen L_A und L_{vA} aufgebaut.

Das GGB Script ist:

SetzeWert[A, SA]

SetzeWert[L_A, {SA}]

SetzeWert[L_{vA},{}]

SetzeWert[i,1]

Wiederhole[n, SetzeWert[A1,A], SetzeWert[vA1,vA],SetzeWert[A,A1+vA1*dt], SetzeWert[L_A,i+1,A], SetzeWert[L_{vA},i,vA1*dt], SetzeWert[i,i+1]]

SetzeWert[Iteration,0]

ZoomIn(1)

ZoomOut(1)

Das tut alles was es soll. Aber wenn das n groß wird, sehr sehr langsam.

Zur Erläuterung:

A ist der Bestand, der sich entwickelt. SA ist der Startwert für A.

vA die Änderung des Bestands.

A1 und vA1 sind Hilfsvariable zum Zwischenspeichern.

i ist meine interne Laufvariable in den Grenzen von 1 bis n.

Die jeweils berechneten Werte des Bestands A und der Änderung vA werden in Listen L_A und L_{vA} gespeichert.

Damit wird dann mit Folge-Befehlen weiter gearbeitet.

Iteration ist ein Schieberegler, den ich auf 0 setze und damit dann die Ausgabe der Objekte steuere.

Eigentlich ist das alles schlicht.

Aber ich kenne mich nicht mit Javascript und dessen Syntax aus.

Und Javascript in GeoGebra ist noch mal eine Sache für sich.

DANKE!

Jürgen

photo
1

Hallo Hans-Jürgen, ich finde kein Skript in Kumulator-190...

photo
1

Hallo Fritz.

Das Script gehört zur Schaltfläche 3.

Hier noch mal separat kopiert:


SetzeWert[A, SA]

SetzeWert[L_A, {SA}]

SetzeWert[L_{vA},{}]

SetzeWert[i,1]

Wiederhole[n, SetzeWert[A1,A], SetzeWert[vA1,vA],SetzeWert[A,A1+vA1*dt], SetzeWert[L_A,i+1,A], SetzeWert[L_{vA},i,vA1*dt], SetzeWert[i,i+1]]

SetzeWert[Iteration,0]

ZoomIn(1)

ZoomOut(1)

photo
1

Jetzt sollte das besser zu finden sein. Siehe Anlage.

photo
photo
1

Das Hauptproblem bei einer Umsetzung in JS ist der variable Ausdruck für die Berechnung der Bestandes-Aenderung.

Der basiert auf beliebigen Variablen im Algebrafenster (die im Zeitpunkt der Programmierung nicht bekannt sind) was kaum in JS abgebildet werden könnte. Man müsste GGB aus dem JS aufrufen (mit evalCommand), was die Performance kaum verbessern würde.

Eine Lösung bietet sich mit Ausführen() und InterationList() an. Damit können 2000 Rekursionsschritte mit kaum merklicher Berechnungszeit behandelt werden. Für bis zu 10000 Rekursionsschritte ist die Berechnungszeit noch erträglich. Ich denke das ist gut genug.

Der Befehl IterationList() wird innerhalb Ausführen(), und somit als String ausgeführt. Damit ist es möglich die ebenfalls als String vorliegende Formel/Ausdruck in diesen Sting zu integrieren.

IterationList() hat eine etwas gewöhnungsbedürftige Syntax.:

Iterationsliste( <Ausdruck>, <Variablen.....>, <{Startwerte.....}>, <AnzahlRekursionsSchritte> )

Der Ausdruck kann sich auf die Variablen-Namen beziehen, aber auch ausserhalb des Befehls liegende Variabeln ansprechen.

Verwirrend sind die Variabeln. Die beliebig viele Namen bezeichnen immer denselben Wert aber mit unterschiedlichem index relativ zum aktuellen Rekursions-Schritt. Deren Startwerte muss im 3. Parameter als Liste angegeben werden. Normalerweise wird für die Rekursion nur ein zurückliegender Wert benötigt.

Wenn sich parallel und allenfalls noch gegenseitig abhängig unterschiedliche Reihen ergeben (zB Bestand und Bestandesänderung) dann ist das zwar mit einem Trick möglich aber es wird extrem unübersichtlich. Deshalb habe ich mit IterationsListe() nur den Bestand berechnet und die Bestandesveränderung davon in einem zweiten Schritt abgeleitet.

.

Aus Faulheit, aber auch aus Gründen der Uebersichtlichkeit habe ich die Lösung (ohne irgendwelche Darstellung) realisiert. Der entscheidende Teil ist im Button enthalten. Die Objekte im Algebrafenster sind die Variabeln (schwarz) für die Scripts, die l1, l2 und l3 (grün) erzeugen. Hilfstexte in blau.

.

Für Rückfragen stehe natürlich zur Verfügung. Allerdings bin ich in den nächsten 2-3 Tagen nur teilweise im Forum anwesend.

© 2019 International GeoGebra Institute