Zeichenprogramm, errechnung der Position eines Punktes

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von cloidnerux » Do Jun 11, 2009 9:34 am

Also, ich programmiere gerade ein kleins Grafikprogramm, mit dem man vorerst nur Linien zeichnen kann.
Jezt habe ich aber das Problem das die linien nicht richtig gezeichnet werden, bzw. die Punkte dafür falsch gesetzt werden.
Das ganze hat ein koordinatensystem mit einem mittelpunkt, ein Skalierungsfaktor und die Position der Maus.
Den Mittelpunkt des Koordinatensystems kann man verschieben, beliebig in alle Richtungen.
Auch das Skalar kann man ändern.
Wenn man jezt einen Punkt setzten will mit der Maus, muss man die mauskoordintae in eine koordinate des Koordinatensystems Umrechnen und da liegt der Fehler.
Bisher habe ich die Distanz zwischen Mauskoordinate und Mittelpunkt errechnet und dann durch das Skalar geteilt, aber dabei entstehen fehler und punkte werden falsch gezeichnet:

Code: Alles auswählen

 punkte.Add(new Point( Convert.ToInt32 ( (e.X - transformX) / scale),  Convert.ToInt32 ( (e.Y - transformY) / scale ) ) );
e.X und e.Y sind die Mauskoordinate, tranformX und tranformY die position des mittelpunktes und scale das Skalar.
Je kleiner scale desto mehr Zoomt es raus, je größer desto näher wird gezoomt.

Edit1: Wenn man näher Ranzoomt ändert sich die position des mittelpunktes: Er kann dann auch nur 30/20 Sein, auch wenn er im Mittelpunkt bei einer Muskooridnate von 600/500 liegt.

Danke für Hilfe.
MfG cloidnerux.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von Xin » Do Jun 11, 2009 10:52 am

cloidnerux hat geschrieben:Also, ich programmiere gerade ein kleins Grafikprogramm, mit dem man vorerst nur Linien zeichnen kann.
Jezt habe ich aber das Problem das die linien nicht richtig gezeichnet werden, bzw. die Punkte dafür falsch gesetzt werden.
Das ganze hat ein koordinatensystem mit einem mittelpunkt, ein Skalierungsfaktor und die Position der Maus.
Den Mittelpunkt des Koordinatensystems kann man verschieben, beliebig in alle Richtungen.
Auch das Skalar kann man ändern.
Das Skalar (auf Deutsch: die Zahl) meint den Zoom-Faktor, richtig?
cloidnerux hat geschrieben:Wenn man jezt einen Punkt setzten will mit der Maus, muss man die mauskoordintae in eine koordinate des Koordinatensystems Umrechnen und da liegt der Fehler.
Bisher habe ich die Distanz zwischen Mauskoordinate und Mittelpunkt errechnet und dann durch das Skalar geteilt, aber dabei entstehen fehler und punkte werden falsch gezeichnet:

Code: Alles auswählen

 punkte.Add(new Point( Convert.ToInt32 ( (e.X - transformX) / scale),  Convert.ToInt32 ( (e.Y - transformY) / scale ) ) );
e.X und e.Y sind die Mauskoordinate, tranformX und tranformY die position des mittelpunktes und scale das Skalar.
Je kleiner scale desto mehr Zoomt es raus, je größer desto näher wird gezoomt.
Okay... was ist nun das Problem?

Vielleicht kannst Du mal eine Wertetabelle aufstellen mit den Werten, die Du bekommst und denen, die Du erwartest!?

Sind die Mauskoordinaten relativ zum Control, relativ zum Fenster oder relativ zum Bildschirm?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von cloidnerux » Do Jun 11, 2009 11:03 am

Das Skalar (auf Deutsch: die Zahl) meint den Zoom-Faktor, richtig?
Richtig.
Okay... was ist nun das Problem?
Also, man drückt an einer belibigen position die Maustatse. Jezt wäre zu erwarten das an dieser position ein punkt Gezeichnet wird und dieser mit dem Letzten verbunden wird.
Jezt wird aber der punkt nicht an diser Maspositin gezeichnet, sondern mal drüber mal drunter usw.
Bild
Hier habe ich mla ein Bild davon. Die Roten Markierungen zeigen so ungefehr die Mausposition.
Sind die Mauskoordinaten relativ zum Control, relativ zum Fenster oder relativ zum Bildschirm?
Relativ zu dem Control in dem ich es zeichne.
Aber ich hab sozusagen 3 Ebenen:
Das Koordinatensystem, den Fensterauschnitt vom koordinatensystem und die mausposition. Das macht es ja so schwer es zu berechnen
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von Kerli » Do Jun 11, 2009 11:20 am

cloidnerux hat geschrieben:
Sind die Mauskoordinaten relativ zum Control, relativ zum Fenster oder relativ zum Bildschirm?
Relativ zu dem Control in dem ich es zeichne.
Zuerst musst du einmal wissen wie die einzelnen Koordinatensysteme aufgebaut sind. Du bekommst die Mauskoordinaten also relativ zu dem Bereich in dem du zeichnen kannst. Wo ist denn der Ursprung und in welche Richtung hast du steigende Werte in die einzelnen Koordinatenrichtungen. Dann musst dir einmal im Klaren sein in welchem Koordinatensystem du deine Punkte speicherst und schließlich musst du dann die Mauskoordinaten in das Koordinatensystem transfomieren in dem du die Punkte speicherst und anschließend noch in Koordinaten transformieren, die du in deinem Control ausgeben kannst.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von Xin » Do Jun 11, 2009 11:21 am

cloidnerux hat geschrieben:
Okay... was ist nun das Problem?
Also, man drückt an einer belibigen position die Maustatse. Jezt wäre zu erwarten das an dieser position ein punkt Gezeichnet wird und dieser mit dem Letzten verbunden wird.
Jezt wird aber der punkt nicht an diser Maspositin gezeichnet, sondern mal drüber mal drunter usw.
Dann lass Dir die Koordinaten doch bitte mal ausgeben und die aktuellen Zoom-Werte, sowie die Position des Mittelkreuzes.
cloidnerux hat geschrieben:Hier habe ich mla ein Bild davon. Die Roten Markierungen zeigen so ungefehr die Mausposition.
Leider kann ich nicht erkennen, welche Punkte in welcher reihenfolge geklickt bzw. gezeichnet wurden.
cloidnerux hat geschrieben: Aber ich hab sozusagen 3 Ebenen:
Das Koordinatensystem, den Fensterauschnitt vom koordinatensystem und die mausposition. Das macht es ja so schwer es zu berechnen
Eigentlich sollte das nicht sonderlich schwer sein. Ich habe derartiges auch schonmal programmiert - allerdings ohne Zoom.

Deine Grafik sieht ziemlich wirr aus, da scheint mir, dass da noch was anderes passiert, das eventuell transformX/Y udn/oder den Zoomfaktor verändert.
Daher sage ich ja, dass Du Dir die Werte mal ausgeben lassen sollst.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von cloidnerux » Do Jun 11, 2009 11:35 am

Damit ihr euhc selbst ein Eindruck machen könnte, habe ich das Programm mal Hochgeladen:
http://cloidnerux.cl.funpic.de/
unter Engeeniring Drawer.
Es ist ein net. Frameworkprojekt und kann über mono auhc unter linux genutzt werden.
Ich habe es auf meinem openSuse 11.1 erfolgreich starten und testen können
Es hat aber ncoh einige macken beim Ausführen, zu Anschaungszwecken reicht es aber.
Der Code ist beigelegt, Programmiert ist das ganze in C#.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von Xin » Do Jun 11, 2009 12:01 pm

Ich werde heute wohl nicht mehr dazu kommen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von Kerli » Do Jun 11, 2009 12:33 pm

Das deine Koordinatenachsen so verschoben angezeigt werden ist kein Wunder. Denk einmal nach was passiert wenn die Gitterweite kein Teiler von 1000 ist. Außerdem wäre es doch viel sinnvoller die Tatsächlichen Maße zu verwenden und nicht sicherheitshalber 1000.

Das deinen Punkte so falsch gezeichnet werden liegt an zwei Sachen:
- Du musst die Mauskoordinaten in dein eigenes Koordinatenssystem transformieren und da du mir dem Kehrwert des Skalierungsfaktor verwendest musst du dafür mit dem Skalierungsfaktor multiplizieren und nicht dividieren.
- Außerdem musst du die Punkte vor dem Zeichnen noch mit dem gerade aktuellen Skalierungsfaktor multiplizieren bzw. in deinem Fall dividieren.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von cloidnerux » Do Jun 11, 2009 1:07 pm

Das deine Koordinatenachsen so verschoben angezeigt werden ist kein Wunder. Denk einmal nach was passiert wenn die Gitterweite kein Teiler von 1000 ist. Außerdem wäre es doch viel sinnvoller die Tatsächlichen Maße zu verwenden und nicht sicherheitshalber 1000.
Die Gitterwiete beträgt immer 1cm auf dem bildschrim und ist unabhänig von allem anderen.
Die koordinatenachse wird nur dort verschoben angezigt, weil ich sehr stark heruasgezommt habe.
Das Skalar war in dem bild irgendwas mit 0,02, normal ist 0,25;
Du musst die Mauskoordinaten in dein eigenes Koordinatenssystem
Das evrscuhe ich doch schon die ganze zeit
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Zeichenprogramm, errechnung der Position eines Punktes

Beitrag von Kerli » Do Jun 11, 2009 3:32 pm

Dein Problem ist das du die Skalierung für die verschiedensten Aktionen teilweise mehrfach anwendest. Und beim Verschieben des Ursprungs skalierst du noch einmal mit 0.5. Ich hab gerade etwas Zeit gehabt:
Form1.cs.zip
Vergleich besonders die Stellen an denen CHANGE steht mit deiner Version.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten