Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 07:27

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kopien erzeugen beim Zeichnen
BeitragVerfasst: Do Apr 14, 2011 11:29 
Offline
DGL Member

Registriert: Mo Apr 27, 2009 11:19
Beiträge: 35
Hallo,

ich habe folgendes Problem. Ich habe ein kleines Paintprogramm. Man kann ganz normal zeichnen. Jetzt möchte ich, dass die gezeichnete Linie parallel zum Zeichnen auch rotiert werden kann um einen Winkel. So dass Kopien davon im Bild entstehen.

Hier mein Code-Snippet:

Code:
  1.  
  2. void motion(int mousex,int mousey)
  3. {
  4.     #define num 2220
  5.     GLint h=2;
  6.     GLint winkel=360/h;
  7.     GLintLine list[num];
  8.     static int last=-1;
  9.     list[++last].x =(mousex)-(width/2);
  10.     list[last].y   =(mousey)-(height/2);
  11.     glEnable(GL_LINE_SMOOTH);
  12.     if (last>=1) {
  13.         glBegin(GL_LINE_STRIP);
  14.         for(int i=last-1;i<=last;i++){
  15.             glVertex2i(list[i].x,list[i].y);
  16.         }
  17.         glEnd();
  18.         //glRotated(winkel, 0, 0, 1);
  19.        
  20.     }  
  21.     glDisable(GL_LINE_SMOOTH);
  22.     glFlush();  
  23. }
  24.  
  25. ....
  26.  
  27. int main(int argc, char *argv[])
  28. {
  29.    ...
  30.     glutMotionFunc(motion);                                        
  31.    ...
  32. }      
  33.        
  34.  


Also wie gesagt, funktioniert das Zeichnen ganz normal und gut. Jetzt habe ich das Problem wenn ich glRotate einfüge (so wie es dort auskommentiert ist), natürlich immer nur Teile der Linie rotiert werden. Dadurch erhalte ich dann gepunktelte Linien und umso größer ich h wähle werden die Abstande auch umso größer.

Ich habe nur keine Idee wie ich das Problem lösen könnte. Also ich hatte als Idee die gezeichnete Linie kopieren zu lassen und die Kopie jeweils um den Winkel rotieren zu lassen. Aber wie ich da ran gehen würde, weiß ich nicht. Also wie könnte man eine Linie zeichnen und im gleichen Augenblick Kopien erzeugen, sodass parallel mitgezeichnet wird. Alle meine Überlegungen würden krass lange dauern. Da fehlt mir einfach die Erfahrung für ne elegante Lösung.

Ich hoffe ihr versteht was ich meine. Ich wäre für Anregungen dankbar..

Danke euch


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kopien erzeugen beim Zeichnen
BeitragVerfasst: Do Apr 14, 2011 12:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
glRotate verändert die Transformationsmatrix. Diese Matrix wird beim rendern verwendet um die Vertex-Koordinaten die du in deinem Fall via glVertex2i angibst zu transformieren.
=> du musst glRotate vor dem glBegin aufrufen, welches zu dem Objekt gehört das du rotieren möchtest.

Des weiteren bleibt die Matrix verändert, du willst also beim nächsten Objekt wahrscheinlich eine andere Rotation benutzen. Hier sind glPushMatrix() bzw. glPopMatrix() hilfreich.

Zitat:
Also wie könnte man eine Linie zeichnen und im gleichen Augenblick Kopien erzeugen, sodass parallel mitgezeichnet wird. Alle meine Überlegungen würden krass lange dauern.

Du musst die Linie mehrfach rendern, anders geht es nicht. Wenn dir dies zu langsam erscheint musst du eine andere Technik zum rendern benutzen. Du verwendest den Immediate-Mode (also glBegin...glEnd) welcher ziemlich langsam ist.
Du kannst aber z.B. deine Linie in ein VBO packen und dieses dann mehrfach rendern. Sofern du wirklich große Geometriemengen renderst kann da durchaus ein Faktor 100 an Speed drin sein.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kopien erzeugen beim Zeichnen
BeitragVerfasst: Sa Apr 16, 2011 14:25 
Offline
DGL Member

Registriert: Mo Apr 27, 2009 11:19
Beiträge: 35
Vielen Dank Coolcat für den Tipp, es hat geklappt und es arbeitet jetzt auch schön.

Für alle die es vielleicht interessiert oder braucht, hier meine Überarbeitung:

Code:
  1.  
  2. void motion(int mousex,int mousey)
  3. {
  4.     #define num 2220
  5.     GLint h=12;
  6.     GLint winkel=360/h;
  7.     GLintLine list[num];
  8.     static int last=-1;
  9.     list[++last].x =(mousex)-(width/2);
  10.     list[last].y   =(mousey)-(height/2);
  11.        
  12.     glEnable(GL_LINE_SMOOTH);
  13.         if (last>=1) {
  14.             for(h+1;h>0;h--){
  15.                 glRotated(winkel, 0, 0, 1);
  16.                 glBegin(GL_LINE_STRIP);
  17.                 for(int i=last-1;i<=last;i++){
  18.                     glVertex2i(list[i].x,list[i].y);
  19.                 }
  20.                 glEnd();
  21.             }
  22.         }
  23.     glDisable(GL_LINE_SMOOTH);
  24.     glFlush();
  25. }  
  26.  


Ich hätte auch nochmal ne andere Frage. Ist es möglich static-Variablen zurückzusetzen? Also laut google und co. ist es wohl nicht möglich. Aber vielleicht kennt ihr da irgendwas. Weil mein Problem ist, dass wenn ich zeichne und die Maus absetze und an einer neuen Stelle beginne die neue Linie mit der alten verbunden wird. Das würde ich gerne vermeiden. Ich frage auch schon mit einer glutMouseFunc den Status des mousebuttons ab, aber leider keine Reaktion. Vielleicht nochmal zur veranschaulichung ein Code-Snippet:

Code:
  1.  
  2. void mouse (int button, int state, int x, int y)
  3. {
  4.     if (button==GLUT_LEFT_BUTTON) {
  5.         but_down = (state == GLUT_DOWN) ? 1 : 0;
  6.     }
  7. }
  8.  
  9. void motion(int mousex,int mousey)
  10. {
  11.     #define num 2220
  12.     GLint h=12;
  13.     GLint winkel=360/h;
  14.     GLintLine list[num];
  15.     static int last=-1;
  16.     list[++last].x =(mousex)-(width/2);
  17.     list[last].y   =(mousey)-(height/2);
  18.        
  19.     glEnable(GL_LINE_SMOOTH);
  20.     if (but_down) {
  21.         if (last>=1) {
  22.             for(h+1;h>0;h--){
  23.                 glRotated(winkel, 0, 0, 1);
  24.                 glBegin(GL_LINE_STRIP);
  25.                 for(int i=last-1;i<=last;i++){
  26.                     glVertex2i(list[i].x,list[i].y);
  27.                 }
  28.                 glEnd();
  29.             }
  30.         }
  31.     }
  32.        
  33.     else{
  34.           last=-1;
  35.     }
  36.        
  37.     glDisable(GL_LINE_SMOOTH);
  38.     glFlush();
  39. }  
  40.  


Erstmal sieht es so aus, dass er nie in den else-Bereich springt. Obwohl ich mir dachte, sobald state=0 er doch theoretisch da rein müsste.
Im else-Bereich würde ich dann gern auch last wieder auf -1 setzen, damit er die alten werte überschreibt und von neuem anfängt zu zeichnen, aber da last ja static ist, macht er das nicht. Ich habe es auch schon probiert die Variable global zu setzen, aber das ging auch nicht.

Naja vielen Dank für eure Antworten...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kopien erzeugen beim Zeichnen
BeitragVerfasst: Sa Apr 16, 2011 14:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ich hätte auch nochmal ne andere Frage. Ist es möglich static-Variablen zurückzusetzen?

Ich verstehen nicht ganz was du da haben willst. Natürlich kannst du einer statischen Variable einen neuen Wert zuweisen. Deswegen heißt sie ja Variable und nicht Konstante!

Nichts desto trotz braucht man bei objektorientierter Programmierung normalerweise keine statischen Variablen. Höchstens beim debuggen sind sie schon mal ganz praktisch. Es ist normalerweise sinnvoller solche Variablen als private Attribute auszulegen.

Zitat:
Ich habe es auch schon probiert die Variable global zu setzen, aber das ging auch nicht.

Vermutlich ist da irgendwas anderes faul ;)

Mir erschließt sich z.B. der Sinn dieser Schleife nicht:
Code:
  1. for(h+1;h>0;h--){
  2.     // ...
  3. }

Zum einen erfüllt "h+1" keinerlei Funktion, vielleicht h=h+1? Zum anderen wird h innerhalb der Schleife gar nicht verwendet.

Edit: Achso, das ist die Rotation...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 12 Gäste


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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]