Suchen Sie nach einer Möglichkeit, eine Form über ein Diagramm zu steuern und zu verschiebenIch suche nach einer Möglichkeit, eine „gezeichnete“ Form oder eine Reihe von Formen mithilfe eines JSL-Skripts zu steuern und über ein Diagramm (Graph Builder) zu verschieben, um Daten zu visualisieren. Stellen Sie es sich als eine Animation vor, bei der eine Reihe von Frames verwendet und dann durch diese gescrollt wird, um den Eindruck einer Bewegung zu erwecken.
Mit „gezeichneter“ Form meine ich so etwas wie:
Rechteck ()
Ich habe überlegt, den folgenden Ansatz zu wählen, bin mir aber nicht sicher, wie ich ihn genau umsetzen soll oder ob es einen besseren Ansatz gibt:
- Skripten/zeichnen Sie die gewünschten Formen und verknüpfen Sie sie mit einer Variablen (das könnte ein Zeilenwert sein) - wir nennen das einen Rahmen
- Konstruieren Sie mehrere Rahmen mit den erforderlichen Formen an verschiedenen Positionen, wobei jedem Rahmen eine eigene Variable zugewiesen wird.
Z.B
Frame 1 – Die Form befindet sich an der Position (X+0,Y) und ist mit der Variable (v = 1) verknüpft.
Frame 2 – Die Form befindet sich an der Position (X+1,Y) und ist mit der Variable (v = 2) verknüpft.
Frame 3 – Die Form befindet sich an der Position (X+2,Y) und ist mit der Variable (v = 3) verknüpft.
- Verwenden Sie den lokalen Datenfilter, um durch die ausgewählte Variable und damit die Position der gezeichneten Form(en) zu scrollen.
Ich würde hoffen, dass dies, wie in meinem Beispiel beschrieben, den Eindruck erweckt, dass sich die Form in Richtung X+ bewegt.
Wie bereits erwähnt, bin ich nicht sicher, ob dies funktionieren würde. Der Graph Builder-Bericht müsste irgendwie aktualisiert/aufgefrischt werden, um die alte Zeichnung (überschrieben) anstelle der neuen zu entfernen, wenn die ausgewählte Variable geändert wird.
Ich bin gespannt, ob so etwas möglich ist und wie es codiert werden könnte.
Automatisierung und SkriptingDatenexploration und -visualisierungBetreff: Suche nach einer Möglichkeit, eine Form über ein Diagramm zu steuern und zu verschiebenKönnten Sie ein besseres Beispiel dafür liefern, was Sie zu visualisieren versuchen? JMP verfügt beispielsweise über Mousetrap(), das Dinge basierend auf der Cursorposition im Framebox zeichnen kann
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11)))
);
exx = 70;
exy = 70;
Report(gb)[FrameBox(1)] << Add Graphics Script(
Mousetrap(
exx = x;
exy = y;
);
Rect({exx - 10, exy - 10}, {exx, exy});
);
</CODE></P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-751817" slang="en-US" mode="CREATE">Betreff: Suche nach einer Möglichkeit, eine Form über ein Diagramm zu steuern und zu verschieben</LINGO-SUB><LINGO-BODY id="lingo-body-751817" slang="en-US" mode="CREATE"><PRE><CODE class=" language-jsl">x1 = y1 = x2 = y2 = 0;
keepRunning=1;
New Window( "Example", gb = Graph Box( Frame Size( 800, 800 ), Oval( x1, y1, x2, y2 ) ), <<ONCLOSE></ONCLOSE>
<P></P><iframe src="https://players.brightcove.net/6058004218001/default_default/index.html?videoId=6352215904112" width="960" height="540" allowfullscreen allow="encrypted-media"></iframe>Looks like some rusty physics.<P></P>
Betreff: Suche nach einer Möglichkeit, eine Form über ein Diagramm zu steuern und zu verschiebenDas ist wirklich ordentlich.
Ich denke, ich kann dafür eine Verwendung finden. Ich möchte gern ein bisschen damit herumexperimentieren und sehen, wie es funktioniert.
Ich möchte mein ursprüngliches Problem jetzt eher passiv angehen. Mir war nicht klar, dass man die Geschwindigkeit und Beschleunigung einer Form im Laufe der Zeit steuern kann, wie in Craiges Beispiel.
Betreff: Suche nach einer Möglichkeit, eine Form über ein Diagramm zu steuern und zu verschiebenDas sieht wirklich gut aus, ich glaube, das ist es, was ich suche. Mir gefällt sehr, dass dies zeitgesteuert sein kann.
Wäre es möglich, dies auch für eine komplexere Zeichnung zum Laufen zu bringen, wie zum Beispiel:
Füllfarbe (RGB-Farbe (255, 0, 0));
Rechteck (50, 90, 60, 80, 1);
Füllfarbe (RGB-Farbe (204, 0, 0));
Rechteck (51, 89, 59, 81, 1);
Füllfarbe (RGB-Farbe (255, 0, 0));
Vieleck ( {59, 89}, {60, 90}, {50, 90}, {51, 89});
Füllfarbe (RGB-Farbe (153, 0, 0));
Vieleck ( {60, 80}, {59, 81}, {51, 81}, {50, 80});
Wenn die Unterseite der Form die X-Achse berührt, möchte ich, dass sie nicht hüpft, sondern anhält und an Ort und Stelle bleibt.
Außerdem möchte ich, dass nach Ablauf einer bestimmten Zeit weitere Formen auf dem Bildschirm erscheinen und demselben Pfad folgen, wobei sich jede auf der X-Achse niederlässt.
Ich habe ein bisschen mit dem Skript herumgespielt, das Sie mir geschickt haben, bin mir aber nicht ganz sicher, wie ich es richtig ändern kann – wirklich clever!!!
Betreff: Suche nach einer Möglichkeit, eine Form über ein Diagramm zu steuern und zu verschiebenJa, das können Sie tun. Es klingt, als hätte Ihr Objekt eine starre Form und Sie möchten, dass es sofort anhält, wenn eine bestimmte Bedingung erfüllt ist. Nicht allmählich langsamer wird oder sich verzerrt. Und es klingt, als hätten Sie mehrere Objekte, die im Laufe der Zeit freigegeben werden können. Ich würde eine Datentabelle mit einer Zeile pro Objekt verwenden, mit Spaltennamen ähnlich diesen:
Xpos Ypos Xvel Yvel XdeltaVel TdeltaVel IsActive IsDrawing Color Size Shape
Dann würde ich zwei Funktionen schreiben: UpdateRow( Zeilennummer, deltaTime ) und DrawRow( Zeilennummer ). UpdateRow könnte ungefähr so aussehen (ungetestet, ungefähr richtig...):
UpdateRow = function({rowNumber, deltaTime}
if( dtQ:isActive[rowNumber],
dtQ:Xpos[rowNumber] += dtQ:Xvel[rowNumber] * deltaTime;
dtQ:Ypos[rowNumber] += dtQ:Yvel[rowNumber] * deltaTime;
// you might want the velocity to change as well, possibly using the deltaVelocity,
// make sure the Xs and Ys stay together
// do a test to see if still active
if( dtQ:y[rowNumber] <= 0, // whatever condition makes it stop
dtQ:isActive[rowNumber] = 0;
dtQ:isDrawing[rowNumber] -= 1; // count down until vanishes
)
}
When you add a row to the table (dtQ, above, I tend to use dt for a table not delta time!) make sure to set the row's value for isActive to 1, and if you want the non-active objects to eventually expire, set the isDrawing to 100 or 1000 to control how many cycles go by before it stops drawing.
Die DrawRow-Funktion sieht ungefähr so aus:
DrawRow = function({RowNumber},
if( dtQ:isDrawing[RowNumber],
// your code goes here. Add the dtQ:Xpos[RowNumber] to your X coords
// and same for Ypos/Y.
// .... use the color/size/shape values from the row if you find them useful
)
);
Jetzt wird das Grafikskript zu einem Paar Schleifen über dtQ, wobei die erste die Aktualisierungen anwendet und die zweite die Zeichnung erstellt. Sie müssen sie nicht getrennt halten, aber es könnte später hilfreich sein, wenn Sie sich entscheiden, Kollisionen zu behandeln.
In diesem Beispiel könnte die Datentabelle in dtQ auch mit dem Graph Builder angezeigt werden, indem die Werte xpos, ypos, Farbe, Größe und Form aufgezeichnet werden. GraphBuilder wird automatisch aktualisiert und Sie benötigen die DrawRow-Funktion nicht. Ich habe sie noch nie verwendet, aber ich denke, es könnte einen benutzerdefinierten Mechanismus zum Zeichnen von Formen für die Punkte geben.
Wenn Sie versuchen, ein Video zu erstellen (und keine interaktive Echtzeitanzeige), entscheiden Sie sich für 30 oder 60 FPS und lassen Sie die Deltazeit von Frame zu Frame konstant bleiben. Oben habe ich Zahlen gewählt, mit denen es auf meinem Computer funktioniert hat. Aber wenn ich 1/30 gewählt und eine Reihe nummerierter Bilder erstellt hätte, wäre ein sehr flüssiges Video entstanden.