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

Aktuelle Zeit: Di Jul 15, 2025 17:27

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Zeichnen von vertices in 2D
BeitragVerfasst: Mo Sep 22, 2003 10:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
hi,
ich habe in meinem Editor eine variable vom Typ TStringList. In dieser Liste sind alle meine vertices gespeichert die ich zeichnen möchte. Anschließend gehe ich die Liste mit einer For schleife durch und zeichne jeden vertex auf meinem 2D Canvas.
Code:
  1.  
  2.   //v = TVertex
  3.   //r füllen
  4.   ...
  5.   FBackPuffer.Canvas.Brush.Color := v.DrawColor;
  6.   FBackPuffer.Canvas.FillRect(r);
  7.  

Wenn ich jetzt auf meinem 2d fenster klicke möchte ich den Vertex auswählen den ich auch angeklickt habe. Also berechne ich die Maus position und Prüfe mit IntersectRec ob ich einen vertex ausgewält habe. Das sieht so aus.
Code:
  1.  
  2.   //MausRec berechnen
  3.   for i:=0 to FVertexList.Count-1 do begin
  4.     //VertexRec berechnen
  5.     ...
  6.     if IntersectRect(resultRec,VertexRec,MausRec) then begin
  7.       v := Tvertex(FVertexList.Objects[i]);
  8.       v.pSelected := true;
  9.       break;
  10.     end;
  11.   end;
  12.  

Jetzt geht er die schleife durch und prüft ob in Mausrec der Vertex Rec liegt. Doch wenn zwei vertices an den gleichen x und y Koordinaten liegen aber eine Unterschiedliche Z Koordinate habe. Wähle ich das Untere aus obwohl ich das Obere angeklickt habe. Also müsste ich die Vertices Liste noch vor dem Zeichnen sortieren oder irgend wie so. Ich hoffe ihr könnt mir helfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 10:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Probiers mal so (hab den Syntax allerdings nicht geprüft) :

Code:
  1. var
  2.  MinZ : Single;
  3. begin
  4. MinZ := MaxInt;
  5. //MausRec berechnen
  6. for i:=0 to FVertexList.Count-1 do begin
  7.   //VertexRec berechnen
  8.   ...
  9.   if IntersectRect(resultRec,VertexRec,MausRec) then
  10.    if Tvertex(FVertexList.Objects[i]).Z < MinZ then  
  11.     begin
  12.     v := Tvertex(FVertexList.Objects[i]);
  13.     v.pSelected := true;
  14.     MinZ := v.z;
  15.     end;
  16. end;
  17.  

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 11:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Habe es so gemacht doch leider bringt es nichts. Die Vertices die Hintereinander liegen werden alle Markiert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 11:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ist ja irgendwo auch Logisch. Du gehst ja vom Anfang der List bis zum Ende durch. Du müsstest dir jetzt nur den raussuchen wer am nächsten bei der Kamera liegt und nur den Selektieren. Bevor man einen Punkt selektieren kann muss man erst einmal komplett durch die Liste durch. Sprich du must dir die Position (Index) des Punktes speichern.

Code:
  1. var
  2.   MinZ : Single;
  3.   SelItem: Integer;
  4. begin
  5.   MinZ := MaxInt;
  6.   SelItem := -1;
  7.  
  8.   //MausRec berechnen
  9.   for i:=0 to FVertexList.Count-1 do begin
  10.     //VertexRec berechnen
  11.     ...
  12.     if IntersectRect(resultRec,VertexRec,MausRec) then begin
  13.       if Tvertex(FVertexList.Objects[i]).Z < MinZ then begin
  14.         v := Tvertex(FVertexList.Objects[i]);
  15.         MinZ := v.z;
  16.         SelItem := i;
  17.       end;
  18.     end;
  19.   end;
  20.  
  21.   // nachdem alle Punkte geprüft wurden.
  22.   if (SelItem >= 0) then begin
  23.     v := Tvertex(FVertexList.Objects[SelItem]);
  24.     v.pSelected := true;
  25.    end;
  26. end;


PS: Schau dir mal die TList an. Die speichert nur Pointer in einer Liste. Sozusagen nur Object der TStringList.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 12:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
ok jetzt sieht es schon was besser aus. Aber jetzt makiert er den Hinteren Vertex und nicht den angeklickten.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 12:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich hoffe du meinst die "Frage" nicht ernst???
Wenn doch. ähmmmm. Na ja. Dann versuch einfach mal den Punkt mit dem größten Z Wert herauszufinden!!!

Du müsstest MinZ (MaxZ) dann mit einem Sehr negative Wert initialisieren und dementsprechen den Größten auswählen.
Code:
  1. var
  2.   MaxZ : Single;
  3.   SelItem: Integer;
  4. begin
  5.   MaxZ := -MaxInt;
  6.   ...
  7.       if Tvertex(FVertexList.Objects[i]).Z > MinZ then begin
  8.   ...
  9. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 12:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
:oops: peinlich :oops:
Darauf hätte ich auch kommen können.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 12:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Aber noch eine kleine Frage habe ich. Wenn ich die Vertices auf meinem 2d Fenster zeichne dann muss ich die doch auch in einer Reihenfolge des z wertes zeichnen oder. Ich müsste also eigentlich die Liste nach den Z Werten sortieren oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 12:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wieso solltest du die denn sortieren müssen?Wenn zwei Eckpunkte die gleiche Position haben spielt das doch beim Zeichnen in 2D keine Rolle.Eine Sortierung nach Z ist hier also nicht nötig.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Weil wenn ich zwei vertices habe.V1 und V2 und ich V2 Anklicke. In der Vertex Liste sind sie so gespeichert
V2
V1
Also wird erst V2 gezeichnet und dann V1. Das heist V1 verdeckt V2 bzw V2 wird von V1 überzeichnet und so sieht man nicht das V2 Selektiert wurde oder habe ich da was falsch verstanden?

Ich könnte natürlich auch das Selktierte Object als Letztes zeichnen oder muss ich doch die Liste sortieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 12:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
TOpenGL hat geschrieben:
Ich könnte natürlich auch das Selktierte Object als Letztes zeichnen oder muss ich doch die Liste sortieren?

So mach ich es in ZornEdit.Zuerst zeichne ich ganz normal alle Vertices, und nach der Schleife dann das selektierte.So spart man sich die Sache mit der Sortierung, und Nachteile gibts bei der Sache eigentlich keine.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 22, 2003 12:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
ok danke an euch beiden :D, werde es dann so machen das, das Selektierte Objekt immer zu letzt gezeichnet wird.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.009s | 14 Queries | GZIP : On ]