Punkte auf Kreislinie errechen

  • Moin

    Also ich häng mal wider Fest und twar kenne ich den Radius eines Kreisen und den zetralpunkt in einem Koordinatensystem. Z.B. möchte ich herrausbekommen, wenn die maus am Rand des Kreises ankommt und dazu brauch ich ja nunmal jeden Punkte auf der Kreislinie, nur wie?

    Due Punkte, die Horizontal und Vertikal sitzen sind logischerewise leich herauszubekommen.

    Muss ich da Irgendwi mit dem Radius ran gehn U = D * pi?

    [Blockierte Grafik: http://s1.directupload.net/images/100611/8yi5whg3.jpg]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • ok auf der seite war ich auch schon ^^

    also mal angenommen xm = 3 und r = 3 und alpha = 45° dann ist xkreislinie = 5,121??

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Nein dann ist der X-Wert des Kreispunktes der bei 45° liegt 5,121.
    Du musst um alle Punkte des Kreises zu bekommen (so hast du es ja geschrieben was du wolltest) alle Winkel von 0°-360° durchgehen.
    Das ist zwar eine unendliche Menge aber es ist die Lösung für diese Aufgabenstellung.

    Ich denke aber eher du suchst etwas anderes - du willst nicht die Punkte haben die auf dem Kreis liegen - du willst eher eine Funktion welche dir sagt ob eine Koordinate in einem Kreis liegt oder nicht.
    Das wär dann lediglich der Satz des Pythagoras angewendet:

    [autoit]

    ;Parameter: $Xm/$YM - Mittelpunktskoordinaten
    ; $R - Radius
    ; $Xp/$Yp - Punktkoordinaten
    Func IsPointInCircle(Const $Xm, Const $Ym, Const $R, Const $Xp, Const $Yp)
    Return ($Xp - $Xm) ^ 2 + ($Yp - $Ym) ^ 2 <= $R ^ 2
    EndFunc

    [/autoit]
  • Nein dann ist der X-Wert des Kreispunktes der bei 45° liegt 5,121.

    das meinte ich auch ^^
    Jo und die Funktionsweise zur überprüfung war mir schon bekannt, das Problem ist aber ich habe einen Kreis in einem Kreis und ich möchte brechnen ob der innere Kreis an den Außeren Stößt. Dazu benötige ic h doch alle Punkte des inneren Kreisen, auf jeden fall ist mir kein andere weg bekannt wie ich das sonst herrausfinden könnte

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Dann drück dich doch gleich von Anfang an klar aus - warum erzählst du das jetzt erst das du die Schnittpunkte von 2 Kreisen haben möchtest? - ist doch ne völlig andere Aufgabenstellung.
    Nimm google - tipp "Bogenschnitt" ein.

  • Dann drück dich doch gleich von Anfang an klar aus - warum erzählst du das jetzt erst das du die Schnittpunkte von 2 Kreisen haben möchtest? - ist doch ne völlig andere Aufgabenstellung.
    Nimm google - tipp "Bogenschnitt" ein.


    naja weil ich dachte, dass wenn ich alle punkte des inneren kreises habe, überprüfen kann ob dieser noch in dem außeren kreis liegt oder nicht aber ich kucke ^^

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • ok damit geht es dann wohl einfacher

    [Blockierte Grafik: http://upload.wikimedia.org/math/d/e/8/de898100ceeeb0f31f5537823f1125d6.png]

    ich versteh nicht was die mit den strichen da meinen ?(

    EDIT: ok ich glaub ich verstehs. Also ist der Radius der Kreises 1 + Radiusdes zweiten Kreises Größer als der Abstand von mitelpunkt von kreis 1 zu mittelpunkt des zweiten kreises gibt es keinen schnittpunkt der beider kreise??

    und an den Abstand komm ich ja einfach mit dem satz den pytagoras

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    2 Mal editiert, zuletzt von Darter (11. Juni 2010 um 10:58)

  • Das ganze gilt dann nicht mehr sobald einer der Kreismittelpunkte im jeweils anderen Kreis liegt.
    Diese Fälle müssen also mit abgefangen werden.
    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include "Misc.au3"

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

    Global Const $Xm1 = 400, $Ym1 = 400, $R1 = 100
    Global Const $Xm2 = 349, $Ym2 = 450, $R2 = 49

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

    If KreiseBeziehung($Xm1, $Ym1, $Xm2, $Ym2, $R1, $R2) Then
    MsgBox(0,"", "Kreise berühren oder schneiden sich")
    Else
    MsgBox(0,"", "Kreise berühren sich nicht")
    EndIf

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

    Func KreiseBeziehung(Const $Xm1, Const $Ym1, Const $Xm2, Const $Ym2, Const $R1, Const $R2)
    Local Const $s = Sqrt(($Xm1 - $Xm2) ^ 2 + ($Ym1 - $Ym2) ^ 2)

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

    If IsPointInCircle($Xm1, $Ym1, $R1, $Xm2, $Ym2) And IsPointInCircle($Xm2, $Ym2, $R2, $Xm1, $Ym1) Then
    Return _Iif($s >= Abs($R1 -$R2), 1, 0)
    ElseIf IsPointInCircle($Xm1, $Ym1, $R1, $Xm2, $Ym2) Then
    Return _Iif($R1 > $s + $R2, 0, 1)
    ElseIf IsPointInCircle($Xm2, $Ym2, $R2, $Xm1, $Ym1) Then
    Return _Iif($R2 > $s + $R1, 0, 1)
    Else
    Return _Iif( $s > $R1 + $R2, 0, 1)
    EndIf
    EndFunc ;==>KreiseBeziehung

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

    Func IsPointInCircle(Const $Xm, Const $Ym, Const $R, Const $Xp, Const $Yp)
    Return ($Xp - $Xm) ^ 2 + ($Yp - $Ym) ^ 2 <= $R ^ 2
    EndFunc ;==>IsPointInCircle

    [/autoit]
  • naja das Funktioniert doch genauso nur eben statt Größer muss der absand von r Außerer Kreis - r innerer Kreis kleiner sein.

    hier mal ein kleines bsp.

    Spoiler anzeigen
    [autoit]

    #Include <GDIPlus.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <MyHover.au3> ;MyHover include
    #include <Array.au3>
    #include<String.au3>
    #Include <Date.au3>

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

    HotKeySet("{UP}","UP")
    HotKeySet("{DOWN}","DOWN")
    HotKeySet("{LEFT}","LEFT")
    HotKeySet("{RIGHT}","RIGHT")

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

    Opt("GUIOnEventMode",1)

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

    Global $hGraphics, $hBitmap, $hBuffer, $hBGBrush, $hKRBrush, $hBGKRBrush

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

    Global $iXPos = 0, $iYPos = 0, $KgID

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

    Global $GUIWidth = 300
    Global $GUIHeight = 300

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

    Global $aKrPos[4] = ["100","200","50","50"]
    Global $MxKrPos = $aKrPos[0] + $aKrPos[2]/2
    Global $MyKrPos = $aKrPos[1] + $aKrPos[3]/2
    Global Const $rKr = $aKrPos[2]/2

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

    Global $aBgKrPos[4] = ["0","0",$GUIWidth,$GUIHeight]
    Global Const $MxBgKrPos = $aBgKrPos[0] + $aBgKrPos[2]/2
    Global Const $MyBgKrPos = $aBgKrPos[1] + $aBgKrPos[3]/2
    Global Const $rBgKr = $aBgKrPos[2]/2

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

    $GUI = GUICreate("Test",$GUIWidth,$GUIHeight)
    Global $hGUI = WinGetHandle($GUI)
    GUISetOnEvent(-3,"_exit")
    GUISetState()
    Draw()

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

    While 1
    Sleep(100)
    schnittpunkt()
    WEnd

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

    Func UP()
    $iYPos -= 1
    EndFunc

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

    Func DOWN()
    $iYPos += 1
    EndFunc

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

    Func LEFT()
    $iXPos -= 1
    EndFunc

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

    Func RIGHT()
    $iXPos += 1
    EndFunc

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

    Func Draw()
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($GUIWidth, $GUIHeight, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $hBGBrush = _GDIPlus_BrushCreateSolid("0x" & Hex(255, 2) & Hex(150, 2) & Hex(150, 2) & Hex(150, 2))
    $hBGKRBrush = _GDIPlus_BrushCreateSolid("0x" & Hex(255, 2) & Hex(250, 2) & Hex(250, 2) & Hex(250, 2))
    $hKRBrush = _GDIPlus_BrushCreateSolid("0x" & Hex(255, 2) & Hex(50, 2) & Hex(50, 2) & Hex(50, 2))

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

    _GDIPlus_GraphicsfillRect($hBuffer, 0, 0, $GUIWidth, $GUIHeight, $hBGBrush);=>Backround
    _GDIPlus_GraphicsFillEllipse($hBuffer, $aBgKrPos[0], $aBgKrPos[1], $aBgKrPos[2], $aBgKrPos[3], $hBGKRBrush)

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

    _GDIPlus_GraphicsFillEllipse($hBuffer, $aKrPos[0], $aKrPos[1], $aKrPos[2], $aKrPos[3], $hKRBrush)

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

    $Standar_damit_ich_2_hab = GUI_Register_Hover($hGUI, 0, 0, 1, 1,"hover", "leave",1,1)
    $KgID = GUI_Register_Hover($hGUI, $aKrPos[0], $aKrPos[1], $aKrPos[2], $aKrPos[3],"hover", "leave",1,1)

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

    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$GUIWidth, $GUIHeight)
    AdlibRegister("Redraw",10)
    EndFunc

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

    Func schnittpunkt()
    If $rBgKr - $rKr < sqrt(($MxBgKrPos-$MxKrPos)^2+($MyBgKrPos-$MyKrPos)^2) Then MsgBox(0,"","")
    EndFunc

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

    Func Redraw()
    GUI_Register_Set_Pos($KgID, $aKrPos[0] + $iXPos, $aKrPos[1] + $iYPos, $aKrPos[2], $aKrPos[3], 0)
    _GDIPlus_GraphicsClear($hBuffer, 0xFF000000)
    _GDIPlus_GraphicsfillRect($hBuffer, 0, 0, $GUIWidth, $GUIHeight, $hBGBrush);=>Backround
    _GDIPlus_GraphicsFillEllipse($hBuffer, 0, 0, $GUIWidth, $GUIHeight, $hBGKRBrush)
    _GDIPlus_GraphicsFillEllipse($hBuffer, $aKrPos[0] + $iXPos, $aKrPos[1] + $iYPos, $aKrPos[2], $aKrPos[3], $hKRBrush)
    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$GUIWidth, $GUIHeight)

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

    $MxKrPos = ($aKrPos[0] + $iXPos) + $aKrPos[2]/2
    $MyKrPos = ($aKrPos[1] + $iYPos) + $aKrPos[3]/2
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Mal davon abgesehen davon das ich das Skript nicht testen kann da die Hover.au3 fehlt.
    Wenn du schon weißt das die Kreismittelpunkte im jeweils anderen liegen und du weißt was der äußere und was der innere Kreis ist ist das kein Problem - dann ist es nur eine Bedingung.
    Aber es ist nicht mehr allgemeingültig und für alle (unbekannten) Kreise lösbar damit.
    Deswegen fange ich diese Fälle extra ab.

  • Mal davon abgesehen davon das ich das Skript nicht testen kann da die Hover.au3 fehlt.
    Wenn du schon weißt das die Kreismittelpunkte im jeweils anderen liegen und du weißt was der äußere und was der innere Kreis ist ist das kein Problem - dann ist es nur eine Bedingung.
    Aber es ist nicht mehr allgemeingültig und für alle (unbekannten) Kreise lösbar damit.
    Deswegen fange ich diese Fälle extra ab.


    oh sorry ja die hiver.au3 brauchste ja nicht kannst einfach auskommentieren , da wos angewendet wird.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.