ich habe ein Rechteck. Dieses möchte ich nun so zeichnen, dass man immer das ganze Rechteck sieht (also im Viewport). Dabei soll so viel wie Möglich Raum genutzt werden, da Freiflächen hier eher ungünstig sind, da dadurch Präzision verloren gehen würde, und die Seitenverhältnisse sollten immer bestehen bleiben (also Skalierung in x-Richtung = Skalierung in y-Richtung).
Das habe ich gerade versucht, bin aber gescheitert .
Code:
procedure TFoldPoly.PaintCanvas;
begin
glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
Allerdings gibt es noch eine Stelle, die mir nicht gefällt . Wenn z.B. das Rechteck(Polygon) eine Ausdehnung von 1x1 hat und das Fenster eine Größe von 100x100 hat, zeichnet er rechts und oben nicht die Begrenzungslinien des Rechtecks (logisch, da 1Px = 0...]1 ). Wo muss ich hier was anpassen, damit er diese genau noch am Rand zeichnet?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich persönlich würde für glOrtho keine Werte von 0-1 (dein Beispiel) wählen sondern immer die Größe des Clientbereiches des Fensters benutzen. Also genaue Pixelangaben. Falls später noch etwas hinzukommen soll dann würde das dadurch einfacher werden. Und besonders im Falle deiner Linie wäre das leicht. Da würdest du als Zeichenbreiben/höhe eben ein Pixel weniger wählen.
Da du jetzt aber die Größe des glOrthos anders gewählt hast müsstest du dort durch umrechnungen herrausfinden wie breit ein Pixel in deinen Maßen ist und das beim Zeichen der Linie mit abziehen. Also in deinem Falle müsstest du 0.001 von der Breite bzw Höhe abziehen.
PS: Bei 100x100 Pixel großen Bildern würde der äußere Rand immer überschrieben werden. Von daher wäre das Ergebniss nicht immer korrekt. Bzw bei dem jetzigen Code würde immer die linke und obere Spalte/Reihe von der Linie übermalt werden.
PS: Bei 100x100 Pixel großen Bildern würde der äußere Rand immer überschrieben werden. Von daher wäre das Ergebniss nicht immer korrekt. Bzw bei dem jetzigen Code würde immer die linke und obere Spalte/Reihe von der Linie übermalt werden.
Das ist ja genau das, was mich noch stört, wie iches bereits geschrieben hatte.
Lossy eX hat geschrieben:
Also ich persönlich würde für glOrtho keine Werte von 0-1 (dein Beispiel) wählen sondern immer die Größe des Clientbereiches des Fensters benutzen. Also genaue Pixelangaben. Falls später noch etwas hinzukommen soll dann würde das dadurch einfacher werden. Und besonders im Falle deiner Linie wäre das leicht. Da würdest du als Zeichenbreiben/höhe eben ein Pixel weniger wählen.
Daran hatte ich auch schon gedacht. Nur ist es doch im OnPaint-ereignis dann doof, weil ich bei jeder Linie dann mit dem Faktor arbeiten müsste. Oder geht es auch schön mit dem glScale-Befehl? Doer kommt dann das gleiche raus wie ich es bisher habe?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also mit glScale würdest du da sicherlich auch was machen können. Aber hast du das Problem, dass deine Linie nicht GENAU neben dem Bild sondern die Einheiten wieder skaliert wären. Damit würdest du wieder nur eine Schätzung berechnen.
Und bei jeder Linie neu berechnen? Versteh deinen Satz nicht. Oder meinst du bei jedem Zeichnen neu berechnen? Das ist aber quatsch, weil du deine Werte jetzt auch nur im Resize berechnest und diese Ergebnisse zwischenspeicherst.
Ich habe mir gerade stark überlegt ob ich doch noch etwas zappeln lassen soll. Aber ich bin mal nicht so. Frag mich nicht warum. Das Ganze ist zwar mit einem Image gemacht aber das auf OpenGL umzubiegen sollte hoffentlich kein Problem sein. Das image wird so platziert, dass genau 1 Pixel Luft ist. Wenn du deinen Rand dann Links und Oben -1 Pixel und recht und unten bündig zeichnest liegt er genau drumherum.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Du musst wenn dann die Werte im OnResize berechnen! Die speicherst du dann fix in Variablen. Außerdem reden wir hier gerade über lächerliche 8 Multiplikationen??? Von denen 4 sowieso 0 ergeben. Das 200fache von 0 ist?
Aber Pixelgenau ist das trotzdem nicht. Schau mal. Das wird nur berechnet wenn sich die Größe ändert und da ist immer noch Platz für ein einziges Pixel.
Code:
var
fTop, fLeft, fRight, fBottom:Integer;
function glResizeWindow(Width, Height:Integer):Boolean;
var
IWidth, IHeight:Integer;
CWidth, CHeight:Integer;
FaqF, FaqI:Single;
begin
...
glOrtho(0, Width, Height,0,1,100.0);
...
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
IWidth := Test.Width;
IHeight := Test.Height;
CWidth := Width -1;
CHeight := Height -1;
FaqF := CWidth / CHeight;
FaqI := Test.Width/ Test.Height;
if FaqI > FaqF thenbegin
fBottom :=Round(CWidth / IWidth * IHeight);
fRight := CWidth;
fLeft :=1;
fTop :=(CHeight div2)-(fBottom div2);
fBottom := fTop + fBottom;
endelsebegin
fBottom := CHeight;
fRight :=Round(CHeight / IHeight * IWidth);
fLeft :=(CWidth div2)-(fRight div2);
fTop :=1;
fRight := fLeft + fRight;
end;
end;
procedure Render
begin
// clear screen and depth buffer
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Du musst wenn dann die Werte im OnResize berechnen! Die speicherst du dann fix in Variablen. Außerdem reden wir hier gerade über lächerliche 8 Multiplikationen??? Von denen 4 sowieso 0 ergeben. Das 200fache von 0 ist?
Das ist doch nur nen Beispiel. Wenn das sowenig sind, würde ich mich ja schon nicht drum kümmern. Aber sobald man ein paar tausend Korrdinaten hat, wie es bei mir der Fall sein wird, fällt das langsam doch ins Gewicht.
Was ich bei deinem Code noch nicht ganz verstehe: Wes wegen kommt das aufs gleiche? Du machst Ortho Pixelgenau. Zeichnen tust du aber mit konstanten-->passt sich bei Größenveränderung nicht an...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
SunBlack hat geschrieben:
Aber sobald man ein paar tausend Korrdinaten hat, wie es bei mir der Fall sein wird, fällt das langsam doch ins Gewicht.
Nützliche Hintergrundinfo! Du hast doch bisher immer nur von einem Rechteckt gesprochen oder habe ich das was überlesen?? Wenn nicht. Frage ich doch mal anders. Dann erkläre uns doch mal bitte GENAU was du damit vor hast!!
SunBlack hat geschrieben:
Was ich bei deinem Code noch nicht ganz verstehe: Wes wegen kommt das aufs gleiche? Du machst Ortho Pixelgenau. Zeichnen tust du aber mit konstanten-->passt sich bei Größenveränderung nicht an...
Ja glOrtho ist Pixelgenau aber in dem Resize berechne ich die Größe bzw die Variablen neu. Weswegen sich das im Resize anpasst. Aber auch nur dort.
Aber sobald man ein paar tausend Korrdinaten hat, wie es bei mir der Fall sein wird, fällt das langsam doch ins Gewicht.
Nützliche Hintergrundinfo! Du hast doch bisher immer nur von einem Rechteckt gesprochen oder habe ich das was überlesen?? Wenn nicht. Frage ich doch mal anders. Dann erkläre uns doch mal bitte GENAU was du damit vor hast!!
Die Aufgabenstellung siehe hier. Das Ergebnis will ich eben mit OpenGL ausgeben, dass ich nicht runden etc. muss. Und wenn du dir die Aufgabe zu Ende denkst, weiß du, dass 1000 Eckpunkte ohne Probleme vorkommen dürften . Da ich immer sofort das Endresultat ausgebe und der Benutzer am Endresultat seine nächsten Schritte dem Programm "klar macht", will ich eben den ganzen Platz ausnutzten, ohne das aber Verzehrungseffekte auftreten.
Lossy eX hat geschrieben:
SunBlack hat geschrieben:
Was ich bei deinem Code noch nicht ganz verstehe: Wes wegen kommt das aufs gleiche? Du machst Ortho Pixelgenau. Zeichnen tust du aber mit konstanten-->passt sich bei Größenveränderung nicht an...
Ja glOrtho ist Pixelgenau aber in dem Resize berechne ich die Größe bzw die Variablen neu. Weswegen sich das im Resize anpasst. Aber auch nur dort.
Ich habe übersehen, dass das erste ja die Texturkoordinaten waren und erst das zweite die eigentlichen Koordinaten. Dadurch hatte ich mir nur die ersten koordinaten angeguckt .
Was mir bei deinem Code noch nicht ganz gefällt ist das round (kann sein weil ich schon nen Knoten im Kopf habe ) und das ich später immer mit fTop etc. arbeiten muss (was ich über glScale gerne weg haben würde).
PS: fLeft + fTop könnte man durch glTranslate wegbekommen (habe ich bei mir jetzt so gemacht).
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
SunBlack hat geschrieben:
Die Aufgabenstellung...
Ist dir aufgefallen, dass dort 3 Aufgaben zu finden sind? Außerdem dachte ich eher an etwas wobei ich mir nicht erst noch das Grundgerüst überlegen muss. Mit anderen Worten du hast dir Gedanken zu Deiner Aufgabe (In einem Wettbewerb) gemacht wie du das Problem lösen kannst aber es hackt an der Darstellung. Und das ist das was ich wissen wollte. Also was du dort darstellen möchtest und wie du das tun möchtest.
Ist dir aufgefallen, dass dort 3 Aufgaben zu finden sind?
Jupp. Ist mir danach auch eingefallen, dass ich es nicht geschreiben hatte. Da es aber nur eine Aufgabe gibt, die groß etwas mit Grafik zu tun hat (die 3. gar nicht und bei der 2. wäre OpenGL auch übertrieben ), dachte ich, dass du dann selber darauf kommst.
Lossy eX hat geschrieben:
Außerdem dachte ich eher an etwas wobei ich mir nicht erst noch das Grundgerüst überlegen muss. Mit anderen Worten du hast dir Gedanken zu Deiner Aufgabe (In einem Wettbewerb) gemacht wie du das Problem lösen kannst aber es hackt an der Darstellung. Und das ist das was ich wissen wollte. Also was du dort darstellen möchtest und wie du das tun möchtest.
Das Grundgerüst brauchste dir da nicht ausdenken. Die Beispielgrafik ist auch schon ein gutes Beispiel. Mir geht es darum, dass die Endfigur den kompletten "Bildschirm" ausfüllt, also dass das Gebilde so groß wie möglich dargestellt wird, ohne dass man etwas nicht sieht. Das Rechteck, was ich bisher drinne habe soll die Ausgangsgröße darstelllen, also wie das Papier von der Größe vor den Falt- und Schneideaktionen war.
zu PS: Hast Du den Feuerfuchs? dann ist das normal. Mach Dir en Lesezeichen direkt auf die Forumshauptseite dann klappt das. Ich hatte das Problem auch, wenn ich erst auf die Hauptseite bin und dann dort über den Link ins Forum.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
zu PS: Hast Du den Feuerfuchs? dann ist das normal. Mach Dir en Lesezeichen direkt auf die Forumshauptseite dann klappt das. Ich hatte das Problem auch, wenn ich erst auf die Hauptseite bin und dann dort über den Link ins Forum.
Jupp FF. Aber auch mit Lesezeichen funktioniert es nicht (habs auf http://delphigl.com bisher immer liegen). Und meistens bräuchte ich es eh über Thunderbrid, da ich über die Links da meistens reingehe .
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.