Scripting: Wiederholung ohne feste Anzahl

GeoGebrix shared this question 9 months ago
Answered

Hallo,

kann man im GGB-Scripting eine Wiederholung hinbekommen, deren Abbruch von einer Bedingung abhängig ist, also ohne die feste Anzahl wie im Wiederhole-Befehl?

Danke für Hinweise!

(Ziel: es sollen so oft Zufallspunkte erzeugt werden, bis sowohl die Zufallspunkte als auch alle deren Spiegelungen an einer Zufallsgeraden auf dem Bildschirm zu sehen sind. Zufallspunkte kriege ich so hin, aber die Spiegelung ist manchmal nicht zu sehen.)

GeoGebrix

Comments (11)

photo
1

Wiederholung mit Abruchbedingung ist mit GGB-Skripts kaum resp. nicht machbar. Mit JS wäre das einfacher.

Aber wenn man die Aufgabe anders angeht, so kann dieses sogenannte "Backtracking" oft umgangen werden. So auch in diesem Beispiel. Siehe Anhang mit Erläuterung.

.

Beim Wiederholen-Befehl (mit viel zu hoher Wiederholanzahl) könnte man die überzähligen Loops mit einer Kondition überspringen. Allerdings sind Konditionen innerhalb der Schlaufe nicht in allen Fällen unterstützt. Diese Berfehle (inklusive überspringen) müsste in 1 oder 2 Skript-Listen (alternativ in pseudo Buttons, aufgerufen mit SkriptBeiMausklick()) ausgelagert werden. Ich meine aber, dass mein Lösungsvorschlag im Anhang besser ist.

.

Der Anhang hat noch einen Fehler meinerseits oder einen GGB-Bug. Eigentlich dürfte F9 die Neuberechnung nicht anstossen. Aber möglicherweise willst Du so oder so mit F9 arbeiten.

Wenn ich was finde, sende ich die Umgehungslösung oder die Korrektur.

photo
1

Es war mein Fehler: F9 aktiviert unter anderem im Schieberegler und Kontrollkästchen den Script onUpdate.

Wenn diese dann SkriptbeiMausklick(ScriptBox) anstossen, werden die Punkte neu berechnet.


Lösung:

Abhängig vom Status von F9enable wird der Timeout-Schieberegler (F9timeout) angestossen. Der wird in den fraglichen Objekten (anz und erläut) abgefragt und der dortige skript allenfalls nicht ausgeführt.

.

Anhang: neue Verion die nicht mehr auf F9 reagiert (falls F9 erwünscht das Objekt F9enable auf true setzen)

photo
1

Es geht auch andersherum. Sobald die zufällige Spiegelgerade erzeugt ist, kann man mir ihr und ihren Schnittpunkten mit den Rändern des sichtbaren Bereiches denjenigen Bereich der Zeichenfläche ausrechnen, in dem sowohl Original- als auch Spiegelpunkt sichtbar sind. (Dieser Bereich sollte in jedem Fall ein Drachenviereck sein, dessen Symmetrieachse auf der Spiegelgeraden liegt). Die zu spiegelnden Zufallspunkte werden dann mit der Restriktion erzeugt, dass sie in diesem Drachenviereck liegen müssen.

photo
1

Abakus' Ansatz gefällt mir besser, auch weil ich den Ansatz von Rami nicht so ganz verstehe. Aber wie berechne ich diesen Drachenviereck-Bereich?

GeoGebrix

photo
1

Deine Spiegelgerade sei a.

Dein sichtbarer Bildschirmbereich wird beschrieben durch die Ungleichungsverknüpfung

(x < x(Eckpunkt[2])) ∧ (x > x(Eckpunkt[1])) ∧ (y > y(Eckpunkt[1])) ∧ (y < y(Eckpunkt[4])) .

Diese Ungleichungsverknüpfung hat auch einen Namen, bei mir war das b.

Eine Spiegelung

Spiegle[b,a] liefert dann eine Ungleichungsverknüpfung namens b', welche der Spiegelung des Bildschirmrechtecks an der Geraden a entspricht.

Der Befehl

Schneide[b,b']

liefert denjenigen Teil des Bildschirms, von dem die Spiegelpunkte auch auf dem Bildschirm sind.


Was ich noch nicht weiß: Wie fragt man ab, ob ein Punkt mit seinen Koordinaten die insgesamt 8 Ungleichungen erfüllt?


Meine erste Idee war übrigens, eine Liste der Schnittpunkte beider Rechtecke aufzustellen und aus den Punkten dieser Liste ein Vieleck zu bilden. Das scheiterte daran, dass dabei ein überschlagenes Vieleck entstand.

photo
1

Wenn

W = (x < x(Eckpunkt[2])) ∧ (x > x(Eckpunkt[1])) ∧ (y > y(Eckpunkt[1])) ∧ (y < y(Eckpunkt[4])) 
und
W' = Spiegle(W, <Spiegelgerade>)
dann

W(x(<Punkt>), y(<Punkt>)) ∧ W'(x(<Punkt>), y(<Punkt>))

photo
1

Falls ich alles richtig verstanden habe:

Wenn man nun also weiss, dass der Zufalls-Punkt ja/nein in in den Bereich gehört....

Wie oft muss das Zufalls-Punkte-Generieren wiederholt werden?

Und wie steuert man das (ohne bedingten Loop)?

Das war ja die anfängliche Frage in diesem Tread.

photo
1

Hallo Geogebrix,

eine Lösung deines Problems könnte äußerst simpel sein: Wenn schon deine Spiegelgerade zufällig sein soll (und damit nicht von Beginn an festgelegt ist), dann konstruiere doch erst zwei beliebige Punkte, die als Original- und Bildpunkt deiner Spiegelung fungieren sollen. Erst danach zeichnest du als Mittelsenkrechte der Strecke zwischen diesen beiden Punkten quasi nachträglich deren Spiegelgerade dazu.

photo
1

Schöne Idee.

Funktioniert mit einem zu spiegelnden Punkt (genügt ja eigentlich, wenn man die Konstruktions-Aufgabe mehrfach stellt.)

photo
photo
1

Hi,

I'm not sure I understand request, but I hope it can be useful.

photo
1

Anders als in meinem ersten Vorschlag werden hier die Punkte zwar in einer Iteration aber nicht summarisch (zB StreckenZentrisch(liste)) behandlet. Für jeden einzelnen Punkt wird die Maximal-Distanz ermittelt. Damit entfällt das sogenannte Backtracking-Problem. (in gewissem Sinne eine Abwandlung der Idee von abakus für einen Punkt)

Zusätzlich wird/kann die Spiegel-Achse schräg gestellt.

Zusätzlich ist die Verteilung der Punkt so, dass deren Abstand (parallel zur Spiegel-Achse) einen minimal Wert nicht unterschreitet (dabei bleibt die Verteilung aber random). Das erleichtert die vom Schüler zu leistende Aufgabe.

Es sind nur Befehle aus dem "Standardrepertoire" genutzt.

Durch die Verwendung von "Pfadparameter" ergibt sich automatisch eine (vereinfachende) Normalisierung, die in der ersten Version noch explizit ausprogrammiert wurde.

Ich meine, dass die Dokumentation (Beschriftung, KonstruktionsProtokoll) hilfreich sein sollte.

Zusätzlich sollte auch der Kommentar im Skript der Schaltfläche "Alle RandomWerte Neu" beachtet werden.

Falls sich jemand in den Code einarbeiten wolte und Fragen dazu hätte: diese beantworte ich gerne.

© 2018 International GeoGebra Institute