Ja eben! Gehört zur GUI, oder sagen wir View, aber die View ist doch grundsätzlich dumm, oder nicht? Sie muss austauschbar sein und darf eigentlich garnicht wissen, was sie nach Birne kaufen tut. So hab ich immer MVC verstanden, wie das Menü aussieht weiß View bei mir auch nicht, dass wird völlig vom Model gefüttert, die View sagt nur gib mir aktuelles Menü als eine abstrakte Datenstruktur "Menu" und interpretiert diese. Die View kann doch eigentlich garnicht wissen, was ich alles noch brauche, nach dem Birne bestellen gedrückt worden ist, dass muss doch irgendwie die Logik steuern, vielleicht will die Logik irgendwann nur noch die Anzahl und so muss ja wieder zwei Komponenten ändern, Logik und View
Das sehe ich durchaus ein.
Zum Observer Pattern, dasd Subjekt muss die Logik nicht kennen, es muss nur einen Observer kennen und die Logik erbt ja update von Observer, so registriert mat beim View nur ein abstraktes Objekt vom Typ Observer, ohne zu wissen, was darunter ist.
Bis dahin hab ich aber auch nicht die großen Probleme, gehen wir von deinem Szenario aus, bei dem Item Birne kaufen ist ein EventListener auf der Logik seite, wen ich also Item Birne kaufen auswähle, gelange ich nach Logik.BirneKaufenAction(){} und hier brauch ich nun zwei Werte, String Marke und Int Anzahl.
Hier häng ich eigentlich, ich weiß nicht wie ich bei der View nun die zwei Werte gescheit erfrage und am Ende wieder in eine Logik Methode gelange, die beide Werte besitzt.
Naja, theoretisch weiß ich es, ich rufe View.gibString("Marke eingeben(titel)"); ein und registriere ein Event, das mir die Antwort in eine Logik.BirneKaufenMarkeDaAction(); aber nun muss ich diesen String in der Logik ja irgendwie zwischenspeichern, weil diese Methode ja noch nichts damit anfangen kann, also speichere ich es in irgendeiner Variablen und rufe aus Logik.BirneKaufenMarkeDaAction(); dann View.gibInt("Anzahl (titel)"); und registriere Logik.BirneKaufenMarkeUndAnzahlDaAction() und ab dort verarbeite ich erst alles weiter. So meintest du dass, nicht wahr?
Das durchhangeln. Dies geht ja theoretisch auch alles in einer Methode, Logik.BirneKaufenAction(); ich muss mir nur speichern wesewegen diese Methode gerade aufgerufen wird, also ob es das erste Mal ist, oder ob schon Marke eingegeben worden ist, oder ob Anzahl da ist.
Wir reden aneinander vorbei 🙂
Ich benutze sowieso ein Model View Controller Modell, so ist bei mir alles getrennt.
Zu dem Observer Pattern, das Ding ist eine generelle Art und Weise wie man n-Beobachter und einen Beobachteten hat.
Das Subjekt stellt eine abstrakte Methode notify, register und unregister bereit. Der Observer die abstrakte Methode update().
Die GUI, oder was auch immer sich um die Ausgabe kümmert, erbt von Subjekt und implementiert notify, register und unregister. Mein Controller erbt vom Observer und implementiert update.
So gibt es auf der Subjekt - Observerebene die Methoden notify, register, unregister und update.
Die Logik (Observer) registriert sich selbst am Subjekt als Beobachter, also View.register(this).
Die Logik initialisiert irgend eine Art von Zustandsspeicherung, eventuell ein enum mit verschiedenen Zuständen wie "zeigeHauptmenü", "zeigeObstmenü".
Nun ruft die Logik in einer Schleife View.zeigeMenü() , View zeigt das aktuellste Menü an und wartet auf Eingabe, erfolgt diese, wird der Wert gespeichert und View ruft bei sich selbst notify() auf, deren Aufgabe ist es, irgend eine Menge an Observern (Array, List...) zu iterieren (hier gibts nur einen, die Logik) und bei denen die abstrakte Methode update beim Observer zu rufen.
Bei der Logik hat nun den Aufruf von Update stattgefunden. Die Logik queried View und holt sich den Wert von der letzten Eingabe.
Hier Observer-Pattern definiert also eine globale Schnittstelle auf der Beobachter-Ebene, dies wäre die methode update.
Wie oben erwähnt gibt es also nun eine einzige Methode, die immer wieder aufgerufen wird, dafür muss man aber wissen, was überhaupt passiert, daher die oben erwähnte Zustandsspeicherung. Update sieht ungefähr so aus:
void logicStart(){
while(true){
View.zeigeMenü();
// View ruft bei Antwort immer update auf
}
}
void update(){
int i = View.gibtLetzteEingabe();
switch(zustand){
case "zeigeHauptmenü":
// Das Menü hat 3 Elemente
switch(i){
// ObstMenü
case 1:
// Setze neuen zustand
zustand = "zeigeObstMenü";
View.fügeMenüAn("ObstMenü");
break;
...
}
break;
case "zeigeObstMenü":
// Dies Menü hat wieder Unterpunkte
switch(i){
case 1: // Dieser Unterpunkt erfordert noch einen String und einen Int
??? Was hier tun ???
// Ich müsste nun View.gibtString(); aufrufen
// aber gibString ruft am ende wieder update auf
// ohne dass sich der zustand geändert hat.
// (Mit der einschränkung das View.gibLetzteEingabe ein int zurückgibt, aber das kann man ja durch generics oder ähnliches abfangen
break;
}
break;
}
}
In der Update-Methode geht es nicht um die Representation des Menüs, sondern nur den Wert, ist int i = 3, also Zurück, wird wie bei dir beschrieben das letzte Menü entfernt.
Dies erfordert noch immer eine Bearbeitung eines jeden einzelnen Punktes, aber nicht aus der Sicht des anzeigens, wann was kommt, sondern damit die Logik mitbekommt in welchem Zustand man ist, also ob die Eingabe von View nun gerade auf Hauptmenü oder Obstmenü zeigt.
Mir geht es also hier nicht, wie ich das Menü anzeige, sondern wie ich jegliche Eingaben, die außerhalb des Menüs stehen, verarbeiten kann, wichtig ist halt, dass jede Anweisung des Views in einem Aufruf von update endet, wenn Daten bereit stehen.
Ich verstehe, aber was du mit Zuordnung meinst setzt sich bei mir in der update Methode zusammen, sagen wir ich bekommen den aktuellen Menüwert an update
void update(int i){
// Zuordnung 1
if(menüItem = "Obst"){
// nutze i
} else if(menüItem = "Gemüse"){
// Zuordnung 2
}
}
Du hast quasi für jeden Menüpunkt einen eigenen Observer definiert, also jeder Menüpunkt resultiert in einem Eventlistener, in meiner Variante habe ich quasi nur einen Eventlistener, der intern sich mit der Zuordnung auseinander setzen soll.
Im zuge des Observer Patterns sehe ich keinen Weg die Anwendung auf mehrere Eventlistener zu verteilen, das bricht ja die einheitliche Benachrichtigung durch das update auseinander.
Ich würde auch wohl gerne eine vielzahl kleinerer Methoden haben, aber ohne das Konzept eines Observer auf Klassenbasis aufzubrechen.
Weiter im Text, Menüverarbeitung klappt ja auch in beiden Methoden soweit gut, außer dem unschönen Problem dass ich bei der update Methode irgendwann tonnenweise ifs habe, oder bei deinem Modell ganz viele kleine Methoden.
Aber was passiert bei dir, wenn ich im Menü Haupt>Obst>Birne kaufen bin, das letzte aktive Menü ist "Obst", der gewählte Punkt ist "Birne kaufen". Das BirnekaufeAction event wird gefeuert und ich lande in einer kleinen Methode. Aber das Birnekaufen erfordert nun eine Eingabe eines Strings "marke" und danach die Eingabe eines Ints "anzahl".
Was soll bei dir geschehen? Soll bei dir nun eine Eingabe auf String warten und diese ruft dann BirnekaufenMarkeEingegebenAction auf? Und diese ruft dann Birne...undAnzahlEingegebenAction auf?
Dafür muss man ja auch irgendwie diese variablen zwischenspeichern.
Ich meinte, dass ich eine große Catch methode habe, dieses Teil wird nach einem Observer Pattern definiert. Dh mein Observer hat eine update Methode und das Subjekt ruft quasi wenn was zurück kommt von dem Getline die update Schnittstelle vom Observer, der Observer holt sich dann den Wert, aber der Observer weiß ja nicht was der Wert bedeutet (Im ersten Menü Wert 3 z.B.)
Dh diese update Methode im Observer muss sich irgendwo doch noch merken wozu der Wert gehört. Ich hab natürlich die Möglichkeit über das Menü rauszufinden zu welchem Menüpunkt der gehört, aber dann hab ich immernoch ne Menge ifs, if Wert == "Obst" else if Wert == "Gemüse". Das funktioniert ja auch so ähnlich wie mit den Methoden
if (wert=="obst") {pushToStack(ObstMenü) }
Aber bei sehr vielen Menüpunkten hab ich ein Haufen an ifs oder kleine Methoden. Wenn ich in Obst bin und dann 3 Werte brauche, dann muss ich mich ja quasi von ObstAction nach ObstAAction zu ObstBAction und ObstCAction, bis ich die drei Werte zusammen habe, in einer großen Methode wäre dies eine zusätzliche Variable
Was mir garnicht gut gefällt ist, dass ich bei deiner Methode sehr viele triviale methoden habe und bei einer catch Methode riesige verschachtelte switches brauche um irgendwie den Zustand zu verwalten, aber ne bessere Lösung fällt mir nicht ein.
Wobei mein switch ding mittlerweile wohl riesig wird.
Wenn ich an einem Punkt bin, an dem mehr getan werden muss, als Menüs zu erzeugen, sagen wir 5 verschiedene Werte eingeben, so muss ich ja immer wieder den Zustand speichern, also im Menu X und A eingegeben, B eingegeben usw, das scheint schwierig zu sein.
Ich bin auch gerade just am testen dieser Art der Verarbeitung, sieht immernoch gut aus!
Nun, dass is ja mal n Ding! 😁
Werde ich mir mal genauer anschauen, scheint aber ein sehr guter Ansatz zu sein (wenn ich das von meiner mickrigen Position beurteilen kann 😁 )
Danke
Hallo,
@herbivore, theoretisch ist es keine endlose rekursion, aber man kommt ja nicht wirklich aus ihr raus, mir fällt kein Weg, die abzubrechen, auch wenn man die ganze zeit auf zurück geht so ist dies ja immer ein Punkt in dem Menü und man erzeugt immer tiefere Schachtelung.
Und ich sitz auf dem Schlauch, was meinst du in Methoden packen, so gesehen habe ich dies ja getan. Es wäre ja immernoch sowas wie
while(true){
zeigeMenü1();
zeigeMenü2();
zeigeMenü3();
}
Man muss ja irgendwo auch verarbeiten, also Menü auswerten. In dem Beispiel hier oben klappts ja nicht, wenn ich in Menü 2 zurück will. Oder ich mache soviele while trues wie ich menüs habe
while(true){
while(notExit){
zeigeMenü1();
while(notExit){
zeigeMenü2();
while...
zeigeMenü3();
}
}
}
break würde dann in der Tat den oberen Menüpunkt anzeigen, aber dass macht ja einen kirre, wenn man eine tiefe Struktur hat
@Juy:
Kann ich nicht, hab keine, ist nur im Kopf.
LeseA und LeseB ist nur ein Beispiel, der Unterschied ist dass LeseA ein "a" zurückgibt und LeseB "b" zurückgibt.
Im Grunde ist es nur eine Methode, die ein Zeichen liest, wenn ich da direkt return machen, knallts ja direkt 🙂
Im Zusammenhang mit Menüs macht das keinen Sinn, ich habe hier ja nicht das Problem, dass ich sofort eine endlosrekursion bekomme, die den Speicher frisst, sondern nach und nach mit der Menü navigation, jede Menü wahl (inklusive Zurück) bringt mich immer ein Level tiefer in der Rekursion, es ist unwahrscheinlich dass das Programm bald abstürzt, denn das wären wohl Milionen von Menüpunkten zum navigieren, aber es ist halt schlecht, weil ich eine Rekursion habe, langsam, aber Rekursion und eine gescheite Abbruchbedingung gibts nicht, höchstens wenn man ganz oben in der Menünavigation ist.
Hallo,
beziehst du dich auf den ersten Ansatz, oder auf den zweiten?
Mit der Endlosrekursion mein ich folgendes:
Sagen wir mal das Menü soll A anzeigen wenn B zurückgekommen ist und B anzeigen, wenn A zurück gekommen ist, sagen wir notify nimmt einen Parameter, String, char oder weiß der Geier und es gibt keinen Threads.
void notify(string wert){
if(wert == "a")
leseB();
if(wert == "b")
leseA();
}
void leseA(){
string s= Console.readLine();
// Eingelesen, benachrichtige Observer
notify(s);
}
void leseB(){
string s= Console.readLine();
// Eingelesen, benachrichtige Observer
notify(s);
}
Lese A und B sind nur Synonyme für verschiedene Eingaben. Wenn ich einmal leseA aufrufe, so endet dies in notify, notify hat irgend eine Zustandsspeicherung, hier halt der Parameter und ruft dann leseB auf, aber notify läuft ja nicht weiter, es wartet bis leseB fertig gearbeitet hat (blocking call eben), leseB endet aber darin, dass er notify wieder aufruft und notify ruft wieder leseA oder B.
Das Szenario funktioniert gut wenn leseA oder B in einen anderen Thread laufen würden, so aber ist das eine Rekursion (keine direkte, weil notify sich nicht direkt aufruft, aber rekursion)
Die Frage ist mir vorher nie gekommen, weil ich nie in der Situation war und nach ein wenig nachdenken komme ich zu keiner wirklichen Lösung.
Das Szenario ist irgend eine Art der Navigation wobei keine parallele Verarbeitung vorkommt. Kurz gesagt User Interface ist die Konsole und eine Methode getInt(); ist ein blocking call, so dass das Programm nicht weiter läuft, während man auf die Eingabe wartet.
Ziel ist es ein Menü zu generieren. Ein Beispiel:
Hauptmenü:
1. Obst
2. Gemüse
3. Zurück
___________
Obst:
1. Birne bestellen
2. Zurück
___________
Birne bestellen
1. Anzahl
2. Zurück
Man hat also im Hauptmenü Obst und Gemüse, man wählt Obst und kommt ins Obst Menü, man wählt Birne bestellen und kommt in das nächste Menü (Level 3)
Ich muss sagen, ich weiß nicht, wie man das löst.
Beispielcode
void method(){
while(true){
int wahl1 = HauptMenü();
switch(wahl){
case 1:
int wahl2 = ObstMenü();
switch(wahl2){
case 1:
// Hier wieder der gleiche Spass, nur wie komme ich bei Zurück aus Level 3 in das Menü von Level 2?
break;
case 2: ...
}
break;
case 2:...
break;
case 3:
continue;
}
}
}
Hier hat man ja ein ewiges Problem, dass man die ganze Menüstruktur äußerst unflexibel gestaltet und eigentlich auch nicht wirklich von einer Ebene in die eins höher kommen kann.
Noch schöner wird es, wenn ich ungethreadet das gleiche Ding mit Observer Pattern modeliere.
Also Observer sagt "Subjekt gib Hauptmenü", Subjekt fragt konsole, bekommt einen Wert und ruft beim Observer die notify Methode auf, Observer ist in der Notify Methode, holt sich dort den Wert des Hauptmenüs und ruft dann in notify selbst "Subjekt gib Obstmenü", Subjekt ruft wieder notify auf, notify ruft dann "Subjekt gib Birne bestellen menü" usw. Hier hab ich das problem, dass ich eine endlosrekursion habe, weil das erste notify nie beendet wird, weil es Methoden aufruft und diese Methoden rufen notify auf usw...
Wie zum Geier löst man dieses Problem?
Klingt doof, aber ich suche einen Weg, wie ich ein DataGridView in ein Bitmap gestopft bekomme, ich würd ungerne das Bitmap genauso füllen müssen, wie das Datagrid, daher dachte ich mir, ob man nicht vielleicht ein Quasi-Screenshot von sich selbst anfertigen könnte. Mir reicht es auch, wenn ein Screenshot der ganzen aktuellen Anwendung gemacht werden kann
Testet das ganze mal mit Bitmap getPixel, hehe
Ich glaub die getPixel Methode hat im Code noch ein Sleep drin 😁
Die is gefühlt 1000 mal langsamer als wenn man die Daten durch die Marshal-Schicht roh in ein Array knallt 🙂
Hi,
danke für die Antworten, wie gesagt, selber machen ist kein Problem, ich war nur neugierig, ob C# die Komponente irgendwie versteckt, hätte ja sein können, dass einer der Params der mbox das Ding für Input bereit machen würde.
Aber gut, geht anscheinend nicht von alleine 🙂
StartupPath, das ist es, danke. Ich hab gerade Directory.currentDirectory() probiert.
Ah kurz am Rande, weißt du, wie man den Pfad der Anwendung rausbekommt? Die Suche hat ne Menge Treffer für Pfade, aber nicht auf den eigenen 😠
Ich such eine kleine Komponente, mit der man den User nach einem String fragen kann. Quasi MessageBox mit Texfeld. Gibt es da etwas fertiges? Ich kann mir natürlich selber einen basteln oder den Open Dialog hijacken, aber wenn irgend eine Komponente dies bereit kann, wäre das super 🙂
Was wäre ein optimum für Key,Value pairs?
Ja, deswegen hab ich beide aufgeführt.
Hashtable ist wohl wörtlich gemeint, aber wie schafft das Ding denn balanciert zu bleiben?
Ist eigentlich eine Hastable oder Dictionary schnell beim Zugriff?
Wird bei denen ein balancierter T* Baum erzeugt um die Zugriffszeit zu verkürzen?
(Mir ist nie die balancierung klar geworden, das erfordert ja eine reindizierung), oder sind die anders implementiert?
Danke!
Hab eh die nicht Pointer Version genommen 🙂
Ich werde beim C++ lernen eh andauernd von Pointern genervt 🙂 Und die C++ bashen mich eh, dass ich ein C# Weichei bin 😁
Ich meinte eher C# ohne Pointer im Vergleich zu der Version mit Pointern 🙂
Aber danke für den Code
Ist net mit dem managed drum herum wirklich so viel langsamer? Ich würd sehr sehr ungerne C++ machen müssen 🙂
Text Klassifikation
Ich such eine Methode aus einem String die Anzahl der Großbuchstaben und die Anzahl der Kleinbuchstaben raus zubekommen. Das wichtige daran ist, es muss schnell gehen, schneller als schnell, weil die Datenmenge riesig ist.
Mir fällt nur Char-weise den String zu durchlaufen, aber gibt es vielleicht eine native und damit schnellere Methode, einen String ab einem bestimmten char zu croppen?
Kennt jemand dieses Problem? Bei der Suche ergab sich nichts hilfreiches, scheint so, als würde dieses Problem nicht sonderlich oft auftreten, zumal nichtmal mit ner Fehlermeldung oder ähnlichem
Ah toll! Danke für den Code!
Aber wenn ich seltsamer weise
ProcessObj.StartInfo.RedirectStandardInput = true;
Einfüge, kommt er aus dem WaitForExit nicht mehr raus, kommentiere ich das Exit aus, geht er beim Read nicht mehr weiter, komisch, hab ich nen Blocking Call oder so verpasst?
Nein, nicht von mir, kein .net.
Es geht darum, dass das externe Programm mir Dienste bereit stellt, sich jedoch nicht wie gewöhnliche CLI Programm nach dem Aufruf direkt wieder beenden, sondern eigenes gethreaded solange aktiv bleiben, bis diese beendet werden. Ich werd mir Process angucken.
Wünschenswert ist natürlich dass jeglich Ausgabe nur zum Programm läuft und nicht nebenbei noch irgend ein Dos Fenster auf ist, und als Output genutzt wird 🙂
Edit: So wie ich Process verstehe, wird das Programm gestartet und befindet sich dann auf dem Desktop, weil die Ausgabe an die Windows Console geht, kann man dies unterdrücken?
Ich überlege gerade, wie es möglich ist ein externes Programm via C# zu rufen und dieses Programm zu nutzen, als Helper quasi.
Wobei sich dieser Helper nicht terminiert, nach dem ausführen. Wie läuft so was in C# ab? Muss man einen Socket zu einem Programm öffnen, damit dieses offen bleibt? Und schickt man dann einfach Nachrichten?
Gibts so was wie SerialPort für ausführbare Dateien und nicht für Ports? Wo man die Datei mit Parametern initialisieren kann?
Problematischerweise benötige ich im Avi auch Sound
Ich finde leider im Web als auch nichts im Forum was zur generierung von AVIs führt.
Ich würd gerne einfach Avi Videos erzeugen, und weiß nicht, wo ich da ansätzen soll. Mit was würde man sowas genrieren? Gibt es Bordmittel?
Hm, ich hab es so ähmlich gelöst, performance spielt ne rolle, wird nämlich in einer Draw Anweisung in einer 3D Applikation aufgerufen...oft aufgerufen 🙂
Und ich muss dort eh in einer schleife iterieren, was bedeutet, dass in einer schleife noch ne schleife garnicht gut wäre. Im moment mache ich es so, dass ich die Potzenen subtrahiere. Da ich quasi die einzelnen stelle brauche, Teile ich 234 erst durch 100, ziehe 200 ab, dann durch 10, ziehe dann 30 ab, alle sim Int Bereich und bekomme so die Stellen
Gibt es eine wesendlich schnellere Methode ein int in ein Array zu bekommen, oder die Werte des ints via index zu bekommen?
(Ich meine keine For-Schleife oder sowas, das krieg ich hin)
Gemeint ist so was:
int i = 123;
i[0] = 1;
i[1] = 2;
...
Asche über mein Haupt, verzeich mir, als du das gepostet hast, hatte ich ein extremes deja vu 🙂
Ich hab ein Problem und zwar hab ich hier zwei Gleichungen mit zwei unbekannten, leider fällt mir gerade keine Möglichkeit ein, wie man das algortihmisch durchrechnen könnte.
Man kann ja kaum nicht initialisierte variablen in die Gleichung packen, aber irgendwie müsste es doch möglich sein. hmpf.
(Als Beispiel 2x+3y = 5 und x+y = 2)
Seltsam, und warum geht das andersrum nicht einfach? Irgendwas ala "Console" hinzufügen?
punkdevil, ja die Möglichkeitne kenne ich, suchte nur etwas noch billigeres als Wrapper, als den Highlighter, der schon ein wenig zu groß für die Anwendung ist.
Werde aber wohl den Hightlighter nehmen.
Danke
Ich bin doch garnicht in diesem Szenario 🙂
Es gibt halt zwei Wege, wie eine Methode aufgerufen wird, einer davon registriert dieses Event, der andere nicht.
Und diese MEthode, die durch die Wege erreicht wird, soll aber nur dann ein event registrieren, wenn dort kein Event registriert wurde.
Denn sonst hab ich das Szenario, dass ein Event zwei mal registriert wurde und beide lesen vom SerialPort, aber der eine kriegt nur Rest == 0 und wirft ne Exception.
bleibt wohl nur ein Flag in der Klasse, oder?
Das habe ich gesehen, nutze auch die Diagnostic ausgabe, nur wird es ja primär alles ins Debuggen Fenster geworfen und da stören immer die anderen Ausgaben "Thread beendet" usw.
Ist nicht so tragisch, hab hier nebenbei noch was in Java zu tun und da geht beides gleichzeitig, daher mein Blackout.
Danke
Gibt es eine schnellere und leichtere Methode verschiedenfarbigen Text in einer Textbox auszugeben, ohne sich in RTF einzuarbeiten oder die Webbrowser Komponenten zu nutzen?
Edit: Ich kenne natürlich den hghlighter [Tutorial] Einfaches Keyword-Highlighting
aber ich mein verschiedene Farben usw
Ich hab ein SerialPort und ich würde gerne wissen, ob bereits ein Event für DataReceived drin ist.
if(serialPort.DataReceived==null)
...
Wirft mir einen Fehler:
Fehler 1 Das Ereignis "System.IO.Ports.SerialPort.DataReceived" kann nur links von += oder -= verwendet werden. Controller.cs 501 29 PCController
Wie kann ich denn prüfen, ob ein Event bereits eingetragen ist, wenn ich kein null verwenden kann?
Solange dem Event nichts zu gewiesen ist, ist es ja null, aber prüfen kann ich es nicht?
Achso, es ist aber keine, das heiß so gehts nicht, richtig?
Bin ich denn blöd?
Ich finde die Konsole bei VS 2005 einfach nicht.
Ich schrieb was mit Console.Write usw, aber ich finde das fenster nicht.
Ansicht -> Ausgabe ist es nicht, da werden nur Debug Infos usw ausgegeben, aber keine Konsole.
Sehr merkwürdig, sehe ich den Wald vor lauter Bäumen nicht?
Ach mist, dabei hab ich mir das angeguckt, und verworfen, weil es ein Void liefert, argh!
Danke, werd ich testen
Wenn ich ein unmenenge an 2D Koordinaten transformieren will, kann man sich ja das leben mit einer Matrix erleichtern.
Matrix m = new Matrix();
m.Rotate(34.4);
Ist eine super sache, da man sich nicht mehr um die Werte kümmern muss, aber gibt es einen Weg, die Matrix für Tupel auszurechnen ohne per Hand eine Matrix multiplikation machen zu müssen?
Ich hab kein Bild oder sowas, wo ich einfach die Matrix überschreibe, sondern wirklich nur Koordinaten
Free Trial ist nicht Freeware!
Aber danke für die Info