  | 
					
						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: 04.03.2013, 23: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, 08:36, insgesamt einmal bearbeitet | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		St_W
 
  
  Anmeldungsdatum: 22.07.2007 Beiträge: 958 Wohnort: Austria
  | 
		
			
				 Verfasst am: 05.03.2013, 00: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, 08: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, 09: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, 10: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, 18: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, 10: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.
  | 
   
 
     |