 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 05.03.2013, 00:31 Titel: kreispunkte berechnen |
|
|
hi leute bin mir nicht sicher ob ich mit der Frage an der richtigen stelle im forum bin. falls nicht bitte verschieben.
Ich hab mir mal das code-bsp 3d ohne libs von tjf angesehen. dort ließt er die 8 eckkoordinaten eines würfels mit read ein und verbindet diese mit Line.
Da ich einen Kreis benötige (erstmal kein zylinder) wollte ich es mit 12, oder auch mehr, eckpunkten versuchen. Doch leider bekomm ich es nicht so ganz gebacken die koordinaten dafür zu berechnen.
tjf's koordinatensystem scheint ähnlich oder genaus so zu sein wie in opengl, also mit einser schritten.
Mein kreismittelpunkt soll auf der bildmitte sein (also 0) und der durchmesser 2 (also von -1 bis 1).
wie kann man diese punkte berechnen?
Zuletzt bearbeitet von braesident am 05.03.2013, 09:36, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 05.03.2013, 01:24 Titel: |
|
|
Wenn es dir nur darum geht, die Koordinaten der Kreislinie an einem bestimmten Winkel auszurechnen, benötigst du nur Sinus und Cosinus.
Sei (mx, my) der Mittelpunkt eines Kreises mit Radius r. Dann kannst du dir den Punkt (x, y) auf der Kreislinie bei Winkel a (in Radianten) wie folgt ausrechnen:
x = xm + r * cos(a)
y = ym + r * sin(a)
Kann leicht sein, dass es in OpenGL Möglichkeiten gibt, dies effizient/näherungsweise zu Berechnen - davon hab ich keine Ahnung; obiges sind rein Mathematische Grundlagen. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 05.03.2013, 09:10 Titel: |
|
|
danke das hab ich gesucht. allerdings hab ich da wohl was mit dem winkel nicht verstanden. Also ein Kreis hat doch 360° - wenn ich nun ein Kreis aus 30 punkten darstellen möchte müsste doch a = 12 sein (also 30°*12=360°) ?
Doch bei einem Testlauf bekomme zwar ein Kreis doch mit a = 12 sind es dann immer 3 Punkte in Folge, dann eine kleine Lücke und wieder 3 Punkte usw.
mit a = 1 sieht es dann schon viel besser aus die Punkte gehen einmal rum aber immer noch leicht ungleichmäßige Abstände.
Code: | screenres 800, 600, 32
dim as integer xm = 100, ym = 100, r = 50, a = 1, i, x, y
pset (xm, ym)
for i = 1 to 30
x = xm + r * cos(i*a)
y = ym + r * sin(i*a)
pset (x, y)
next
getkey
|
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.03.2013, 10:08 Titel: |
|
|
Code: | CONST Deg2Rad = ATN(1)/45 '=PI/180
screenres 800, 600, 32
Dim as Integer mitteX = 400, mitteY = 300, radius = 50, Segmente = 30
Dim as Integer Sx, Sy
Dim as Single Winkel, WinkelpS, WinkelR
'Punkt in Kreismitte
pset (mitteX, mitteY)
'Anfangswinkel auf 0
Winkel = 0
'Winkelschritt (per Segment)
WinkelpS = 360/Segmente
For s as Integer = 1 to Segmente
'Winkel in Rad
WinkelR = Deg2Rad*Winkel
Sx = mitteX + cos(WinkelR) * radius
Sy = mitteY + sin(WinkelR) * radius
'Segment Punkt
pset (Sx, Sy)
'Winkel für nächstes Segment erhöhen
Winkel += WinkelpS
Next s
Sleep |
_________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 05.03.2013, 11:53 Titel: |
|
|
Hi braesident,
denk daran das in Basic alle Winkelfunktionen im Bogenmaß (2*Pi = 360°) berechnet werden.
Code: | ScreenRes 800, 600, 32
Dim As Integer xm = 100, ym = 100, r = 50, i, x, y
Dim As Single a=Atn(1)*4/15 'PI=Atn(1)*4 , PI/15 => 12°
PSet (xm, ym)
For i = 1 To 30
x = xm + r * Cos(i*a)
y = ym + r * Sin(i*a)
PSet (x, y)
Next
GetKey |
EDIT
Code: | #Include "GL/gl.bi"
#Include "GL/glu.bi"
ScreenRes 640, 480, 32,, 2
WindowTitle "OpenGL Kreis"
Dim As Single a
glViewport 0, 0, 640, 480
glMatrixMode GL_PROJECTION
glLoadIdentity
gluPerspective 45.0, 640.0/480.0, 0.1, 100.0
glMatrixMode GL_MODELVIEW
glLoadIdentity
a = Atn(1)*4/15
Do
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
glLoadIdentity
glTranslatef -1.5, 0.0, -6.0
glBegin GL_LINE_STRIP
For i As Integer = 0 To 30
glVertex3f( Cos(i*a), Sin(i*a), 0.0 )
Next
glEnd
Flip
Loop While InKey = "" |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.03.2013, 19:33 Titel: |
|
|
in OpenGL kann man auch schön GL_TRIANGLE_FAN benutzen um den Kreis direkt zu 'füllen'
Code: | #Include "GL/gl.bi"
CONST Pi = ATN(1)*4
CONST Deg2Rad = ATN(1)/45
screenres 800, 600, 32,, 2
Sub Kreis(byval mitteX as Single, byval mitteY as Single, byval radius as Single, byval Segmente as Integer = 16)
Dim as Single Winkel, WinkelpS, WinkelR, Sx, Sy
'Winkelschritt (per Segment)
WinkelpS = 360/Segmente
'Anfangswinkel auf 0
Winkel = 0
glBegin GL_TRIANGLE_FAN
'mitte
glVertex3f( mitteX, mitteY, 0.0 )
For s as Integer = 0 to Segmente
'Winkel in Bogenmaß
WinkelR = Deg2Rad*Winkel
Sx = mitteX + cos(WinkelR) * radius
Sy = mitteY + sin(WinkelR) * radius
glVertex3f( Sx, Sy, 0.0 )
'Winkel für nächstes Segment erhöhen
Winkel += WinkelpS
Next s
glEnd()
End Sub
'Macht das selbe wie gluPerspective nur eben ohne glu (wozu eine ganze Lib einbinden wenn man eh nur eine Funktion benötigt...)
Sub SetPerspective(byval fieldOfView as Single, byval aspect as Single, byval zNear as Single, byval zFar as Single)
Dim as Single fH, fW
fH = tan( fieldOfView / 360.0f * Pi) * zNear
fW = fH * aspect
glFrustum( -fW, fW, -fH, fH, zNear, zFar )
End Sub
WindowTitle "OpenGL Kreis"
Dim As Single a
glMatrixMode GL_PROJECTION
glLoadIdentity
setPerspective 45.0, 800.0/600.0, 0.1, 100.0
glMatrixMode GL_MODELVIEW
glLoadIdentity
glClearColor 0.0, 0.0, 0.0, 0.0
Do
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
glLoadIdentity
glTranslatef 0.0, 0.0, -6.0
glColor3f 1.0,0.0,0.0
Kreis(0,0,1,10)
glColor3f 0.2,0.0,0.9
Kreis(1.1,0,0.5)
Flip
Loop While InKey = "" |
_________________
 |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 06.03.2013, 11:55 Titel: |
|
|
danke das war die formel die ich brauchte.
opengl wollt ich ja vermeiden da ich einen tranparenten hintergrond brauch.
Trotzdem danke.
Da hab ich aber schon ein neues Prob, kommt in einem neuen Post. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|