Punkte eines Kreises berechnen

  • Hallo Leute,
    ich wollte fragen ob jemand weiß wie man Punkte auf einem Kreis berechnet. Der Radius und der Mittelpunkt ist bekannt.
    Bei Wikipedia hab ich dies hier gefunden allerdings weiß ich dabei nicht was "φ" ist. xm und ym sind denk ich einfach mal andere Punkte?!

    Hoffe mir kann jemand helfen^^
    MfG Sumsum

    3 Mal editiert, zuletzt von sumsum (10. Dezember 2011 um 20:35)

  • Punkte auf dem Bildschirm :D
    Da wo der Kreis halt durch geht.
    Hab die Lösung jetzt genialerweise grade gefunden xD
    Hier
    Sry für den Thread^^


    EDIT:
    Mist :D Mit dieser Methode krieg ich warum auch immer nur etwas mehr als ein Viertel aller Punkte Raus o_O.
    Weiß vielleicht jemand warum?
    Code

    Einmal editiert, zuletzt von sumsum (10. Dezember 2011 um 20:16)

  • Du musst 2*π anstatt 2 nehmen, oder du arbeitest gleich in Grad:

    [autoit]

    Global Const $PI = 3.1415926535897932384626433832795
    Global Const $DegToRad = $PI / 180

    [/autoit][autoit][/autoit][autoit]

    $mx = 0
    $my = 0
    $radius = 1

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To 259 Step 1 ; oder auch To 2*$PI
    $x = $mx + Cos($i*$DegToRad)*$radius ; dann aber überall nur
    $y = $my + Sin($i*$DegToRad)*$radius ; $i statt $i*$DegToRad
    ;...
    Next

    [/autoit]

    MfG, James C.

  • Hi,
    die Punkte auf dem Kreis sind auch ohne trigonometrische Funktionen (sin, cos usw.) zu berechnen.
    Kreisfunktion: x²+y²=1 (Einheitskreis) bzw. (x-xm)²+(y-ym)²=r²

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;Kreisfunktion: x²+y²=1 bzw. (x-xm)²+(y-ym)²=r²
    ;Kreisdaten
    $mittelpunkt_x = 350
    $mittelpunkt_y = 350
    $radius = 300
    $radius_2 = $radius ^ 2

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hgui = GUICreate("Kreis", 700, 700)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui)
    $hPen = _GDIPlus_PenCreate()

    [/autoit] [autoit][/autoit] [autoit]

    ;zu jeder x-Koordinate den passenden Pixel auf der y-Achse bestimmen
    For $x = 0 To $radius * 0.7071; 8 mal ein Achtelkreis ergibt einen ganzen Kreis; 0.771 = 1/2 * Wurzel aus 2 = sin(45) = cos(45)
    $y = Sqrt(($radius_2) - ($x ^ 2)) ;Punkt auf Kreis berechnen
    ;einzelne Pixel setzen
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $mittelpunkt_x + $x, $mittelpunkt_y + $y, 1, 1, $hPen)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $mittelpunkt_x - $x, $mittelpunkt_y + $y, 1, 1, $hPen)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawEllipse($hGraphic, $mittelpunkt_x + $x, $mittelpunkt_y - $y, 1, 1, $hPen)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $mittelpunkt_x - $x, $mittelpunkt_y - $y, 1, 1, $hPen)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawEllipse($hGraphic, $mittelpunkt_x + $y, $mittelpunkt_y - $x, 1, 1, $hPen)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $mittelpunkt_x + $y, $mittelpunkt_y + $x, 1, 1, $hPen)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawEllipse($hGraphic, $mittelpunkt_x - $y, $mittelpunkt_y - $x, 1, 1, $hPen)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $mittelpunkt_x - $y, $mittelpunkt_y + $x, 1, 1, $hPen)

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    ;Vergleich zum GDI+ -Kreis, der den vorhergehenden Kreis "übermalt"
    Sleep(1000)
    $hPen = _GDIPlus_PenCreate(0xFF00FF00,2,2)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $mittelpunkt_x - $radius, $mittelpunkt_y - $radius, $radius * 2, $radius * 2, $hPen)

    [/autoit] [autoit][/autoit] [autoit]

    ; Loop until user exits
    Do
    Until GUIGetMsg() = -3

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up resources
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

    [/autoit]

    Für die (schnelle) grafische Darstellung des Kreises ist wichtig, daß jedem "x-Pixel" nicht mehr als die benötigten "y-Pixel" zugeordnet sind!
    Daher wird meist nicht ein "ganzer" Kreis berechnet, sondern nur ein Achtel-Kreis, und die Punkte an der x- und y-Achse gespiegelt!
    Somit reduziert sich die aufwändige Berechnung auf 12.5%, bzw beschleunigt die Darstelllung um Faktor 8!

    Weiterhin besteht der Vorteil, zu zu jeder x-Koordinate auch nur genau eine y-Koordinate berechnen zu müssen.
    Denn zwangsläufig benötigt man für die Dastellung eines geschlossenen Kreises mehr als die Anzahl von 4*Radius Pixel, nämlich Wurzel aus 2 (1.414) mal mehr...