Frage: Hat ein vorgelegter Streichholzgraph nur Kanten der Länge 1?
Zusatzfrage: Wenn nicht, lässt er sich noch zurechtrücken zu einem solchen Graph?
Dazu einen neuen Graph beginnen und im großen Eingabefenster nach A(2,1); die Eingabe fortsetzen mit
zwei Kanten anfügen mit
(hier 2 s warten) und
und
und mehr unter Beschreibung.
eine einzelne Kante anfügen und mittels einer Winkelangabe ausrichten
,
,
,
zwei schon vorhandene Knoten mit einer Kante verbinden
,
,
,
.
Allein mit diesen Eingabefunktionen kann schon ein Streichholzgraph komplett eingegeben werden. Dann kann man in dieser Ergebniszeile die maximale und minimale Kantenlänge ablesen. Für den lautet das Ergebnis minimal 0.99973399850038091596, maximal 1.00000000000000066613.
Dann kann man versuchen, das Ergebnis zu verbessern, mittels der Buttons , neue Eingabe und . Danach lautet das Ergebnis minimal 0.99999999999999966693, maximal 1.00000000000000244249
Das Ergebnis ist besser, aber immer noch kein Beweis, dass die Kanten wirklich alle exakt 1 sind. Es ist aber ein deutlicher Hinweis darauf, dass die Suche nach einem richtigen Beweis Erfolg haben könnte. Bei diesem Graph geht das rechnerisch mit Button "acos(1/4)" mit dem Ergebnis minimal exakt 1, maximal exakt 1.
Für 4-reguläre Graphen vereinfacht sich dieses Abzählkriterium wegen s-2k=0 zu n=a. Falls der Graph vereinzelt Knoten mit Knotengrad ungleich 4 enthält, braucht man nur die Abweichungen vom Knotengrad 4 zählen und die Hälfte davon geht in das Abzählkriterium ein als s-2k=Knotengradabweichungssumme/2, denn jede Kante, die man aus dem 4-regulären Graph entfernt oder dort hinzufügt, ändert die linke Seite s-2k um 1 und den Term Knotengradabweichungssumme/2 auf der rechten Seite ebenfalls um 1, weil die eine entfernte oder hinzugefügte Kante den Knotengrad von zwei Knoten um je 1 ändert.
Variable a setzt sich zusammen aus den obligatorischen drei Auflagerreaktionen, um den Graph als ganzes an der Bewegung zu hindern, ergänzt um zusätzliche Auflagerreaktionen, welche eventuell vorhandene bewegliche Teilgraphen fixieren, a = Beweglichkeit + 3. Wenn alle vorhandenen Bewegungsmöglichkeiten durch Auflager aufgefangen werden, ist n nur gleich oder größer als Null. Diesen Grad der Überbestimmtheit n deute ich als Anzahl der Kanten, welche beim Auflegen des Streichholzgraphen in einen passenden unveränderbaren Abstand eingesetzt werden müssen, im Thread Einsetzkanten genannt.
und so wird diese Gleichung über jedem Graph angezeigt. Einige Beispiele sind
Einsetzkanten=Beweglichkeit+3 in weil 4-regulärer Graph,
Einsetzkanten=Beweglichkeit+1 in weil 2 Knoten vom Grad 2.
Aus dem Abzählkriterium geht nur hervor, wie groß die Differenz der Variablen Einsetzkanten und Beweglichkeit ist und nicht deren tatsächliche Werte. Diese zu bestimmen, das folgt im nächsten Abschnitt.
Zur Bestimmung der Einsetzkanten und deren Bereiche gibt es jetzt 5 verschiedene Button-Kombinationen:
Variante
Button
Programm
Eingabe der Punktkoordinaten
Berechnung
Ergebnis
1
"acos(1/4)"
GAP
exakt
exakt
exakt
2
"GAP"
GAP
6 Nachkommastellen
exakt
nicht exakt wegen ungenauer Eingabedaten
3
"Einsetzkanten"+Checkbox "BigInt"
Browser
6 Nachkommastellen
exakt
gleiches Ergebnis wie bei Button "GAP"
4
"Einsetzkanten"+Checkbox "gerundet"
Browser
6 Nachkommastellen
gerundet
nicht exakt
5
"Einsetzkanten"
Browser
ca. 15 Nachkommastellen
gerundet
nicht exakt
Variante 1 geht leider nicht bei jedem Graph, deshalb Variante 2. Variante 3 rechnet wie 2, etwas langsamer aber dafür im Browser. Variante 4 ist schneller als Variante 3 wegen gerundeter Berechnung. Variante 5 nimmt genauere Eingangsdaten im Vergleich zu Variante 4.
Damit auch beim Rechnen mit gerundeten Eingabedaten etwas brauchbares herauskommt, habe ich überall, wo im Rechenalgorithmus ein Vergleich x=0 auftritt, diesen ergänzt durch einen Vergleich |x|<ε. Wenn das erfüllt ist, wird der Rechenalgorithmus wie bei x=0 fortgesetzt. Der Wert für ε ist einstellbar unter Button "ausführlich", ebenso auf wieviel Nachkommastellen die Eingabe gerundet werden soll. Der eingestellte Wert ε=0.1 erscheint recht grob, hat sich aber in bisherigen Beispielen als ausreichend herausgestellt. Beispiel , Button "Einsetzkanten" mit Checkbox "BigInt" liefert für ε=0.1 das gewünschte Ergebnis 1 Einsetzkante und 1 Beweglichkeit, bei ε=0 nur 0 Einsetzkanten und 0 Beweglichkeit. Der Wechsel zwischen beiden Ergebnissen erfolgt irgendwo zwischen 0.0000001<ε<0.000001.
Zur Bedeutung der grafischen Programmausgabe siehe Beschreibung .
Zur Installation des GAP-Programms siehe und mehr im Abschnitt "weitere vorhergehende Programmversionen".
Der nächsten Abschnitt "Testtabelle für Einsetzkanten" enthält eine größere Menge Beispiele.
Beitrag No.2366
In der linken Spalte einen Graph auswählen (anklicken), dann Button "Einsetzkanten" drücken. In der zweiten Spalte "E B" steht, was herauskommen soll: E=Anzahl Einsetzkanten, B=Grad der Beweglichkeit. In den nächsten drei Spalten was herauskommt bei Button "acos(1/4)", "GAP", "Einsetzkanten". In der nächsten Spalte rechnet Button "Test" alle Zeilen auf einmal nach. Die restlichen Spalten sind noch ohne Bedeutung (das waren anfängliche Zwischenergebnisse zum Verbessern). Vorerst soll nur die Zahl der Einsetzkanten richtig herauskommen. Ein unmittelbar darauffolgendes "wenige N", "egal wie", "wenige Winkel" oder "viele Winkel" verwendet diese Einsetzkanten mit der Absicht, eine höhere Genauigkeit zu erzielen. Eintrag "-" bedeutet, Button ist für diesen Graph nicht verwendbar.
E B
"acos(1/4)"
"GAP"
1 0
1 0
1 0
1 0
1
ERROR
-
1
-
2 1
2 1
2 1
2 1
1
1
-
1
-
3 0
3 0
3 0
3 0
1
1
-
1
1
4 1
4 1
4 1
4 1
1
1
-
1
1
1 2
1 2
1 2
1 2
1
1
1
1
-
1 2
1 2
1 2
1 2
1
1
1 (grün)
1
-
6 27
- -
6 27
6 27
1
1
1 (grün)
1
-
1 1
1 1
1 1
1 1
1
1
1 (grün)
1
-
0 1
0 1
0 1
0 1
1
ERROR
ERROR
1
1
1 2
- -
1 2
1 2
1
ERROR
ERROR
1
1
3 4
- -
3 4
3 4
1
1.0019
P72-P82 fehlt
1
ERROR
5 2
5 2
5 2
5 2
ERROR
ERROR
0.9998
1.001
1.0009
2 3
2 3
2 3
2 3
1
ERROR
1
1
1
5 2
5 2
5 2
5 2
1
1
1
ERROR
ERROR
1 2
1 2
1 2
1 2
5 6
5 6
5 6
5 6
4 1
4 1
4 1
4 1
7 4
7 4
7 4
7 4
10 0
- -
10 0
2 1
2 1
2 1
2 1
3 2
- -
3 2
3 2
4 3
4 3
4 3
4 3
4 1
4 1
4 1
4 1
4 5
4 5
4 5
4 5
4 1
- -
4 1
4 1
6 0
- -
6 0
6 0
4 1
- -
4 1
4 1
6 1
6 1
6 1
6 1
0 5
0 5
0 5
1 0
- -
1 0
1 0
3 1
3 1
3 1
3 1
7 0
7 0
7 0
7 0
6 0
- -
6 0
6 0
1 1
1 1
1 1
1 1
3 0
- -
3 0
E B
"acos(1/4)"
"GAP"
Button "max bij" soll einen einfach beweglichen Graph daraufhin untersuchen, ob im Verlauf der Bewegung eine Stelle erreicht wird, an der sich die Bewegung verzweigen kann. Wähle als Ausgangspunkt einen der folgenden Graphen (anklicken):
,
,
,
,
,
.
Dann der Reihe nach folgende Buttons anklicken:
(oder einen anderen Button für neue Eingabe),
,
(und abwarten bis alle t gefunden),
(hier abwarten, bis sich Ausgabe "t=..." nicht mehr verändert und am Ende ganz verschwindet). Als Ergebnis herauskommen soll
,
,
,
,
,
.
Das sind die Stellen, wo Verzweigungen der Bewegung möglich sind. Anschließend Button "Verzweigungen" in der Zeile "Testfunktion" drücken, daneben werden dann verschiedene Verzweigungen aufgelistet als Buttons (0), (1), (2) und mehr soviele gefunden wurden. Dann einen von diesen anklicken und Buttons "beweglich?", "extrapolieren", "ausrichten", "Kanten" und Animation starten mit Knopf "Start_t" links neben dem Graph. Nach Betrachtung dieser Beispiele könnte man meinen, daß solche Verzweigungen der Bewegung nur dort auftreten, wo zwei Kanten exakt auf einer Linie liegen. Das ist oft, aber nicht immer der Fall. Zum Beispiel in Graph "#1902" beträgt der Winkel ∠(P6,P3,P1) exakt 180°. Nach Button "acos(1/4)" jedoch ist der Graph einfach beweglich, und das ist exakt gerechnet. Zweifache Beweglichkeit tritt knapp daneben auf, in Graph "#1902a", dort ist ∠(P6,P3,P1)=176.9°.
Die beiden Buttons "max bij" und "Verzweigungen" sind allerdings nur erste Versuche durch Probieren, ob in diesen Beispielen die Verzweigungen gefunden werden können. Da fehlt noch ein allgemein funktionierendes Verfahren.
Button "besser annähern" soll folgende Funktionen übernehmen:
Zuerst alle nicht passenden Kanten entfernen.
Falls der verbleibende Graph beweglich ist, diese Beweglichkeit nutzen, um einzelne entfernte Kanten in beliebiger Reihenfolge wieder passend einzufügen. Aber nur solange, bis ein starrer Graph erreicht ist.
Anschließend, unbedingt und soweit es irgend möglich ist, solche Kanten entfernen, ohne denen der Graph immer noch starr bleibt, ebenfalls in beliebiger Reihenfolge.
Dann der Reihe nach je eine Kante entfernen, einen dadurch entstehenden Beweglichkeitsbereich bestimmen und daraufhin absuchen, ob irgendeine der entfernten Kanten passend wird.
In so einem Fall den Graph kopieren, in der Kopie alle entfernten Kanten wieder hinzufügen und die Kopie als Zwischenlösung speichern, sofern diese Zwischenlösung nicht schon vorhanden ist.
Anschließend den Beweglichkeitsbereich weiter absuchen und weitere gefundene Zwischenlösungen speichern
und wenn der Beweglichkeitsbereich vollständig abgesucht ist, die zuletzt in 4. entfernte Kante wieder hinzufügen, die nächste Kante entfernen, Beweglichkeitsbereich bestimmen und absuchen, Zwischenlösungen speichern und so weiter...
Diese Methode 1. bis 4. für jede gefundene Zwischenlösung rekursiv wiederholen, also nicht passende Kanten entfernen und so weiter...
ist Graph . Er hat jede Menge nicht passende Kanten. Sie lassen sich mit Button bis auf 5 verbleibende Kanten zurechtziehen. Genauer gesagt, 4 nicht passende Kanten und 1 Kante, die zusätzlich entfernt werden kann, so dass der Graph immer noch starr bleibt. Nun eine Verbesserung mit der oben beschriebenen Methode versuchen, reihum eine weitere Kante zu entfernen, um den Graph beweglich zu machen. Klicke auf Button und die Suche beginnt. Unter dem Graph werden fortlaufend die gefundenen Zwischenlösungen als Buttons "bisheriges Minimum=x.xxxx" aufgelistet. Die Beschriftung "x.xxxx" bezeichnet die maximale Abweichung von Kantenlänge 1. Die vierte Zwischenlösung mit der Beschriftung "bisheriges Minimum=0.0000" ist schon das gesuchte Ergebnis. Button und Button "0.0000" anklicken.
ist Graph Button (anklicken). Er hat drei nicht passende Kanten. Sie lassen sich mit Button nicht weiter zurechtziehen. Klicke diesmal auf Button , dann wird die Suche rekursiv für jede gefundene Zwischenlösung fortgesetzt. Irgendwann (kann Minuten, Stunden, Tage, Jahre dauern) wird die gesuchte Zwischenlösung "bisheriges Minimum=0.0000" ausgegeben (wenn es eine gibt und gefunden wird, konkret bei diesem Graph ist es die xx.-te Zwischenlösung). Dann wieder und Button "0.0000" anklicken. Das ist eine Lösung mit passenden Kanten.
Der Button "intern" zeigt die (nahezu unverändert) herauskopierte Beschreibung aus der betreffenden Programmversion, teilweise dann aber doch aktualisiert.
zu Beitrag No.464: Markierung der Kanten durch einen Mittelkreis, damit verdeckte Kanten sichtbar werden. Der Radius dieses Kreises verändert sich proportional zur Länge der Kante, ebenfalls damit verdeckte Kanten sichtbar werden. Zusätzliche Funktion: Klick auf den Mittelkreis bringt die Bezeichnungen der Endpunkte der betreffenden Kante in den Vordergrund und markiert außerdem im großen Eingabefenster die Stelle, an der die Kante gezeichnet wird. Eingabebeispiel war . Dort fällt Punkt P5 mit P54 zusammen und auch deren Beschriftung, was man erst beim Anklicken der Mittelkreise der von P54 ausgehenden Kanten unterscheiden kann.
zu Beitrag No.518/519: Eine Eingabe wie Q(13,12,10,ab(11,5),D) bedeutet, dass der neu zu zeichnende Punkt P13 von P12 den gleichen Abstand wie P11 von P5 hat und dann wird P13 mit P12 verbunden. Das ist jetzt so erweitert, dass in ab(...) nach den ersten beiden Indizes 11,5 noch beliebig weitere Punkte 8,9,10 angegeben werden können: Q(13,12,10,ab(11,5,8,9,10),D). Dann wird P13 mit P12 nicht mehr durch eine einzelne Kante verbunden, sondern es wird der durch P11,P5,P8,P9,P10 ausgewählte Teilgraph gezeichnet, und zwar so, dass die Kopie der Kante P11-P5 auf dem Abstand P13-P12 zu liegen kommt. Anstelle aufeinanderfolgender Punkte 8,9,10 kann auch das Intervall [8,10] angegeben werden, Q(13,12,10,ab(11,5,[8,10]),D) und auch einzelne Punkte und Intervalle gemischt Q(13,12,10,ab(11,5,[8,9],10),D). Ein letzter Parameter "gespiegelt" bewirkt, dass der Teilgraph gespiegelt gezeichnet wird. Q(13,12,10,ab(11,5,[8,9],10,"gespiegelt"),D). In gleicher Weise kann jetzt eine Eingabe A(100,99) erweitert werden zu A(100,99,ab(i,j,[k,l])), das bedeutet, anstelle einer neuen Kante von P100 zu P99 wird der komplette Teilgraph von Pk bis Pl einschließlich Pi und Pj nochmal neu gezeichnet, und zwar so, dass Pi auf P100 zu liegen kommt und Pj auf P99.
Anstelle Teilgraph kopieren geht jetzt auch Teilgraph drehen, also der ausgewählte Teilgraph selbst wird für die neue Verbindung verwendet und nicht eine Kopie davon. Demzufolge ist der Teilgraph anschließend nicht mehr am alten Platz. Die Eingabe erfolgt als Q(13,12,10,ab(11,5,[8,9],10,"gedreht"),D) oder mit Spiegeln als Q(13,12,10,ab(11,5,[8,9],10,"gedreht","gespiegelt"),D). Erster Nachteil: Es entsteht eine frei werdende Punktnummer. Diese wird mit als "nächster Punkt" unter dem großen Eingabefenster angezeigt und kann bei nachfolgender Eingabe mit verbraucht werden. Zweiter Nachteil: Der Teilgraph muss wie im nachfolgenden Beispiel mit einem Punkt schon an der endgültigen Position plaziert werden, so dass wirklich nur eine Drehung und keine Verschiebung erforderlich ist. Beispiel kommt jetzt mit zwei einzustellenden Winkeln aus statt vorher mit drei. Für eine grafische Darstellung siehe nach Buttons "#313-2a" und "Beschreibung" den Button "Q(243,96,92,ab(..."gedreht"))". Weiteres Beispiel mit nur einem Winkel statt vorher zwei.
Beitrag No.551. Neues Eingabeformat. Die Winkel sind jetzt als xml-Elemente mit im großen Eingabefenster enthalten und müssen nicht mehr in die kleinen Input-Felder kopiert werden. Das geschieht bei Button "neu zeichnen" automatisch. In den xml-Elementen können Variablenname und Farbe geändert werden. size="0" schaltet das kleine Inputfeld ganz aus. Es können noch mehr Winkel als xml-Elemente angegeben werden. Ein Bildtext ist ebenfalls einstellbar, zum Beispiel
Beitrag No. 630. Neuer Button "Feinjustieren(i)" und andere neue Funktionen.
Die ehemals drei Buttons "Feinjustieren", "Feinjustieren2", "Feinjustieren3" sind ersetzt durch ein einziges "Feinjustieren(i)", wobei man die Anzahl i durch die nachfolgenden Buttons "+" "-" einstellen kann oder auch durch das Attribut "Anzahl" im Element "Feinjustieren" im großen Eingabefenster.
Mit diesem Feinjustieren(i) gehen jetzt auch mehr als i=3 Winkel gleichzeitig zu justieren. Das erfolgt so, dass in Reihenfolge der Winkel-Elemente die ersten i(geändert:) alle m einstellbaren Winkel einzeln geringfügig variiert werden. Dabei wird in Reihenfolge der R(.,.)- und RW(...)-Eingaben die Veränderung der ersten i Bedingungen (Abstände oder Winkel) festgestellt. Das ergibt ein i*m Gleichungssystem, um linear angenähert die ersten i Bedingungen auf Sollwert zu bringen. Bei i<m hat dieses Gleichungssystem, falls lösbar, mehrere Lösungen, von denen die mit der kleinsten Norm verwendet wird, siehe (passenden Link noch einsetzen). Mehrfaches Wiederholen dieses Verfahrens verbessert dann die Annäherung. Zum Lösen des Gleichungssystems habe ich https://github.com/itsravenous/gaussian-elimination verwendet, zwecks offline-Nutzung als Kopie und nicht als direkten Link. (ergänzt:) Auf die bisherige Funktionsweise, nur die ersten i Winkel zum Einstellen verwenden, kann mit Attribut Anzahl="i,i" im xml-Element Feinjustieren behelfsmäßig zurückgeschaltet werden. Das erste i steht für Anzahl Bedingungen, das zweite i für Anzahl der verwendeten einstellbaren Winkel
Wird mit Buttons "neue_Eingabe" und anschließend "Übernehmen" eine neue Eingabe erzeugt, enthält diese oft Kanten mit Längenangabe jam(Kantenlänge)*D für Kanten ungleich 1. Diese Kanten werden jetzt durch einen Ziehfaktor auf Solllänge 1 gebracht über die Formel Länge=Anfangslänge+Ziehfaktor*(Solllänge-Anfangslänge). Dieser Ziehfaktor kann beginnend bei 0 nach und nach bis 1 eingestellt werden im gleichnamigen Attribut des Elements "Feinjustieren" im großen Eingabefenster. Nach jeder Erhöhung des Ziehfaktors die Winkel mittels Button "Feinjustieren(i)" neu justieren.
Mit zusätzlichen Attributen "Zunehmen", "Warten", "Wiederholen" im Element "Feinjustieren" kann eine Programmschleife gestartet werden. "Zunehmen" erhöht Attribut "Ziehfaktor" um den zugewiesenn Wert, "Warten" gibt die Zeit in Sekunden an, die der Browser bis zum nächsten Schleifendurchlauf wartet, und "Wiederholen" enthält die Anzahl der Schleifendurchläufe.
Falls ein "Feinjustieren(i)" misslungen ist (total verfitzter Graph), Button "zerknüllt?" geht (hoffentlich) einen Schritt zurück.
Die Buttons "+1" "+0.1" "+0.01" "-0.01" "-0.1" "-1" wirken auf den jeweils kursiv geschriebenen Winkel. Das ist anfangs blauerWinkel=... und kann durch Klick auf gruenerWinkel=... auf diesen oder einen anderen Winkel umgestellt werden.
die Anzahl der Eingabefelder für einstellbare Winkel kann mit den Buttons "mehr" "weniger" (befinden sich im Anschluß an den Winkeln) verändert werden.
der Button "acos(1/4)" erzeugt für das GAP-Programm eine Eingabe mit exakten Punktkoordinaten. Das ist aber nur sinnvoll bei solchen wie in Beitrag No.497 beschriebenen acos(1/4)-Graphen.
Beispiel
mit Button "neue Eingabe, Rahmen zuerst".
Beitrag No. 640. laden. Drücke die Buttons "neue Eingabe, Rahmen zuerst" und "innere Punkte zufällig verschieben", dann "Feinjustieren(i)" (das i wird passend eingestellt). Wenn das Ergebnis nicht brauchbar ist, Button "zurück", sooft, bis ein passender Graph für neues "innere Punkte zufällig verschieben", "Feinjustieren(i)" erreicht ist. Weiter unten sind eine ganze Reihe Beispielgraphen aufgeführt, die ebenfalls für diese Prozedur geeignet sind.
Die Adresse der Zeichenvorlage ist im großen Eingabefenster im xml-Element "Vorlage" als Attribut "href" angegeben. Ersetzte dort beispielsweise "...4.png" durch "...4b.png", dann Button "neu zeichnen" drücken.
Außerdem sind bereits drei Punkte P1, P2 und P3 vom neuen Graph vorgegeben. Verschiebe die Punktbezeichnung P1 hin zu Punkt c7, P2 zu cb und P3 zu cc, und zwar mit folgender ausgefallenen Methode: Zuerst gleichzeitig die [Shift+Ctrl]-Tasten drücken und dann mit dem Mauszeiger (ohne Mausklick) langsam über die Punktbezeichnung P1 hinwegfahren. Dabei erscheint ein Stern, welcher durch Weiterbewegen der Maus genau auf Kantenschnittpunkt "c7" plaziert werden soll. Zum Schluss [Shift+Ctrl]-Tasten loslassen und Mauszeiger wegbewegen (nicht vergessen!!!). Entschuldigung für dieses Kuddelmuddel, richtiges Drag&Drop hat nicht funktioniert wie vorgehabt, das muss ich noch weiter versuchen.
Dann einen neuen Punkt P4 erzeugen durch gleichzeitiges Drücken der [Shift+Ctrl]-TastenDrücken ALT-Taste und dann mit linker Maustaste irgendwohin auf die Zeichenvorlage klicken. Es erscheint ein neuer Punkt P4. Falls nicht, SHIFT+ALT+Klick versuchen. Anschließend den neuen Punkt P4 hin zu Punkt "ca" der Zeichenvorlage verschieben, ebenfalls mit der ausgefallenen Methode.
Dann P4 mit P2 verbinden, indem der Mauszeiger ohne Klicken, dafür mit gedrückter Ctrl-Taste, über Punktbezeichnung P4 hinweg zu Punktbezeichnung P2 bewegt wird. Ebenso P4 mit P3 verbinden. Fertig sieht das so aus: , .
Sind alle Punkte und Kanten eingegeben (vorsichtshalber den Inhalt des großen Eingabefensters in einem Texteditor zwischengespeichern), kann der Graph zurechtgezogen werden, beispielsweise mit Buttons "neue Eingabe, Rahmen zuerst" und anschließend "Feinjustieren(i)".
Als einzustellende Einheitslänge D wird der Abstand der Punkte P1 und P2 genommen (das lässt sich im großen Eingabefenster jederzeit umprogrammieren, besser so lassen). Deshalb sollten P1 und P2 auf eine schon passende Kante der Zeichenvorlage plaziert werden.
Wenn die Eingabe mit der Maus nicht funktionieren will, geht zur Not auch Eingabe von "P[4]=[207.82,96.44]; A(4,2); A(4,3)" im großen Eingabefenster an das Ende des xml-Elements "Rechenweg" und anschließend Button "neu zeichnen"
Man kann auch gemischt die bisherigen Eingabefunktionen L, N, Q, M... mit verwenden, beispielsweise ginge anstelle von "P[3]=[25,43.3]; A(1,3); A(2,3);" die Eingabe "L(3,1,2)". Dann wird P3 bei Buttons zum Verschieben, Ausrichten, Vergrößern, Verkleinern automatisch mit P1 und P2 weiterbewegt. Beispiele: , wo der ganze Graph nur mit P1 und P2 verschoben werden kann und dafür die anderen Punkte gar nicht.
Die Zeichenvorlage ist mit Absicht etwas blasser dargestellt, damit besser zu sehen ist, wie weit der neue Graph schon gezeichnet ist.
Auf dem Tablet:
Beide Buttons "Shift" und "Ctrl" ein: Tippen auf die Zeichenvorlage erzeugt dort einen neuen Punkt P4.
Nur "Shift" ein: Bezeichnung P3 antippen (wechselt zu violett) dann P2, zeichnet Dreieck zu weiterem neuem Punkt.
Nur "Ctrl" ein: Erst P3 antippen (wechselt zu violett) dann P2, verbindet/trennt P2 und P3.
Buttons "Shift" und "Ctrl" aus: Einen beweglichen Punkt wie P2 an einen neuen Platz ziehen.
Die Demo-Animation startet mit Klick auf den blauen SVG-Knopf links von "Start_blauerWinkel".
Mit Button "Punkt aus/an" kann zwischendurch auf vereinfachte Ausgabe umgeschaltet werden (dann läuft die Animation gleichmäßiger) und wieder zurück.
Klick auf grauen SVG-Knopf links neben der Grafik links von "Stopp_alleWinkel" hält die Animation an.
Die Animation kann jederzeit neu gestartet werden mit Klick auf den blauen SVG-Knopf links von "Start_blauerWinkel".
Die Animation ist in den animate-Elementen im großen Eingabefenster programmiert und kann dort nach Belieben verändert und ergänzt werden. Die zusätzlichen Knopf-Elemente stellen die Start- und Stop-Funktionen bereit. Änderungen stets mit Button "neu Zeichnen" abschließen, erst dann werden sie übernommen.
Kurze Erläuterung der im animate-Element verwendeten Attribute:
xlink:href="#blauerWinkel"
Element mit id="blauerWinkel" wird animiert, vor der id ein "#".
attributeName="value"
darin das Attribut "value"
values="0;6;0;-6;0"
von 0 nach 6, dann zurück über 0 nach -6, dann wieder 0
dur="10"
Zeitdauer eines solchen Durchlaufes 10 Sekunden
additive="sum"
values wird zum Ausgangswert des Winkels hinzuaddiert
repeatCount="indefinite"
Durchlauf mit dur="10" wird unendlich oft wiederholt
begin="Start_blauerWinkel.click+0"
Start der Animation 0 Sekunden nach Klick auf Taste id="Start_blauerWinkel"
end="Stopp_alleWinkel.click+0"
Ende der Animation 0 Sekuden nach Klick auf Taste id="Stopp_alleWinkel"
zu Beitrag No.964: Neue Buttons zum Verschieben, Ausrichten und Vergrößern/Verkleinern des Graphen.
Bisher gab es nur Buttons zum Verschieben (die mit dem Doppelpfeil drauf).
Dazu kommen jetzt auch welche zum Ausrichten und Vergrößern/Verkleinern.
Bisher war die Wirkung eine geänderte Beobachterposition, die Punktkoordinaten haben sich dabei nicht geändert.
Jetzt ändert sich die Objektposition, der Graph wird verschoben, gedreht, vergrößert, verkleinert. Dabei ändern sich die Punktkoordinaten des Graphen.
Für Vergrößerung, Verkleinerung wird ein unveränderlicher (Zentral-)Punkt benötigt. Dieser wird so eingestellt: Bei gedrückten Shift+Ctrl-Tasten den Kursor von neben der Punktbezeichnung auf die Punktbezeichnung bewegen und dann Shift+Ctrl loslassen (ich schaffe das Anklicken eines SVG-Textes nicht). Beim Tablet nur Punktbezeichnung kurz antippen, ohne Shift+Ctrl.
Auch für Ausrichten wird ein unveränderlicher (Dreh-)Punkt benötigt. Dafür wird der erste der rechts von Button "Ausrichten" eingebenen Punkte Pj-Pk verwendet. Dann wird der Graph um Pj soweit gedreht, bis Pk genau horizontal rechts davon liegt. Für j und k konkrete Punktnummern einsetzen. Die Punkte Pj und Pk werden mit im xml gespeichert. Unmittelbar vor Button "Ausrichten" befindet sich eine Checkbox, mit der das Ausrichten dauerhaft eingeschaltet werden kann
Button "ausführlich…" listet diese Funktionen nochmal mit ausführlicher Anleitung auf. Dort wird der Zentralpunkt zum Vergrößern/Verkleinern in einem extra Eingabefeld festgelegt. Die oben beschriebene umständliche Eingabe mit der Maus war und ist dafür gedacht, wenn zusammenfallende Punktbezeichnungen nicht mehr erkennbar sind.
Das Ausrichten entlang Pj-Pk ist für unmittelbar anschließende Animationen wirksam, solange, bis in irgendeiner Form Button "neu zeichnen" ausgeführt wird. Beispiel: , "horizontal entlang P10-P28" einstellen und Button "Ausrichten" drücken. Dann Animation starten mit dem Knopf links von "Start_blauerWinkel". Nach "neu zeichnen" und nochmal Animation starten wird nicht mehr entlang P10-P28 ausgerichtet.
Button "D=50" stellt nach Vergrößern/Verkleinern wieder eine Einheitslänge D=50 her.
All diese Buttons sind nur für Eingaben geeignet, die mit P[1]=[...,...]; P[2]=[...,...]; D=ab(1,2); beginnen ("..." steht für konkrete Koordinatenangaben).
Werden diese Buttons bei gedrückter Shift- und/oder Ctrl-Taste angeklickt, verringert sich die Schrittweit, außer bei Ausrichten.
Beispiele: In Punkt P26 als Zentralpunkt auswählen (bei gedrückten Shift+Ctrl die Punktbezeichnung P26 anklicken) und dann paarmal Button "Vergrößern" bis P26 deutlich von P12 zu unterscheiden ist. In Punkt P29 als Zentralpunkt auswählen und dann vergrößern bis P29 deutlich von P20 zu unterscheiden ist.
Dann das GAP-Programm einmalig starten, ein SaveWorkspace ausführen, und GAP wieder beenden:
gap
SaveWorkspace("GAP_WORKSPACE");
quit;
Grund für diesen Zwischenschritt ist, es wird ein File "GAP_WORKSPACE" erzeugt, mit dem das GAP-Programm (mit gap -L GAP_WORKSPACE) wesentlich schneller gestartet werden kann. Auf dem Raspberry Pi Zero W sind das nur noch 2 Sekunden statt vorher 45 Sekunden. Doch nicht starten, sondern
Im Terminal ein File flow.json anlegen mit folgendem Inhalt (alles aus dem Kasten auswählen und in ein leeres File flow.json kopieren):
Anstelle von {..."command":"gap","args":"-L GAP_WORKSPACE"...} geht auch {..."command":"ssh","args":"localhost gap -L GAP_WORKSPACE"...} recht gut.
Dann im Terminal
node-red flow.json
starten. node-red startet über flow.json selbst das GAP-Programm. Das ist im Terminal zu sehen, wenn dort "gap>" erscheint. Nichts weiter eingeben (ist nur debug-Ausgabe).
Schließlich, bei Verwendung der Buttons "GAP" oder "acos(1/4)", erscheint dort unmittelbar darunter eine Zeile mit der Verbindung über Websocket. Falls das Browserfenster selbst nicht auf dem Raspberry Pi läuft, anstelle localhost die User@IP-Adresse des Raspberry Pi Zero W einsetzen, zum Beispiel pi@192.168.1.100 und dann mit Button "Verbindung herstellen" die neue Verbindung herstellen.
Punkte 1 bis 3 müssen nur einmalig bei einem noch nicht vorbereiteten Raspberry Pi ausgeführt werden, Punkt 4 bei jedem neu Einschalten des Raspberry Pi und Punkt 5 wenn dieses Browserfenster komplett neu geladen wurde.
Dann kann die Berechnung losgehen. Ein Testbeispiel laden, Button "acos(1/4)" anklicken, dann darunter "über Websocket zu GAP schicken". Der Verlauf der Berechnung wird ausgegeben und wieviel Zeilen noch und schließlich das Ergebnis Beweglichkeit=4, Einsetzkanten=7. Dann kann man paar zusätzliche Kanten P3-P8, P4-P85, P70-P96, P64-P95 einsetzen und wieder Buttons "acos(1/4)" und "über Websocket zu GAP schicken".
Klick auf Button "Beschreibung" unter dem Graph rechts neben "Punkte aus/an" erzeugt eine knappe Beschreibung der einzelnen Eingabeschritte. Man kann die Eingabeschritte anklicken, dann wird der Graph auch nur soweit gezeichnet. Nochmal Button "Beschreibung" schaltet alles wieder aus. Beispiel laden, Button "Beschreibung" anklicken, dann darunter beispielsweise die Stelle "L(6,3,4)" anklicken.
Button "Beweis".
Der Button "Beschreibung" kann zu einem Button "Beweis" umfunktioniert werden, indem an das Ende der Eingabe des Streichholzgraphen die Eingabefunktion W(); angefügt wird. Weil das ein extra Feature für die englischen Programmversion ist, verweise ich auf die dortige Beschreibung Button "description of function buttons" in der Zeile "show proof" der Button "click here".
Die Beispiele , und sind schon fertig gerechnet und das Ergebnis der Berechnung mit im großen Eingabefenster gespeichert. Nach dem Anklicken erscheint links neben dem Graph eine Kästchenreihe.
Das unterste hellgraue Kästchen ohne Rahmen schaltet beim Anklicken alle Belastungen und Beweglichkeiten aus, es werden lediglich im Graph verschiedene Loslager dargestellt, welche die im Graph vorhandenen Beweglichkeiten unterbinden. Die quadratischen Kästchen mit zwei Diagonalen "X", einer Diagonale "/" oder keiner Diagonale im Inneren symbolisieren wie in Beitrag No.251 unterschiedliche Bereiche der Einsetzkanten und der Beweglichkeit.
Jedes Loslager verhindert Bewegung senkrecht zur schraffierten Auflage, während Bewegung entlang der schraffierten Auflage weiterhin möglich ist. Die Loslager sind aber so angeordnet, dass insgesamt keine Bewegung mehr möglich ist. Um nun eine bestimmte Bewegung auszulösen, muss man die schraffierte Auflage eines Loslagers senkrecht zu sich selbst etwas verschieben (Drag geht, aber vorsichtig damit die schraffierte Auflage folgen kann, touchmove geht auch). Dann erscheinen Pfeile in der Richtung, in der die Bewegung der Knotenpunkte starten würde. Die weitere Fortsetzung muss aber nicht geradlinig sein. Zum Teil verschieben sich die anderen Loslager parallel zur schraffierten Auflage, was ja erlaubt ist.
Jedes Kästchen mit zwei Diagonalen "X" im Inneren steht für den Bereich einer Einsetzkante (linear abhängige Spalten der Matrix). Nach dem Anklicken des Kästchens werden bestimmte Kanten markiert und das soll bedeuten, wenn die in der Beschriftung des Kästchens angegebene Kante (beispielsweise infolge Temperaturänderung) in Längsrichtung zieht oder drückt, dann entstehen in allen markierten Kanten Belastungen, weil der Graph bereits ohne der einen Kante starr ist und die Längenänderung nicht ausgleichen kann. Die Markierung der Kanten ist ausführlich beschrieben in Abschnitt "Belastung ausrechnen, wenn zwei Knotenpunkte von Außen mit Kraft 1 zusammengedrückt werden"
Kästchen mit einer Diagonale "/" oder keiner Diagonale im Inneren stehen für unterschiedliche Bewegungsvarianten (linear abhängige Zeilen der Matrix). Beim Anklicken wird das mit der Beschriftung des Kästchens bezeichnete Loslager aus seiner ursprünglichen Lage gebracht und dadurch eine Bewegung ermöglicht. Wie schon beschrieben, geben dann die eingezeichneten Pfeile die Tangentialrichtung an, in der die Bewegung der Knotenpunkte starten würde. Die weitere Fortsetzung muss aber nicht geradlinig erfolgen und kann auch ganz unmöglich sein im Falle einer Bewegungsmöglichkeit mit Bewegungsspielraum 0 (falsche Beweglichkeit).
Die drei Kästchen mit einer Diagonale "/" im Inneren symbolisieren die 3 globalen Beweglichkeiten "kompletten Graph horizontal, verikal verschieben und um einen Punkt drehen". Allerdings werden diese Beweglichkeiten vom GAP-Programm nicht in dieser reinen Form zurückgegeben sondern durchmischt mit anderen inneren Bewegungsmöglichkeiten, so dass die Zuordnung der Kästchen mit einer oder keiner inneren Kante noch nicht stimmt. Man kann nur sagen, dass jegliche Bewegung als Linearkombination dieser Kästchen dargestellt werden kann. Da muss ich selber erst noch weiter probieren, ob sich das noch besser auseinanderhalten lässt. Sowas wäre bestimmt hilfreich, wenn in Graphen wie neben dem Grad der Beweglichkeit auch die zugehörigen Bewegungen gefunden werden sollen. Doch in dieser Beschreibung geht es erstmal nur darum, wie man über das GAP-Programm zu den Kästchen kommt.
In diesem Sinne also einen Graph auswählen, Button "acos(1/4)" drücken und dann die darunter aufgeführten Schritte 1. 2. 3. 4. und 5. ausführen, alle Buttons dort der Reihe nach anklicken. Die Aufteilung in diese 5 Schritte ist dafür gedacht,
wenn nur Anzahl der Beweglichkeit gesucht, reicht Schritt 1,
Schritt 2 muss nur einmal je gestarteten GAP ausgeführt werden,
während Schritt 3 kann das Browserfenster geschlossen werden (im Terminal ist zu sehen, wann der Schritt 3 fertig ist, erkennbar am abschließenden "gap>"),
Schritt 4 reicht, wenn irgendwann nach Schritt 3 das Browserfenster neu geöffnet wird und nur das letzte Ergebnis zurückgeholt werden soll.
Schritt 5 um das Rechenergebnis im großen Eingabefenster als xml-Element "Ergebnis" anzufügen. Dann kann die Eingabe irgendwo gespeichert werden und beim nächsten "neu zeichnen" muss GAP nicht nochmal gerechnet werden. Gilt aber nur solange, wie der Graph nicht verändert wird, sonst wieder entfernen.
Umfangreichere Beispiele mit vielen Beweglichkeiten sind , , , und . Schritt 3 dauert seine Zeit, aber es funktioniert.
Zum Ausprobieren obiger Beispiele ist Button "acos(1/4)" besser geeignet als Button "GAP", weil da das Ergebnis nicht durch Runden der Punktkoordinaten verfälscht wird. Auch sollen alle Kanten Länge 1 haben.
Belastung ausrechnen, wenn zwei Knotenpunkte von Außen mit Kraft 1 zusammengedrückt werden.
Einschränkung: Diese Berechnung funktioniert nur für Graphen, wo alle Kanten Länge 1 haben. Für andere Graphen stimmt das ausgegebene Ergebnis nicht. Während der Berechnung müsste die relative Belastung mit Kantenlänge multipliziert werden, doch da würde das Rechnen mit exakten Punktkoordinaten nicht mehr funktionieren. Deshalb diese Berechnung nur bei "alle Kanten gleich (oder fast gleich) 1" verwenden.
weitere Einschränkung: Der Graph muss starr sein. Mit dem Ergebnis für einem beweglichen Graph kann ich nichts anfangen.
Jetzt aber los, beispielsweise den laden, dann entweder Button "GAP" oder, wenn mit exakten Punktkoordinaten gerechnet werden soll, Button "acos(1/4)". Anschließend alle Buttons aus Zeilen "1." "2." und "3." der Reihe nach durchlaufen lassen. Zeilen "4." und "5." und "6." überspringen. In Zeile
7. "P5 und P22 mit Kraft 1 zusammendrücken und die im Graph entstehende Belastung über websocket ausrechnen"
anstelle P5 und P22 zwei Punkte eingeben, welche von außen mit Kraft 1 zusammengedrückt werden sollen. Beim Doppelkite sind das die bereits vorgegebenen P5 und P22. Dann Button "zusammendrücken", das erzeugt darunter den benötigten Programmcode, schließlich Button "über Websocket ausrechnen".
Es wird diejenige Lösung x von Ax=f gesucht, welche orthogonal zu den Basisvektoren der Lösung des homogenen Gleichungssystems Ax=0 ist.
Das Ergebnis wird im Streichholzgraph als zusätzliche Markierung der Kanten dargestellt. Momentan ist diese Markierung ein kurzes Geradenstück durch den Kantenmittelpunkt mit Anstieg=tan(Anstiegswinkel)=Belastung, Anstiegswinkel gemessen bezüglich der betreffenden Kante. Das bedeutet, dieses Geradenstück ist bei Belastung 0 in Kantenrichtung ausgerichtet, bei Belastung 1 im 45° Winkel entgegen Uhrzeigersinn gedreht, bei Belastung -1 im 45° Winkel im Uhrzeigersinn gedreht. Man kann sich so über das Verhältnis von lokaler y-Koordinatendifferenz (senkrecht zur Kante) zur lokalen x-Koordinatendifferenz (in Kantenrichtung) eine ungefähre Vorstellung von der Belastung im Verhältnis zur einwirkenden Kraft machen.
Zusätzlich wird die Belastung einer Kante rechts oben über dem Graph als Text ausgegeben, wenn man diese Kante im Mittelkreis anklickt.
Wenn kein Websocket installiert oder verfügbar ist, dann geht auch wieder direktes Kopieren des Programmcodes ins GAP-Programm. Nach Ende dieses Programmlaufes muss die Programmausgabe von einschließlich "Belastung=" bis einschließlich nächsten ";" zurückkopiert werden und zwar ins große Eingabefenster an das Ende des Inhaltes vom xml-Element "Rechenweg". Das muss vor weiteren Änderungen am Streichholzgraph wieder entfernt werden, sonst bleibt das als nicht mehr passendes Ergebnis stehen. Nachfolgend das Ergebnis für den Doppelkite, zuerst mit Button "GAP" gerechnet
Weitere geeignete Beispiele (Kopie aus der englischen Programmversion). Weil das alles eine komplizierte Eingabe ist, noch paar fertig gerechnete Beispiele: gerechnet mit exakten Punktkoordinaten, gerechnet mit gerundeten Punktkoordinaten, mit gerundeten Punktkordinaten, exakt (Maximallast 2,8 in Mittelkante P18-P40) und gerundet (Maximallast 39 in Kante P12-P7).
Insbesondere wegen Graph möchte ich die Beschreibung der Beweglichkeit noch etwas präzisieren.
Jeder Graph hat die drei Freiheitsgrade Verschiebung horizontal, Verschiebung vertikal sowie Drehung um einen Punkt. Jede andere Verschiebung und Drehung lässt sich als Linearkombination dieser drei Bewegungen darstellen. Diese sollen außer acht gelassen werden, wenn von der Beweglichkeit eines Graphen die Rede ist. Ein starrer Graph hat keine weiteren Freiheitsgrade und Beweglichkeiten. In der Programmausgabe der Anzahl der Freiheitsgrade ist das als 3+x kenntlich gemacht.
Wird an einen starren Graph an einen Punkt P4 über eine neue Kante ein Punkt P6 angefügt und an diesen über eine weitere neue Kante ein Punkt P7, so hat dieser Punkt P7 zwei Freiheitsgrade und der Punkt ist auch frei beweglich, jede Bewegungsrichtung lässt sich als Linearkombination der Änderung der Kantenwinkel darstellen. Das hatte ich bisher im Thread als zweifache Beweglichkeit des Graphen bezeichnet.
Bei weiteren mehr oder wenig unabhängig voneinander beweglichen Punkten ergibt das dann drei-, vier-, fünffache Beweglichkeit und mehr. Ideale Beispiele hiefür sind die Graphen , da können alle Winkel unabhängig voneinander beliebig verstellt werden. Ein ähnliches Beispiel ist ein mehrachsiger Roboterarm, dieser ist entsprechend mehrfach beweglich und jede Achse kann unabhängig von den anderen verstellt werden.
Wenn die Bewegung des Punktes P7 durch zusätzliche Kanten wieder auf eine eindimensionale Linie eingeschränkt wird, dann hat dieser Punkt nur noch einen Freiheitsgrad. Im Thread ist das bei etlichen Graphen als einfache Beweglichkeit bezeichnet. Das GAP-Programm liefert als Ergebnis diesen einen Freiheitsgrad sowie die Tangentialrichtung der Bewegung entlang der Linie.
Nun ist der Fall denkbar, dass sich zwei veschiedene Bewegungslinien eines Punktes überkreuzen und der Punkt dort von der einen Bewegungslinie in die andere wechseln kann. Genau an der Kreuzungsstelle hat der Punkt wieder zwei Freiheitsgrade. Doch der Punkt wäre nur in Richtung der Bewegungslinien beweglich und nicht in beliebiger Linearkombination dieser beiden Richtungen. Das lässt sich noch erweitern, wenn sich in einem Punkt drei Bewegungslinien kreuzen, dann kann dort der gesamte Graph drei Freiheitsgrade haben, aber nicht beliebige sondern nur drei ganz bestimmte Linearkombinationen sind möglich. So etwas bezeichne ich jetzt als "drei Bewegungsmöglichkeiten" im Unterschied zum bisher verwendeten "dreifache Beweglichkeit" für beliebige Linearkombinationen dreier Freiheitsgrade. Das ist leicht zu verwechseln, die Bezeichnung "n-fach beweglich" hatte ich in Unkenntnis anfangs ungünstig gewählt und was besseres fällt mir auch nicht ein.
Jetzt zum Graph . Da ist dieser Fall aufgetreten. Die Ausgangsstellung in Beitrag No.814 hat 3 Freiheitsgrade, aber nicht dreifache Beweglichkeit (beliebige Linearkombinationen dreier Grundbewegungen) sondern vier Bewegungsmöglichkeiten (vier sich überschneidende Bewegungslinien). Drei Bewegungslinien sind schon im Thread beschrieben, die vierte ist die gespiegelte Version der einen unsymmetrischen Variante.
Solange daran nichts auszusetzen ist, ergibt sich folgender Ablauf: Das GAP-Programm liefert eine bestimmte Anzahl Freiheitsgrade sowie dazugehörige Grundbewegungen. Dann muss man feststellen, welche Linearkombinationen dieser Grundbewegungen tatsächliche Bewegungsmöglichkeiten ergeben. Entweder alle, dann ist der Graph n-fach beweglich, oder es gibt nur ganz bestimmte einzelne Bewegungsmöglichkeiten oder keine oder von jeder Variante etwas.
Zu diesem Ablauf passt dann auch diese ("falsche") Beweglichkeit. Das GAP-Programm erkennt in der statisch nicht bestimmten Anordnung einen Freiheitsgrad, die anschließende Untersuchung der einzigen Linearkombination ergibt aber "keine Bewegungsmöglichkeit".
Wenn mit Button "GAP" und gerundeten Punktkoordinaten gerechet werden muss weil der Graph für Button "acos(1/4)" nicht geeignet ist, dann geht durch das Runden möglicherweise Beweglichkeit verloren. Da war der bisherige Ablauf so, dass diejenigen Kanten, die dann die Beweglichkeit verhindern, bei entsprechender Krafteinwirkung an großer Belastung erkennbar sein sollten, in der Größenordnung vom Kehrwert des Rundungsfehlers. Das entspricht großen Koeffizienten der inversen Matrix. In der jetzigen Programmversion habe ich beim Ergebnis zurücksenden eine solche Ausgabe "MaxInvAij=..." ergänzt sowie die dazugehörige Kante. Wenn dieses "MaxInvAij" sehr groß ist, Richtwert millionenfache Belastung, dann soll diese Kante entfernt und der Rechenablauf unter Button "GAP" wiederholt werden. Das solange wiederholen bis "MaxInvAij=..." normale Werte annimmt, bis 10 oder durchaus auch mal 100 oder mehr. Der übriggebliebene Graph ist höchstwahrscheinlich beweglich und muss dann geometrisch daraufhin untersucht werden, ob sich die entfernten Kanten wieder genau passend einsetzen lassen und ob dabei die Beweglichkeit erhalten bleibt oder nicht. Als Testbeispiel habe ich vorbereitet, etwas gedreht, damit wirklich Punktkoordinaten gerundet werden. Der Rechenablauf unter Button "GAP" liefert als Ergebnis statisch bestimmt (Freiheitsgrade=3+0) und 1 Einsetzkante. Wegen "MaxInvAij>1000000" soll nun aber Kante P12-P17 entfernt werden und nach nochmaligem Rechenablauf unter Button "GAP" auch noch Kante P34-P39. Übrig bleibt der bewegliche Graph . Die zugehörige Animation macht deutlich, egal in welche Richtung der blaue Winkel variiert wird, die (neu durchnummerierten) Abstände P10-P26 und P25-P31 werden nur kürzer. Das ist wieder so ein Grenzfall "statisch nicht bestimmt aber Bewegungsspielraum 0" wie schon bei . Exaktes Ergebnis mit Rechenablauf unter Button "acos(1/4)" ist mit Freiheitsgrade=3+1, also statisch nicht bestimmt (Bewegungsspielraum 0 muss auch hier geometrisch gefunden werden) und 2 Einsetzkanten.
Bei Button "acos(1/4)" wird "MaxInvAij" mit berechnet, aber nicht als Ergebnis ausgegeben, weil auch bei eventuell recht großem "MaxInvAij" keine Kante entfernt werden muss, denn die Freiheitsgrade und die Einsetzkanten stimmen schon exakt.
Die Buttons "GAP" und "acos(1/4)" liefern nicht in jedem Detail übereinstimmende Ergebnisse, weil die Loslager unterschiedlich angeordnet und orientiert sein können.
Das .dxf-File mit einem Text-Editor öffnen und den gesamten Inhalt ins große Eingabefenster kopieren, zum Beispiel . Maßgebend für den weiteren Ablauf sind die Schlüsselwörter SECTION, ENTITIES und LINE.
Nach Button "neu zeichnen" werden alle LINEs innerhalb der SECTION ENTITIES in entsprechende Eingaben zum Streichholzprogramm umgewandelt.
Diese Eingabe enthält möglicherweise noch Zusatzlinien für Rahmen und ähnliches. Diese müssen von Hand entfernt werden.
Dann mit Button "Knoten zusammenfassen" nahe (aktuell 0.0001*D in gleichnamiger function) beieinanderliegende Knoten zusammenfassen.
Vergrößern und Verschieben geht an der Stelle (noch) nicht, erst mit Button "neue Eingabe, egal wie" eine neue Eingabe erzeugen.
Jetzt gehen Buttons zum Vergrößern und Verschieben.
Die Eingabefunktion RK([k,l1,l2,l3...],[i,j1,j2,j3...],w) erzeugt in einem einzigen Schritt mehrere Eingaben RW(k,l1,i,j1,w), RW(k,l1,i,j2,w),RW(k,l1,i,j3,w)... sowie RW(k,l1,i,j1,w), RW(k,l2,i,j1,w), RW(k,l3,i,j1,w)... als Bedingungen für anschließende Anwendung von Button "Feinjustieren(.)". Im Ergebnis sollen dann alle Punkte [k,l1,l2,l3...] auf einer (Halb-)Geraden liegen und alle Punkte [i,j1,j2,j3...] auf einer zweiten (Halb-)Geraden und diese schließen einen Winkel w°=360/(2n) ein, gemessen entgegen Uhrzeigersinn von der zweiten zur ersten (Halb-)Gerade.
Anschließend kann mit Button "Kaleidoskop" der Graph geschlossen werden wie bei einem Kaleidoskop, welches mit seinen Spiegelflächen an den beiden Geraden angelegt wird.
Eine Besonderheit bei der Eingabe: Die Punktnummern i,j,k,l... können auch mit Vorzeichen Minus eingegeben werden. Das bedeutet, der betreffende Punkt soll nicht auf der späteren (Halb-)Gerade liegen sondern im Inneren des Winkels w° im Abstand einer halben Kantenlänge von dieser Gerade entfernt.
Die Punkte i und k sollen jeweils die äußeren Punkte in dem späteren Graph sein, die Reihenfolge der anderen Punkte ist beliebig, wobei nicht unbedingt alle Varianten funktionieren.
Die Checkbox vor Button "Kaleidoskop" aktiviert diesen Funktion dauerhaft, ebenso ein viertes Argument true in RK([k,l1,l2,l3...],[i,j1,j2,j3...],w,true)
verschiedene Eingabebeispiele (Beispiel wählen, dann unter dem Graph Button "Feinjustieren(.)" drücken und dann Button "Kaleidoskop"):
(bei Fig.4a gleich "Kaleidoskop" drücken)
nächster Knoten ist P. Fenstergröße Zeichen, mit Enter umstellen.
mit animate value="0;5;0;-5;0" dur="5",
mit Worker,
gerundet,
mit BigInt rechnen.
Fontsize: %, mit Enter umstellen.
D ist die (einstellbare) Einheitslänge 1.
Der Punkt Pk ist immer der neu hinzukommende Punkt.
Pk wird so plaziert, dass der Weg von Pk über Pi nach Pj eine Linkskurve ist.
L(k,i,j) erzeugt Pk so, dass Pk, Pi, Pj ein gleichseitiges Dreieck bilden.
N(k,i,j) erzeugt Pk so, dass die Strecken Pk,Pi und Pk,Pj beide Länge 1 haben.
N(k,i,j,h) wenn Pk auf der anderen Seite von Pi-Pj liegen soll wie Ph
N(k,i,[j,g]) oder N(k,i,[g,j]) zeichnet Kante Pi-Pk mit Pk auf Gerade durch Pj und Pg.
Q(k,i,j,a*D,b*D) erzeugt Pk so, dass Strecke Pk,Pi Länge a hat und Pk,Pj Länge b, statt a*D bzw. b*D geht auch ab(l,m) für |Pl,Pm|
H(k,i,j,a) erzeugt Pk so, dass Pk auf 1/a der Strecke von Pi nach Pj liegt.
M(k,i,j,w) erzeugt Pk so, dass die Strecken Pi,Pj und Pi,Pk einen Winkel w° einschließen.
A(i,j) ergänzt ein noch fehlendes Streichholz zwischen schon vorhandenen Pi und Pj oder entfernt es, falls schon vorhanden.
Zum Entfernen besser Z(i,j) verwenden. Z(i,j) entfernt Kante von Pi nach Pj.
Nur Z(i) entfernt Punkt Pi und alle von Pi ausgehenden Kanten auf einmal.
C(i,j,k,l,...) fasst Knoten Pi,Pj,Pk,Pl... zu einem einzigen Knoten Pi zusammen.
R(i,j) wählt Abstand |Pi-Pj| zum Feinjustieren auf nächstgelegene ganze Zahl. Eingabe geht auch, bevor Pi, Pj eingegeben sind.
R(i,j,"Webfarbe") wählt dazu eine gewünschte Linienfarbe.
R(i,j,"",a*D) verwendet Abstand a beim Feinjustieren von Pi-Pj anstatt die nächstgelegene ganze Zahl.
RA(i,j) ist Abkürzung für Eingabe A(i,j); R(i,j);
RW(k,i,j,h,w) justiert anstelle eines Abstandes den Winkel zwischen den Vektoren Pj-Ph und Pk-Pi auf w°.
RK([k,l...],[i,j...],w) Vorbereitung für Button "Kaleidoskop": w°=Sollwinkel von Gerade [i,j...] zu Gerade [k,l...], i,k=Außenpunkte, negativer Index=Abstand 1/2 zur Gerade.
Button "Feinjustieren(n)" versucht alle Winkel so zu justieren, dass die ersten n Maße R(j,k...) oder RW(...) eingestellt werden.
M(k,i,j,w,n1,w1,n2,w2,n3,w3...) setzt M(k,i,j,w) fort zu einem Rahmen mit n1,n2,n3... Außenkanten, dazwischen Winkel w1,w2,w3...
M(....w,n,"zumachen",i,j,k) schließt den Rahmen bis Punkt Pi mit zwei Rahmenstücken zu je j und k Außenkanten.
Rahmen(n1,n2,n3...) erzeugt einen Rahmen mit Außenkanten der Länge n1, n2, n3, ...
Fortsetzen() unmittelbar nach Rahmen(...) füllt schon etwas das Innere des Graphen, siehe Beitrag No.2068
Fortsetzen(i,j,k...) fügt an den 2-er Rahmenstücken mit Außenkanten-Mittelpunkt i,j,k... keine Dreiecke an sondern Rauten
Bei gedrückter Shift-Taste: Jede Kursorbewegung von Pi nach Pj erzeugt L(k,i,j) oder, falls Pi,Pj nicht verbunden, ein N(k,i,j).
Bei gedrückter Ctrl-Taste: Kursorbewegung von Pi nach Pj erzeugt A(i,j). Pj=Pi nehmen, wenn Pi versehentlich angesteuert.
Für Touch-screen stehen oben Ersatztasten Shift und Ctrl, dann Pi, Pj antippen.
Die Eingabe kann aus erzeugtem fedgeo- oder tikz-Quelltext zurückgewonnen werden (Abschnitt zwischen "Eingabe war:" und "Ende der Eingabe, weiter mit..."),
fedgeo-Kommentarzeichen "#" und tikz-Kommentarzeichen "%" am Zeilenanfang werden automatisch entfernt, alles nach "//" bis Zeilenende bleibt Javascript Kommentar.
neu: Button neue Eingabe "wenige N()" verwendet N(k,i,j) nur, wenn Abstand |Pi-Pj| kleiner 1.2, einstellbar unter Button "ausführlich..."
Button neue Eingabe "wenig Winkel" generiert eine neue Eingabe mit möglichst wenig Einstellwinkel, minimale Anzahl wird nicht unbedingt erreicht.
Button neue Eingabe "Rahmen zuerst" generiert eine neue Eingabe von außen nach innen.
neu: Button "Vergleichen" erzeugt am Seitenende einen Code, der bei verschiedenen Graphen gleich ist, falls es Eingaben gibt, die sich nur in Winkelgrößen und Kantenlängen unterscheiden,, Beitrag No.2476.
Leertaste oder Enter im Eingabefeld zeichnet die Grafik neu.
Nächstfolgende Punktnummer steht unter dem Eingabefenster.
Die Kanten sind mit einem Mittelkreis gezeichnet, Klick darauf bringt Endpunkte Pi,Pj in den Vordergrund und misst deren Abstand.
ab(i,j,k,l,[m,n],...) zeichnet anstelle Kante ab(i,j) eine Kopie vom Teilgraph Pi,Pj,Pk,Pl,Pm...Pn,...,
ab(..."gespiegelt") für gespiegelte Kopie, ab(..."gedreht") für gedrehten Teilgraph, ab(..."zusammengefasst") mit Zusammenfassen naher Knoten.
A(i,j,ab(k,l,...)) verbindet Pi,Pj durch Kopie vom Teilgraph ab(k,l,...), plaziert Pk auf Pi und Pl auf Pj
Bew(n) in A(i,j,Bew(n)) oder A(i,j,ab(...),Bew(n)) bezeichnet den Beweisschritt n mit Bedeutung siehe Button "Programmgliederung"+"Beweisschritte".
W() setzt das Beweisendezeichen unter den Beweis. Nur eingeben, wenn der Beweis ok ist, sonst besser entfernen.
jam(x) bezeichnet eine vom Programm erzeugte Kantenlänge, die mit dem Ziehfaktor schrittweise zu 1 gemacht wird, jum(x) ebenfalls.
Kites(x,y) platziert auf Position x,y Kopiervorlagen, mit Kites() werden diese wieder entfernt (schnelle Eingabe für nur kurzzeitig verwendete Graphen, weil sich die Kopiervorlagen ändern können).
Buttons "-1" "-0.1"..."+1" ändern das vorher angeklickte "blauerWinkel=" oder "gruenerWinkel=" oder...
"Implementwinkel(1,2,3, )=60°" misst Winkel von P3 über P2 nach P1. Zusätzlich P4 misst Winkel zwischen Vektoren P3-P4 und P1-P2. Nur P1, P2 misst Winkel bezüglich x-Achse. Daneben Abstandsmesser.
neu:
und aktuelle Testbeispiele (funktionieren nicht immer):
Graphen, die in der Beschreibung verwendet werden:
Anklicken eines Gliederungspunktes zeigt den zugehörigen Programmcode (unten am Seitenende).
Worker Variablen
globale Variablen, Berechnung von Abstand und Winkel
Zeichenfunktionen
Eingabefunktionen L, M, N, Q, H, A, R
Buttons "Dreiecke", "Rauten", "Eistüten", "Dächer" für Rahmen
ok neue Version starten für Bereiche von Einsetzkanten bestimmen
ok die Zeile "einzustellende Kanten" nur wenn welche da
ok andererseits fehlen die "einzustellende Kanten" in Graph #... ok müssen ja als RA() eigegeben werden
ok GRAPH Ergebnis von Button "acos(1/4)" ok ist wieder da, war ein i+1 nötig
ok bei Einsetzkanten Checkbox "ohne Eingabe war." sonst wird das zuviel für tikz
ok neue Eingabe mit selbstgewählten Anfangspunkten
ok Button "GAP" und "acos(1/4)" Ergebnis mit Kantenangabe Pi-Pj,
ok Einsetzkante hervorheben, ok breiter und dunkler.
ok umschaltbar ob gestrichelt oder durchgehend, ok erstmal nur anhand mit_Button_gerechnet="GAP"
ok bei blauerWinkel=Interpoliere(t,0); "tikz" mit "zurück_mit_aktuellen_Winkeln" und dann "weiter mit t"
ok Button "wenige N()"
ok Button "mehr" geht nicht bei #2414, ok ziemlich neu jetzt
ok Button beweglich bei der Dreifachetage, nein, nur "egal wie" und nicht "wenig Winkel"
ok #780-2 nach "egal wie" und "viele Winkel" 2-fach beweglich, nach "wenig Winkel" nur 1-fach, nein, nur "egal wie"
ok aha beim 4/11 nach "wenig Winkel" keine Veränderung, nein, nur "egal wie"
ok Testbeispiele löschen, nur die in der Beschreibung verwendeten drin lassen
ok .dxf wieder in Gang bringen, auch .dwg oder anderes aus https://www.xsim.info/articles/FreeCAD/en-US/HowTo/Supported-file-formats.html
ok zweimal "Verzweigungen" drücken stimmt nicht, ok Anfangsgraph merken
ok die \draw dash on off in einem \foreach zusammenfassen
ok Graphs die in der Beschreibung verwendet werden neu machen
ok von #755 ausgehend alle 4 Bewegungsvarianten finden, von #2408 aus 8, ok Button "Verzweigungen"
ok ddf zusätzlich mit ddw berechnen
ok bei "dw, ddw" nur "extrapolieren" von t=-1 bis t=1, gehen tut nur von t=-8 bis t=5
.. Summe der Belastungen
.. "wenige Winkel" neu wegen gestrecktem N(k,i,j);
.. "max bij" genauer bis x-fach beweglich
.. "beweglich?" geht nicht wenn keine R(i,j) oder RA(i,j) drin
.. bei "beweglich?" wieder von t=0 bis t=0 eintragen oder ob es überhaupt geht
.. zu "extrapolieren" ein "beenden links/rechts" um vorzeitig zum t= zu gelangen
.. Example Feinjustieren mit Nullstab #2415b
.. !!!bei acos(1/4) Einsetzkanten wählbar machen
.. ws/gap2 wieder aktivieren
.. Bereiche in Graphen umwandeln
.. GRAPH Doppelkite+viele Winkel+Feinjustieren da die Einsetzkanten
.. #780-2 acos(1/4) machbar mach
.. später dann noch Einsetzkanten mit Button Kaleidoskop machen
.. bessere Annäherung paralleler Kanten
.. bei "beweglich?" ein Hinweis, daß Eingabe möglicherweise nicht alle Bewegungen zulässt.
.. manche ä ö ü in UTF-8 umwandeln
.. gesamte Seite auswählen geht auf dem Tablet nicht
.. in W_Tab nur mod 30° speichern und dann in 30°-Schritten abtasten.
.. "Feinjustieren" wenn nicht geht, mit R(i,j,"green",0.7*D) wiederholen, dann 0.8*D, 0.9*D und 1*D.
.. scheint zu gehen: "extrapolieren", ein t= wählen, "zurück mit aktuellen Winkeln", "Ableitungsmatrix", MaxAij, "weiter mit t="
.. den Federkraftmesser in tikz hinein mit machen
.. die Tippf. in 2437.txt
.. t-tabelle als table mit MaxAij
.. Button "Start_t" im Text.
.. mehrere Grapen auf einmal laden
.. wenige Winkel bei #2400 4-fach beweglich
.. Feinjustieren ohne den zuletzt verstellten oder auch ohne den markierten Winkel
.. "wenige Winkel" und "beweglich?" bei #2329 endet mit gA=
.. #2442-5 und 6 da endet "extrapolieren" mit Error
.. RW(69,67,32,33,0); RW(21,15,52,53,0); am Ende von #2442-0
.. "wenige Winkel" bei #2408R gestreckt geht nicht
.. "zurück" auch bei einfachen Änderungen, aufgesammelt
.. Checkbox Ausrichten schwimmt davon
.. das Stab2 Beispiel auch mit rechnen
.. requestAnimationFrame noch weiter einsetzen
.. die Bereiche linearkombinieren um alle anderen Bereiche zu erzeugen
.. #2442 "wenige N()"+"Verzweigungen"+"0" ist 2-fach beweglich
.. bei "GAP" gestrichelte Linien
.. bei "GAP" Checkbox für Einsetzkanten hervorheben mit draw-width=3.
.. bei "GAP" Logfile("");
.. #814-1 "egal wie"+"Verzweigen"+"1" ist 3-fach beweglich und "0"="2".
.. vivaldi: {$\sin(\alpha)$}
.. download Seite 61 und 62
.. #1902 "wenige Winkel" "Verzweigungen" gibt nur "0" aus.
.. nach "extrapolieren" Stroboskop-Darstellung, mit TikZ
ok 5 Rahmen() auch mit Einersegmenten
ok 4 Checkbox Überschneidungen zulassen bei "extrapolieren"
ok 3 ET.ws rückgängig machen zu ET.s und dafür "Feinjustieren" vor Button "beweglich?"
ok 2 mehr als die 156 Webfarben
ok 1 Kaleidoskop geht auch mit Punkt in der Spitze
ok die Kästchen noch in der Beschreibung ergänzen ok
ok diese ZuTu-Liste an den Anfang von Streichholzgraph-981.htm machen
ok Index von DD, Belastung, Beweglichkeit bei 1 beginnen lassen, doch nur nach //
ok DD sichtbar machen durch Stützen und so, ok Loslager sind es geworden
ok dies noch in der Beschreibung ergänzen
ok und noch ein graues Kästchen ohne Rahmen für "alle Bewegungen aus"
ok Ergebnis ins Eingabefenster zurückschreiben, mit Buttons "hinzufügen", "entfernen"
ok gedrückte Buttons wieder markieren
ok daemon-Fehler bei restart ok hab neues daemon von 0.0.15 auf 0.0.h
nö Button "Matrix aufstellen" nö
nö und in Tabelle anordnen nö, lass ich so
nö mit Checksum beim Ergebnis zurückschreiben, nö, erst wenn unbedingt gebraucht
ok schattierte Loslager ok das nicht, aber die Verlängerungslinie ok
ok Loslager als Schieber zum Kombinieren ok touchmove geht
nö die Normierung doch wieder so machen, dass 1 und 2 zusammen die Verschiebung ergibt
ok Beschriftung der Kästchen mit "P1-P2" und "P70 h", wg.#755 P70
ok dazu noch Beschreibung aktualisieren und Farbe nochmal einstellen
ok barray zurücksetzen wo nötig, Graph verschieben geht deswegen auch nicht.
ok Markierung der Belastungen zusätzlich mit arc
ok #755 hat wohl nur 4 Bewegungslinien (Feinjustieren blau=31, sonst 28 oder 31.5)
ok Rückgabe Ergebnis als x_m_l-Element
ok und Abschnitt "aktuelle Zusammenfassung zur Beweglichkeit"
ok Beweglichkeit aus den gerundeten Koordinaten herausbestimmen.
nö dazu doch nochmal max(bij)/min(bij) nutzen statt nur max(bij) nö bringt nichts
ok warum bei Bewegl2. MaxInvAij groß obwohl beweglich, ok P4-P6-P9 nicht auf 1 Linie
ok Button "GAP"+"zusammendrücken" geht nicht mehr, ok geht wieder
ok ein "gerechnet_mit_Button:=GAP" und das auch ins Ergebnis
nö außerdem war da irgendwo noch ein Fehler drin, bloß was, nö
nö wenn gerechnet, geht neu zeichnen nicht? nö
ok bei F1x=1 auch die Belastung minimieren, so wie beim Knoten zusammendrücken
ok Variablen Belastung und Belastungsarray gegenseitig löschen oder umbenennen
ok wenn Belastung P7-P6=1 angezeigt und dann anderes Kästchen, muss P7-P6 wieder weg
.. wenn neue Kante und überhaupt Graph geändert, dann Kästchen weg. also doch Checksum
.. Zusatzbelastungen auch aufheben wenn gewünscht.
.. auch bei den Einsetzkanten die Belastung minimieren.
.. statt P7-P6 besser F(P7-P6)=1 und statt P6-v sowas wie P6->v
.. ein Ergebnis-x_m_l-Element auch bei der GAP-Rückgabe
.. äußere und Auflagekräfte auch mit svg-Elementen darstellen
.. tikzpicture auch aktuell machen
.. den Ruckelfehler bei der Animation, wo erst nochmal die SVG angetippt werden muss
.. ruckelt erst nach touch-Loslassen
.. nur in dem einen Browser
.. mal sehen, wenn ich den event wegmach, ob dann was anders ist.
.. globale Beweglichkeiten kombinieren aus zugehörigen Verschiebungen der Loslager.
.. und diese globalen Beweglichkeiten aus der Lösungsmenge herausrechnen
.. Beweglichkeit neu aus inneren Freiheitsgraden bestimmen als mögliche LK.
.. -xxx.htm Versionen aussortieren und neu anordnen
.. Linkliste auf Forumbeiträge, 19-27 ok, 18,
.. Versionen zurückladen und als Tags markieren,
.. auch die letzen Upload-Tags nochmal, als extra Strang mit merge ohne commit.
o. bei Fig.2hLE+ zieht die Auflage in die verkehrte Richtung. Aha, gedrehte Lager.
.. zwischen doc und svg noch ein zwischen_x_m_l oder das als Ergebnis mit, ja wohl das
-- Button "neue Eingabe, wenig Winkel" weitermachen
-- das Stützen ersetzen in INVERT() in einem Schritt ausführen
-- Eingaben aus Thread auslesen
-- fal. Beweglichkeit
-- Wurzel aus Wurzel
-- aus größerem Bereich zurechtziehen
-- Checkliste über alle Funktionen
-- Hinzufügen Nullzeilen und -spalten wegmachen
-- Group(W60,Wbl); ob damit was zu machen geht, Enumerator geht nicht.
-- Eingaben wie A(i,j) alle als erstes in xml umwandeln
ok ROT2-Kanten etwas absetzen durch "passt nicht mehr:"
ok bei Button "neue Eingabe, wenig Winkel" aus A(...,ab(...)) nur ein R machen.
ok die anderen als Kommentar "//oder auch R(...)"
.. besser noch: dafür die geeignetste Kante heraussuchen.
ok Ausweg, wenn Kante vor Punkt eingegeben wird, bei Button "Beschreibung".
ok in Button "neue Eingabe, wenig Winkel" die jam-Kanten mit rein.
.. Buttons "zurück" gehen momentan nicht
.. Verschieben wenn Anfang nicht P1P2 ging mal nicht
.. Liste der A-Kanten anklickbar machen
.. bei "neue Eingabe, Rahmen zuerst" die R(...,jam...) zuletzt hin
.. var Liste=document.getElementById("Abstaende").getElementsByTagName("text") global
.. veränderte Hintergrundfarbe wenn Eingabe geändert und noch nicht neu gezeichnet
.. dann Buttons "#..." ohne "neu zeichnen"
ok #1376 und ein Versuch zum dauerhaft Ausrichten
.. #1477 warum Feinjustieren(3) nicht geht
ok Winkelpunktreihenfolge richtig machen
ok Button "zurück" wenn ein oder mehrere Graphen reinkopiert
o. Punktbezeichnungen in 60°-Winkel setzen
ok Dreiecke zählen und im Hintergrund zeichnen
.. bei Feinjustieren RW Wechsel von -180° zu 180°
ok in Implementwinkel(k,i,j,l) atan2 statt acos
ok einstellbarer Abstand was nahe Knoten sind.
.. k_u_a noch auf nahe Kanten erweitern
ok nur zusammenfallende Punkte wie in #1588 zählen auch als Überschneidung
ok VE50=50 für UNDO-Tiefe
ok bei Randpunkte bestimmen auch Anfangsbezugspunkt>0
ok Klickwinkel in SVG markieren, auch in SVG anklickbar
ok Ausschalten der Hilfslinien
ok Flächenbestimmung nur in Button "Flächen" bei 0 oder 0? Überschneidungen
ok +($1*(x,y)$) statt +(x,y) in Button "TikZ"
ok TikZ shift funktioniert nicht mit (p-i) Koordinaten
ok .dxf mit LWPOLYLINE nach Button "Flächen"
ok LWPOLYLINE mit AcDbPolyline
.. das xmlns="" im geklonten animate geht nicht weg
ok beliebiges ns1 statt xlink geht nicht, doch, wegen getAttributeNS schon. ok
ok zu Button "Ausrichten" auch ein xml-Element und eine Checkbox.
.. dabei Mitte zwischen Pi und Pj unverändert beibehalten
ok wenn Pi oder Pj nicht vorhanden, "Ausrichten" ignorieren
.. die Checkbox noch irgendwie beschriften
.. zu Button "-10" statt Checkbox ein Radiobutton, und den auch beschriften
ok Winkelalgorithmus1 um mehrere Winkel auf einmal zu verstellen
ok wenn bei "-10" kein Winkel ausgewählt ist, den ersten Winkel auswählen
ok in animate geht jetzt neben xlink:href auch nur href, beides mit oder ohne xmlns
ok alle animate ohne xmlns beim Laden auf mit xmlns umwandeln und zurückspeichern
ok auch bei Button "mehr" und bei allen gespeicherten Graphen
ok bei Feinjustieren Anzahl="0" muss ein if (s>0) rein
:: die Polynome bestimmen
:: die Isomorphismen bestimmen
:: restriktiveres xml
.. bei Einpassen, Drehen, Verschieben kann event raus?
.. Einpassen Vergrößern auch für frühere Graphen machen, die mit D=50...
.. tikz_code auch für P-i ???
.. Feinjustieren auf mehr Kanten als Winkel ausdehnen
.. dazu auch neue Eingabe "viele Winkel"
.. bei Button neue Eingabe auch alle Winkel größer Null machen.
.. neue Eingabe "wenig Winkel" auch für GAP
.. s und ws einstellen mit Feinjustieren(s,ws)
.. Gedacht ist es für sws? Nein, beim 52 nicht!
ok zurück(n)
ok zwölfterWinkel in zwoelfterWinkel
ok mit Alt-Taste Z machen,
ok das Q nach innen bei #1892ew und "Rahmen zuerst"
ok "Rahmen zuerst" der nach-Innen-Knick Fehler in #1910-5
ok "egal wie" auch nach Z(1) oder Z(2)
ok Bei neuer Eingabe vorherige Ausrichtung übernehmen
ok #1892ew "wenig Winkel" geht nicht, ok ist repariert if (...==1)
ok Überschreitung des Zahlenbereichs vermeiden
ok bei Z auch die R mit löschen
ok Ausrichten mit ueber="100,100"
ok "Ausrichten" verschiebt nicht mehr wegen ueber="..."
ok dauerhaft ausrichten nicht bei P1-P2
ok bei Button "mehr Winkel" keine schon vorhandenen hinzufügen ok
ok Ausrichten ignorieren wenn nur geringfügig
ok Beschreibung in einem scroll-Fenster
ok #1913-3 nach oben um 50 verschieben ergibt unpassende, ok gefunden in "egal wie"
ok #1912a und #1913-3 ausrichten entlang P9-P5 ist ungenau, ok gleiche Ursache
ok in "Rahmen zuerst" auch noch rausmachen, ab(j,k)<0.99*(ab(i,j)+ab(i,k))
ok und in "wenig Winkel" auch ok
ok #1913-3 + "Kanten einsetzen" + "Rahmen zuerst" ok, Unterstreichen war zu weit unten
ok nach #1913-3 "Kanten einsetzen" bei "wenig Winkel" Stelle nicht programmiert, ok
ok alles auch mit ab(j,k)>0.01*(ab(i,j)+ab(i,k))
ok #1905 bei "egal wie" wird zusätzlich if (KL.length>1) gebraucht ok
ok Zurückstellbutton nach "Newtonpolynom", ok "zurück mit aktuellen Winkeln"
ok Newtonpolynom gleich automatisch in Rechenweg hineinkopieren
ok nur noch stückweise Newtonpolynom, das bis Überschneidung, ROT2, Error, Stoppzeit
ok animate aktualisieren, additive="replace"
ok mittig interpolieren ok mit nh
ok Fehlerausgabe alert ausschalten beim Extrapolieren
ok Feinjustieren nur bei ROT2.length>0, vorher los()
ok enum=10, inum=10 geht nicht beim #1768f, inzwischen doch
ok bei "beweglich?" den größten Linearfaktor auswählen, oder den unterstrichenen?
ok jmax und wmax aufsammeln und ausgeben
ok beim anpassen neu-0.01 darf jmax nicht wechseln
ok Feinjustieren auf nicht nur das letzte s erweitern ok mit Tauschen der Winkel
ok als beweglichen Winkel dann t nehmen
ok von Anfang an t dabei, später dann
ok erst nach Button "beweglich?" t hinzufügen, auch animate
ok extrapolieren schrittweise sichtbar machen mit setTimeout
nö Zwischenausgabe auf t=n umstellen nö, alle Winkel
ok extrapolieren anhalten
ok Grund ausführlich ausgeben
ok Testliste:
ok #1768o140°, ok wechselt von jmax=1 auf jmax=5 und zurück
ok #1902_, ok geht so
ok #1768o180°(jmax wechselt innerhalb while) ok neu+0.01 ohne if
ok #1768d
ok #1768e gruenerWinkel ans Ende und da flackert was, weniger bei inum=4 statt 10
ok Button "besser annähern"
ok noch_weiter_extrapolieren(} geht ganz langsam los? ok if (ET.i=0) ...los();
ok dazu erstmal die inneren Kanten heraussuchen
ok dann immer eine Kante entfernen und "Rahmen zuerst" und "beweglich?"
ok manche "Rahmen_zuerst" gehen nicht für k<12, ok behelfsmäẞig repariert
ok aha bei Start knum=11 geht knum=13 nicht weil nicht aktueller_Index=0
ok knum=0 geht nicht weil NPUNKT[WINK[0][1]]==999
ok aktuelles Z(i,j) mit ausgeben
ok als Endergebnis die Minimallösung zurückgeben
ok bessere Ausgabe bei Button "besser annähern"
ok bei von t=0(?) bis t=0(?) die (?) zurücksetzen nach knum+1
ok Leerzeile zwischen die Zwischenlösungen
ok NaN auch als ERROR beim Feinjustieren
ok bei den 10000 Schritten t=0 mit dabeimachen ok t=tmin+r/100;
ok beide Abbruchbedingungen t<0 t>0 etwas stehenlassen 0,8 sek
ok tcode2 in der Form am, ohne [i,j], t=..., mit [k,l]
ok beim Extrapolieren die nicht passenden Abstände mit zeichnen
ok mit längenabhängiger Farbe ok function Kantenfarbe(i,j)
nö diese auch in draw() verwenden, nö weil "black2 für ROT2 verwendet wird
ok nur Zwischenlösungen mit fast passender Kante, also gleich Feinjustieren()
ok Zwischenlösungen auch gleich zurechtziehen
ok Graph zusammengestellt
ok bis Feinjustieren
ok Array Zwischenloesungen
ok Aussortieren die nicht auf 1 gehen
ok Minimum markieren und merken
ok das Minimum nach Feinjustieren nochmal bestimmen
ok Zwischenlösungen ausgeben als Buttons
ok setTimeout machen
ok border-radius erhalten nach Klick,
ok als letztes die Minimallösung ausgeben
ok Minimumsgraph besser als mit * markieren
ok Anfangsgraph auch mit als Zwischenlösung einreihen
ok Z(40,39); //26 aus [0,44] ans Ende der Zwischenlösungen hin
nö vor den 10000 Schritten wieder den Anfangsgraph ausgeben und Wartehinweis
ok neue Testbeispiele:
ok Approx-Fig.5 Start geht durch mit Ergebnis Approx-Fig.5 Ende
ok #1934 der mit 59 Knoten ok geht komplett durch mit Ergebnis #1934_fert
ok #1946-1 Fig.6 51 Kn. geht durch
ok #1946-2 Fig.7 51 Kn. geht durch
ok neue Demo mit exakter Lösung ok Graph exakt-6 und Graph exakt-7
ok Fig.6 knum=12,13,14 t=180
ok Fig.6 knum=19,28 stoppt alles
ok Fig.6 knum=29 da geht am Ende nicht Feinjustieren()
ok #1934 knum=23 stoppt bei t=0, t=1 ok geht durch
ok #1934 knum=24,25 stoppt bei t=-1
ok #1934fert knum=39 t=180 wegen NaN
ok Fig.7_fert knum=8 bleibt bei t=0 ok läuft jetzt durch, aber keine Verbesserung
ok exakt-7 knum=31 da stimmt am=0.2568 nicht ok am neu berechnet aus Einsetzkanten
ok oder Zwischenlösungen als Buttons oder sowas zum weitersuchen
ok bei "... multi" und nur 2 unpassende würden ja vorherige Einsetzkanten reichen
ok als Einstieg "besser annähern multi" doch nur mit dem letzten Ergebnis fortsetzen
ok ähnliche Zwischenlösungen zusammenfassen
ok nächste Stufe ist dann Zwischenlösungen absuchen ok läuft los
ok Button "besser annähern rekursiv" läuft los
ok Button "besser annähern nur mit Feinjustieren" taugt nichts
ok warum Halt bei "0.1903", aha "Rahmen zuerst" geht nicht bei einzelner Kante
ok wie weiter wenn nur zwei nicht passende Kanten ok EBDIFF Kanten von ROT wegnehmen.
ok weitere Markierung "besser annähern schon durchgerechnet" ok oranger Rahmen ok
ok was wenn 2-fache Beweglichkeit? ok diese übergehen
ok Checkbox "nur volle Beweglichkeit"
ok Anfangswert für am und den auch mit ausgeben
ok Feinjustieren s>ws auch mit versuchen, scheint jetzt machbar, ok funktioniert!!!
ok beim 108c ungefähr nach 40 Zwischenlösungen doppelte R(i,j), 108 gleich, ok ist weg
ok exakt-11 da geht "beweglich?" danach t+1 nicht, ok Feinjustieren s>ws in extrapol.
ok beim 108c mehrere "0.0000" mit gleichen Einsetzkanten? ok werden jetzt erkannt
ok Hinweis bei Feinjustieren s>ws: RW(...) selbst ans Ende der Eingabe verschieben.
ok das Rechenweg=... los() mal in einem Unterprogramm zusammenfassen ok
ok als allererste Zwischenlösung die von t=0 generieren und Anfangskante merken
ok Zwischenlösungen mit Rahmen_zuerst("gleicher_Anfangspunkt") ok
ok in Zwischenlösungen animate nochmal wegmachen
ok wenn "0.000" nochmal "besser annähern", fehlen die 3 Restkanten.
ok exakt-11 da geht Feinjustieren(11,9) nicht, muss dann (11,8) sein, ok s=s-1 reicht
ok Button Feinjustieren ohne (s,ws)
ok den mit (s,ws) in "ausführlich..." rein
ok Button "beweglich?" wieder getrennt zu "extrapolieren"
ok dann verändert "beweglich?" nichts am Graph
ok "beweglich?" auch mit ignoriere_Anzahl
ok alte Variante mit in "ausführlich..." rein
ok dabei mit Attribut "Anzahl" einstellen
ok exakt-13 nach Z(24); Z(25); Z(26); steht P24-P12 nicht mehr vorhanden
ok exakt-11 "besser annähern" startet mit alert, ok ...("Ableitungsmatrix") statt true
ok die vielen animate nur wenn ungleich 5;0;-5;0;5
ok Anhalten über Variable ok, Button "fortsetzen" auch ok
ok Zwischenlösungen als xml ausgeben, am besten mit vorhandenem Download-Link
ok mit den Attributen besser_annaehern_gestartet und besser_annaehern_beendet ok
ok Graph 108 nur Einsetzkanten.slice(1) als unterschiedliche Zwischenlösungen?
--ok Button "0.xxxx"
ok Start Zwischenloesungen_durchrechnen()
ok Variable Einsetzkanten
ok aus "0.xxxx" wird "0.5504"
ok APP.Zwischenloesungen gefüllt
ok APP.Innenkanten gefüllt
ok bisheriges Minimum ist wieder drin
ok nächstes "besser annähern" geht nur bis neue Zwischenlösung ok und weiter
ok bei Zwischenlösung "0.0000" geht "extrapolieren" nicht, ok erst "Rahmen zuerst"
ok button class noch einstellen
ok bisheriges Minimum gleich weitersetzen beim xml einlesen
ok "0.5504" und andere sind mit Ziehfaktor=0 oder 1, ok ist nur ab=1.00007 oder so
ok APP.knum und APP.appdoc mit bei den Zwischenlösungen ausgeben
ok APP.knum rechnet los
ok fertig schon bei knum+1 ok jetzt bei kmax ok
ok noch keine Ausgabe "beweglich ohne...." ok ist drin
ok mit Button "fortsetzen" fortsetzen ok
ok Checkbox mit abspeichern und zurückstellen ist doch nötig
ok auch welcher Button _multi oder _rekursiv mit speichern
ok APP.Variante zurücksetzen wenn nur 1x gebraucht
ok Einsetzkanten[0] nur ungleich Einsetzkanten.slice(1)
ok die Innenkanten stimmen vor "fortsetzen" noch nicht, ok werden mit gespeichert
ok Zwischenlösungen Graph 108 laden geht nicht fortzusetzen, ok inzwischen doch
ok zusätzliche Zwischenlösung t=0, hat andere Einsetzkanten, ok gilt so
ok beim echten knum fortsetzen
ok dieses xml auch wieder einlesen, ok kann so schon ok sein
ok in besser_annaehern() Innenkanten für jeden Start neu bestimmen.
ok Innenkanten_merk ganz raus
ok immer noch gleiche Zwischenlösung bei nochmaligem Starten nicht bemerkt
ok bei "fortsetzen" muss dann Innenkanten nicht nochmal bestimmt werden.
ok Einsetzkanten[0] ungleich Einsetzkanten.slice(1) muss dann auch nicht mehr sein
ok inzwischen Überflüssiges raus
ok neu Einrücken
ok aber Graph mit nur 2 nicht passenden Kanten startet mit unerwünschten Kanten ok
ok aber vor ROT.pop() lieber echte Einsetzkanten entfernen, ok mit Feinjustieren
ok vor approx-knum() noch Vergleichen, ob Zwischenlösung unverändert, ok nur reset
ok überhaupt Innenkanten nochmal neu bestimmen, für jede Zwischenlösung neu
ok Beschriftung [2,17,345] als Bildtext ist drin ok
ok vermeide das if Einsetzkanten[0] ungleich Einsetzkanten.slice(1) ok ist weg
ok aha, liegt vermutlich mit an dem N(25,23,27);
ok bei Graph exakt-13 Ableitungsmatrix wieso blauerWinkel maximal beweglich?
ok APP.Variante überall rücksetzen, ok nur Beweglichkeit_testen_mit_ignoriere_Anzahl()
ok alle indie>-1 Feinjustieren
ok Testbutton für 108f
ok Graph 108f lässt sich nicht besser "Feinjustieren" warum?
ok Zwischenlösungen_(4).txt setzt nicht fort ok try Bval=eval(...); catch() Bval=[];
ok Zwischenlösungen über 500k nur als Download
ok bei t= da fehlt "Stopp_alleWinkel" ok ist jetzt drin
ok auf ganzzahlige Kantenlänge ziehen abschaltbar machen ok als Checkbox
ok unexpected token , bezieht sich auf Funktionsaufrufe mit leerem Argument R(1,2,,D)
ok Checkbox "nur sehr faire Graphen"
ok bei "Rahmen zuerst" nicht passende Restkanten ans Ende verschieben
ok bei Fig.6+"Rahmen zuerst" geht "Feinjustieren" nicht ok jetzt doch
ok bei Graph Fig.7 P48 in "Rahmen zuerst" aus P10 bilden, ok jam vermeiden in M(...)
ok wenn einmal dabei, in "Rahmen zuerst" Dreiecke wieder als L(i,j,k);
ok neues "Rahmen zuerst" mit Checkbox umschaltbar machen, ok alt unter "ausführlich"
ok als j in M(i,j,k,w) das mit kleinstem Ebenen[j] nehmen und unpassend hintenan
ok Button "Rahmen zuerst" bei 5- und Mehrecken eher M() statt N()
ok Variable Ausrichten beim Einpassen beibehalten
ok bei "Feinjustieren" nur R(i,j) machen, welches sich selbst ans Ende verschiebt
ok Das Überdehnen komplex lösen nochmal versuchen ok aber besser ist M(i,j,k,w)
ok Graph 108c mit "nur faire Graphen" da ist eine unfaire Kante dabei, ok, nicht mehr
ok Graph 108d füllen ok ist durch
ok Graph 108e mit Ziehfaktor=0.01 zurechtziehen ok nur "Rahmen zuerst"+"Feinjustieren"
ok wegen der vielen Winkel reicht die Ausgabe von bis zu 22 Kanten nicht mehr
ok Checkbox jam statt jum
ok einen zusätzlichen Winkel erzeugen
ok diesen in jum einsetzen, Test mit #1178o
ok ein zusätzliches R(i,j) am Ende
ok jam in R(i,j) kann weg
ok auch M(i,j,k,w,0,jum(...)), Test mit #2046
ok Ziehfaktor kann weg
ok alle M, sind mehrere
ok alle Q, sind auch mehrere
ok nicht passende R(i,j) ans Ende, bei #1995, ok mit extra Funktion
ok da geht dann Feinjustieren noch nicht mit gleichem Ergebnis, ok Ziehfaktor raus
ok alles auch bei 'egal wie', mit Approx-Fig.5
ok und 'wenig Winkel'
ok jam() auch mit als R(i,j)
ok neue Eingabe Fig.6_fert geht nicht, #1183, #1867 ok nur etliche A(i,j) als RA(i,j)
ok Buttons neue Eingabe "viele" Winkel, Button "Vertuschen".
ok #2051-1 "egal wie" da fehlt dann eine Kante, bei "viele Winkel" auch, ok repariert
ok Hilfslinie Umkreis
nö Funktion Rahmen() aufteilen in extra Button "Ausgleichen" nö, eher Rahmen0123
ok vorherige_Eingabe.length beibehalten
ok Button "Anhalten" zugänglich machen
ok da sind noch E=B+2 dabei? ok ist jetzt korrekt E=B-1
nö da sind noch ROT2>3 dabei?
nö ausgeben warum "Feinjustieren" oder "Rahmen_zuerst" nicht funktioniert haben
nö Checkbox ohne Button "beweglich?" nö, ich mache Button "... ohne beweglich?"
ok Tikz Fehler wenn keine Winkel drin ok schon längst
ok fast Überschneidung orange
ok Button plazieren
ok Innenkanten bestimmen
ok Innenkanten entfernen
ok geht nur bis zurück(50) ok geht weiter
ok Zwischenlösungen als Buttons
ok Innenkanten bestimmen
ok Zwischenlösung speichern
ok erste_Zwischenlösung speichern
ok extra Funktionen, erstmal nur bei diesem einen Button
ok APP.Einsetzkanten eintragen und auch sortiert
ok bei extra-9 sind ja 5 Einsetzkanten und nicht 3, ok na lass ich so, gelöst ist gelöst
ok Button besser annähern "... schnell"
ok die vielen xmlns in Graph 0.0101 rausmach, ok auf einmal nur noch eines.
.. einzelne Rahmen0, Rahmen1, Rahmen2, Rahmen3
.. "Vertuschen" geht nicht bei: #1823, #2051-1,
.. #2051-1 geht nicht gleich "Feinjustieren"
.. jum Grafikausgabe als Dreieck
.. jum Grafikausgabe TikZ auch
.. in Feinjustieren nmax=60 verkleinern?
.. das Winkelzeichen irgendwo plazieren mit
.. Graph 108c mit "nur sehr faire Graphen" unnötige Zwischenlösungen t=n,n+1,n+2,n+3?
.. doppeltes RW auch herauslöschen, am besten als extra Element machen
.. 108k geht nicht weiter. 0-fach beweglich?
.. bei "Feinjustieren" nicht R(i,j) machen, wenn Reihenfolge schon passt
.. bei "Feinjustieren" R(i,j) die schon richtig sind, lassen, dann zuerst unpassende
.. Button "Rahmen zuerst" so machen, dass die RA(...) garantiert nur ganz innen sind
.. Graph als script laden
.. bissl DOCTYPE mit rein in Ausgabe Zwischenlösungen
.. der eine geht gar nicht einzugeben 1322??
.. die aus No.1322 als sehr faire Graphen probieren
.. nach Einlesen neu "besser annähern" erzeugt andere Einsetzkanten
.. Button "Rahmen zuerst" die 999 eher rausmach, damit keine Unterscheidung nötig
.. beim Feinjustieren auch Ziehfaktor automatisch einstellen wenn dabei
.. Graphen einer ganzen Seite einfügen
.. "beweglich?" mit in los() rein? besser als checkbox, da reicht Ausgabe x-fach
.. Graph exakt-13 "wenig Winkel"+"beweglich?" interpoliert bei t=tmax ungenau
.. Graph exakt-13 "Rahmen zuerst"+"beweglich?" nur bis t=1
.. Graph exakt-13 "egal wie"+"beweglich?" nur bis t=7
.. Graph exakt-14 "Ableitungsmatrix" nur 0-fach beweglich
.. Graph exakt-16 "besser annähern" Zwischenlösung bei jedem ganzzahligen t
.. Graph Approx-Fig.5_rz "besser annähern" unexpected token ,
.. na dann auch die Beschreibung von "besser annähern", neues "Feinjustieren" und...
.. unbedingt mal machen exakt-9, "Rahmen zuerst", Feinjustieren
.. Button "zurück(31)" auf "zurück(29)" zurückstellen
.. Button "Kaleidoskop" nochmal neu, Umsortieren der RW möglich machen
.. deshalb auch alle Z(i,j) als Log ausgeben ???
.. Überschneidung der RA(i,j) muss auch nicht sein, oder doch wegen folgender Lösungen
.. am umstellen auf Mittelwert
.. t_zeichnen=true;
.. bei "beweglich?" den jeweils aktiven Winkel+1 unterstreichen
.. bei knum=4 oder so geht t unnötigerweise bis -180, auch bei jmax<0.2
.. #1934fert knum=30 geht da Feinjustieren()?, nicht, also aussortier.
.. #1930 4/6
.. Fig.6_fert
.. exakt-7 ob der durchgeht
.. exakt-7 "beweglich?" erst nach 2xRahmen_zuerst
.. #1957 der Wert 0.0208* kann nicht stimmen
.. #1964 TikZ geht nicht und "besser annähern" auch nicht
.. Button um alle Kantenvariationen nur feinzujustieren ohne "beweglich?"
.. dabei mit flippen
.. das alte Eingabeformat P2=[D,0] automatisch umwandeln
.. aktueller_Index=0 besser setzen
.. while (WINK[0]&&NPUNKT[WINK[0][1]]==999) WINK.shift(); nochmal anders machen
.. extrapolieren momentan nur enumb=4 statt 10 weil sonst kein Halt
.. extrapolieren P48-P40 entfernen geht nicht bei #1768o180° aber bei #1768o180°a
.. #1768f geht im Moment nicht wie gewünscht, 1° ist zuviel, "wenig Winkel" geht gut
.. an den Bereichsgrenzen genauer extrapolieren, bis 0.01
.. dauerhaft Ausrichten wenigstens im Beweglichkeitsmodus oder besser Schwebung
.. die verkehrten äöü richtigstellen
.. bei "beweglich?" den größten Linearfaktor auswählen, oder den unterstrichenen?
.. #1916-6 mit \foreach \i in {34,...,35,37,...,72,74,...,74,80,...,88} geht nicht
.. H(34,38), besser G(34,38)
.. neu Durchnummerieren irgendwo mal mit
.. GAP Lücken in der Punkteliste rausrechnen
.. farbige Knoten für unterschiedlichen Knotengrad?
.. in ab(...) negative Indizes als nicht zu kopieren
.. DokuA und DokuQ die gedrehten Teilgraphen noch auflisten
.. Das Überdehnen komplex lösen nochmal versuchen
.. stets mit Pi=[0,0]; Pj=[1,0]; beginnen
.. Lagrange-Herleitung Knotengradabweichungsgleichung.
ok Fortsetzung_#2068a Rauten
ok Fortsetzung_#2068b Dreiecke
ok Kanten nahe 1 einfügen
ok bei den Eistüten fehlt noch der Fall wenn von P6 nach P3 ein Dreieck ist
.. nach (typeof K[j])=="undefined" geht das if nicht wenn || ohne Klammern vor &&
.. "wenige Winkel" da fehlt Kante [72,82]
// ab Worker:
ok Worker anfänglich in Gang bringen
ok async und await wieder raus
ok Rk wird glaube ich gar nicht mehr gebraucht ok ist raus
ok scripttext wechseln bei error während eval(), ok jetzt gesamten SG als Worker
ok warum unnötig "\n"+Rechenweg ok ist schon weg
ok behelfsmäßig am Anfang gleich let blauerWinkel=0, aha, in if und eval wirkt let nur lokal, ok wenn dann self["blauerWinkel"]=
.. "var ww=" als nur "ww="
nö eval(blob) probieren, ob dann filename passt, eventuell den blob schon in SG eintragen, jetzt gesamten SG als Worker
ok gesamten SG als Worker
nö eventuell die functions mit importScripts, nö wenn schon, dann mit import module
.. Worker als module,
ok myWorker.postMessage("Feinjustieren()");
ok erst Winkel_als_Array füllen
ok Ergebnis aus Worker_Feinjustieren(s,ws) zurückgeben
ok Ergebnis ist mit und ohne Worker richtig berechnet
ok Checkbox "mit Worker weiterrechnen" und Ergebnisse von Worker dann auch verwenden ok geschafft
ok in M() ist f.color weg, ok wieder drin
.. Rechenfun und Rechenfun2 wieder zusammen machen, nach und nach 5 von 14
ok P=[]; K=[]; ROT=[]; in Rechenfun2() setzen
ok am Anfang von Feinjustieren() geht kein los(), aha, "Justierwinkel=" muss weg.
ok die Winkelausgabe wieder, dazu geht nur blauerWinkel.color
ok blauerWinkel=new Object() ist wieder drin
.. Ausrichten um den Mittelpunkt von Pi-Pj herum
.. ganz ohne los(Text)
.. nach los() erst Rahmen() wenn los() beendet.
.. Button "beweglich" so zusammenpack, daß nur 1 Worker Aufruf nötig
.. umbenennen Justierwinkel und Winkel_als_Vektor und "Button":
.. t als Winkel_als_Vektor[0]
.. jeder Button als Worker
ok Button "new Worker()"
.. das Wechseln von einem Button zum anderen überlegen
.. sofort nach Ausführung einer Taste den Worker schließen, nicht weiter laufenlassen.,
.. den aktuellen Rechenweg in die Taste zurückspeichern und das Ergebnis für den Rechenweg
.. Button Verzweigungen nicht als Worker, sondern die einzelnen Verzweigungsgraphen
ok blinkende Taste beim Feinjustieren ok zumindestens der Anfang
ok den Fortschritt auch irgendwie symolisieren ok geschafft i von imax Kanten und Punktkoordinaten
ok Button "viele Winkel"+"Feinjustieren" geht nicht im Worker, ok auch Workersource mit aktualisieren
.. Beweglichkeit testen in "Feinjustieren" auch mit als Worker
.. nrmax anpassen in "#2445+0" und "egal wie"
ok "4 Doppelkite" mit RW da geht "Feinjustieren" nicht, ok geht, da war gSollabstand[gs]*D ersetzen durch ROT[gs][3]
.. bei vielen R(...) passen die Einsetzkanten nicht mehr ins SVG rein
ok INVERT_pur und INVERT_Ableitungsmatrix als Worker
ok bei "4 Doppelkites"+"egal wie"+"Ableitungsmatrix" (Einsetzkanten exakt 1) ist Bereich der Einsetzkanten leer, ok inzwischen ok
ok "4 Doppelkites"+"wenige N"+"1"+"Feinjustieren" geht nicht, ok DD.sort(Asort).reverse();
ok die Einsetzkanten noch in ROT hineinpacken ans Ende
.. neu analog Einsetzwinkel bestimmen, bei 4 Doppelkites und "egal wie" nur 1 von 4 Winkeln,
ok und ohne dem geht "Feinjustieren" nicht, ok da war irgendwas anderes defekt.
ok return Feinjustieren mit extra_weiter statt los()
ok die ständige Sortierung von ROT in Worker_Feinjustieren vermeiden, ok mit altesROT=structuredClone(ROT);
.. eventuell auch in Worker_Einsetzkanten nicht sortieren sondern ein Permutationsarray oder ein ROT1
.. Trennlinie wieder in die Ausgabe TXLS, oder Sortierung vermeiden
ok bei unlösbar wieder den Ausgangsgraph zeichnen
.. schon bei ersten Überschneidungen ERROR machen
ok Testtabelle mit relativ vielen ERROR
ok neue Eingabe soll die geeignetsten Einsetzkanten berücksichtigen
ok deshalb gleich nach los() alle Einsetzkantenbereiche komplett bestimmen
nö ob das über die Eingabefunktionen A, N... auch geht? nö nicht nötig
.. die svg-Sachen ab x_m_l.parseFromString(Rechenweg) mit in weiter() packen
.. ob bei importScripts() lineno und filename brauchbar sind
ok ob im Bereich der Einsetzkanten DELTA=[1,-1] geht, um das DD zu verschieben, ok geht mit DOPPELDELTA_M...
.. oder gar DELTA=[[-1,0],[0,1]],
ok dazu nochmal die Umformung mit dem DELTA heraussuchen
ok die Bereiche einzeichnen und die gewählte Einsetzkante extra
ok function Worker_Matrix_A(P,K)
.. die Lücken in P und K irgendwie herausrechnen, nur bei P,
ok bei nur "Doppelkite" oder "x_Doppelkite" ist DD unvollständig, das muß noch genauer werden.
ok DD_1 geht noch nicht wieder, geht inzwischen wieder, verwechselt aber noch was, ok geht, von GAP kommt DD[i][0]+1 zurück
ok touchmove Loslager bewegt sich manchmal langsamer und in entgegengesetzter Richtung, etwa #2442w P7-v
ok in Beweglichkeit2(barray) nicht auf max=1 normieren sondern auf 1:1 zu touchmove, ok vorerst gar nicht normieren ok
nö trotzdem nochmal schauen, warum nur gar nicht normieren geht, nö so lassen
ok 5[k][j]??? ok war Belastungsarray
.. die zusätzliche Anpassung DD auf GAP-Reihenfolge woanders machen, eventuell beim Einlesen des GAP-DD
.. die 3 globalen Beweglichkeiten herausrechnen mit orthogonalem Komplement
ok "#Doppelkite"+"Einsetzkaten" ergibt nur 0+2, ok mit let v100=100 geht dieser Graph jetzt und einige andere auch.
.. bei "#Doppelkite"+"javascript" steht ein K[18]=[undefined] drin und das sollte K[18]=undefined sein, ist aber hierfür egal
.. Worker_Einsetzkanten_verbessern_pur() schon in INVERT_pur(), im Moment geht das noch nicht.
ok alles zu BigInt: ok "Doppelkite" geht mit Big_eps_inv=1000n
ok "1DKoN" ergibt nur B=1 statt 2, ok BAMik statt BAMil
ok "#2442w" stimmt auch nicht, ok geht auch wieder
ok Rechenprobe wieder in Gang bringen, ok da muss Big_1^2 rein
ok mehr als 6 Nachkommastellen, ok mit let Big_1=100000000000000n;
.. verbessere noch let flag2=(Math.abs(Rat(Big_MA[j][k]))" nimmt "Einsetzkanten" den vorhergehenden Graph ok überall los() mit Checkbit_Worker=true
.. Einsetzkanten verbessern auch mit in Display Worker rein.
ok Ausrichten geht nicht mehr in der Animation, ok mit Checkbit_Ausrichten jetzt doch
.. aber trotzdem nochmal versuchen, auch Checkbox_Ausrichten zu aktivieren.
.. nach Ausrichten geht "+10" nicht mehr richtig
ok ohne zusätzliches Checkbit_Ausrichten=false (//xxy) geht Ausrichten in Animation wieder
.. "Fehlersuch5"da geht "beweglich?" nicht
ok HoH-Graph "#2597" mit "weiter mit t="
.. Test-SVG für data:...
.. #2630 da geht überhaupt kein Feinjustieren, nur jam+wenige_Winkel und das auch nur mit einem alert
nö Rechenfun2() im Worker lassen wegen Ausgabe ERROR in line,
.. höhstens mehr Ausgabetext wenn line innerhalb Rechenweg
.. #2655 "Einsetzkanten" Beweglichkeit 1 statt 0
.. #2690 da geht "besser annähern" nicht durch, #2693 auch nicht
.. wozu wird kikjkk() gebraucht?
.. bei ab(..."zusammengefasst") passt was nicht wenn der letzte Knoten dabei ist
.. starte_mit() in Rahmen_anfangen() läuft als Worker, deshalb D=50 nötig
.. #2655bew? da geht "wenige Winkel" nicht richtig
.. auch bei los() ein postMessage() im Worker-Fenster
ok Download-Dateiname mit Datum ist automatisch nach 100.
—— mehr Rest
.. Punkte_in_Vordergrund_bringen() da drin geht weiter() nicht, weil dann verändert sich die Belastungsausgabe
.. Belastung als relative Belastung ausgeben.
.. isolierte Punkte bei neu nummerieren entfernen
.. Belastung ausgeben irgendwie mit
.. dabei Fij=fij*ab(i.j)/D
.. abweichende Knotengrade in postMessage ausgeben
.. RW(...) Winkel zeichnen in TikZ
.. //RW(...) ersetzen durch das ursprüngliche RK
ok überhaupt Eingabefunktion W(i,j,k,w) wäre ja eine sinnvolle Ergänzung zu M()
.. RW_Schnittpunkte bei j<0
—— besser_annaehern_schnell() sortiert nach Belastung
ok #2693 besser annähern "...schnell" mit Checkbox "Dreiecks..." und "fair" stoppt am Ende mit Endlosschleife, ok war undefinded
nö die ersten beiden Matrizen schon in neue Eingabe "fast perfekt" rein. nö nur in besser_annaehern_schnell
nö dazu den KLISTE2 Index mit in APiPjPk packen nö jetzt als IK
ok besser_annaehern_schnell() läuft
ok ein erstes W(i,j,k,w) ok W() erweitert
ok in Ergebnistabelle() .innerText statt .innerHTML, ok .textContent geht
ok max Δl=...ok nur wenn >0.0001
nö ein RA(undefined) bei ohne P55-P46, P48-P28, P44-P8 (113 von 12341, noch 176 min) nö war wohl nur dazwischengedrückt was
—— suche_Flaeche()
ok EW, EW4, EW5 noch zusammenfassen in eine Matrix
ok bei neue Eingabe isolierte Punkte löschen
ok im Crashkurs anderes Ergebnis beim zweiten "fast perfekt", P6-P12 erst passend dann nicht passend, ok Z(...) in einer extra Schleife