Vectoren berechnen ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Vectoren berechnen ?

Beitrag von nicolaus »

Moin

Wer könnte mir mal dabei helfen ne procedure zu schreiben die Vectoren berechnent?

ich habe x,y,z als gegeben und möchte nun gern nen vector haben. danke schon mal.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

was genau willst du denn berechnen? ein vektor ist nur sowas wie ein wert.

rotation? translation? skalierung?

ansonsten ist ein vektor vom ursprung zum punkt x/y/z einfach x/y/z
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

also ich habe einen ursprungspunkt und darum will ich per OpenGL nen kreis zeichnen und für die einzelnen punkte des kreises (die dann mit linien verbunden werden) brauch ich halt die vectoren. es gibt halt in OpenGL keine funktion die nen kreis zeichnet oder besser ich habe keine gefunden. nun will ich das hgalt mit vecoren selber machen und wenn das nix wird muß ich sehen das ich das mit GLU hin bekomme.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Dafür braucht man eigentlich nur Sinus, Cosiunus und Tangens.
Also du startest im Mittelpunkt des Kreises und bei 0 Grad. (Das ist dann rechts vom Mittelpunkt). Der Radius muss bekannt sein, du musst also wissen wie groß der Kreis sein soll. Jetzt die Koordinaten ausrechnen, wo du dich jetzt mit dem "Stift" befindest:
y = cos(winkel) * radius
x = sin(winkel) * radius
Das ergibt dann die Position wo der erste Punkt hin muss, der Ursprung ist die Kreismitte. Dann gehst du jetzt 1 Grad weiter auf die 360 zu, steigst also praktisch entgegen den Urzeigersinn aufwärts. Wieder mit Sinus und Cosinus die Koordinaten berechnen. Bei kleinen Radien ist dieser jetzt nahe dem ersten Punkt, bei großen Radien kann er stark abweichen. Daher verbinde diese beiden Punkte per Strich, damit es keine einzelnen Punkte bleiben.
Dies wiederholt sich bis du einen vollen Kreis gezogen hast.
Wenn der Radius sehr groß ist und bei 1 Grad Rotation du merkst, dass der Kreis nicht sehr rund aussieht, einfach weil die Abstände der Punkte so groß ist, dass man die Einzelnen Verbindungslinien zwischen den Punkten stark heraussieht, verkleinere den Winkel der immer Erhöht wird auf 0,5 oder 0,25 und probier es nochmal aus. Am besten geht sowas wohl mit einer While-Schleife die anhält bis eine Winkelvariable >= 360 ist. (oder mit einer For-schleife, aber da du eventuell Kommawerte als "Step" hast musst du da etwas umdenken und den Step verzehnfachen und ihn in der Schleife teilen, sonst bekommst du keine Kommawerte hin).
Ansonsten weiß ich jetzt nicht, wass das mit einem Vektor zu tun hat. Bzw. warum hast du x,y,z gegeben, wenn du doch garnicht die Punkte des Kreises kennst... Naja, schau ob du mit dem obigen Text was anstellen kannst und melde dich dann.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

erst mal danke.

ich habe x,y,z des ausgangspunktes der in der mitte is gegeben und da ich auch zoomen kann brauch ich ja auch z.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Aber ein Kreis ist ein 2D-Gebilde. Es gibt da keine dritte Koordinate welche Z ausmacht. Z könnte allerhöchstens die gesamte Ebene sein, auf der sich der Kreis befindet. Dann ist der Mittelpunkt dort, und alle anderen Punkte auch. Mittels glTranslatef(x,y,z) kannst du vor dem kompletten Kreis einfach die Matrix so verschieben, dass sie den Ursprung im Zentrum des Kreises hat (und da kannst du dann auch den Z-Wert des Ursprungs des Kreises nehmen, was den "Zoom" ausmacht) und renderst dann den kompletten Kreis. Dort ist dann zu beachten, dass dein "Z" bei den Vertices immer 0 ist, da du dich nicht mehr von der Ebene anhebst oder absenkst. Wenn du eine 3D-Matrix hast (MODELVIEW) dann wird der Kreis auch entsprechend kleiner dargestellt wenn er weiter hinten m Raum ist. Mit PROJECTION wird der Kreis unabhängig von Z immer gleichgroß dargestellt, da keine 3D-Perspektive errechnet wird.
Mit diesen Infos sollte es nun eigentlich möglich sein, einen Kreis in eine OpenGL-Welt zu basteln.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@nicolaus: Willst du jetzt einen Kreis oder eine Kugel?

Für eine Kugel gibts in OpenGL schon eigene Befehle. Für einen Kreis sicherlich auch, aber da kennt sich DarkDragon glaub ich besser mit aus.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

Kreis Pseudocode, hat auch nichts mit OpenGL per se zu tun:

Code: Alles auswählen

For i=0 To #NUMLINES-1
  x.l = l * Cos(i * 2 * #PI / #NUMLINES)
  y.l = l * Sin(i * 2 * #PI / #NUMLINES)
Next
Könnte in OpenGL dann via GL_LINE_LOOP so aussehen:

Code: Alles auswählen

glBegin_(#GL_LINE_LOOP)

For i=0 To #NUMLINES-1
  angle.f = i*2*#PI/#NUMLINES
  glVertex2f_(Cos(angle), Sin(angle))
Next

glEnd_()
Für eine Kugel könnte man der Einfachheit halber gluSphere_()
benutzen oder eben selbst erzeugen, dafür gibt es aber jede
Menge verschiedener Methoden...

"Zoomen" würde ich über die "Kamera" machen. Um den Kreis
darzustellen, bist Du ja ohnehin in einer 2D Ortho Ansicht.
Antworten