Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

kreispunkte berechnen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 05.03.2013, 00:31    Titel: kreispunkte berechnen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 05.03.2013, 01:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 05.03.2013, 09:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.03.2013, 10:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 05.03.2013, 11:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.03.2013, 19:33    Titel: Antworten mit Zitat

in OpenGL kann man auch schön GL_TRIANGLE_FAN benutzen um den Kreis direkt zu 'füllen' zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 06.03.2013, 11:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz