punkt innerhalb einer ellipse

  • Diese Funktionen hab ich mal geschrieben als ich mein Spiel "Targets" gebastelt habe. 8)

    Spoiler anzeigen
    [autoit]

    Func _PointIsInCircle($iX_Point, $iY_Point, $iX_Circle, $iY_Circle, $iRadius_Circle)
    $iDistPoints = _GetPointsDistance($iX_Point, $iY_Point, $iX_Circle, $iY_Circle)
    If ($iRadius_Circle > 0 And $iDistPoints < $iRadius_Circle) Or ($iRadius_Circle < 0 And $iDistPoints > $iRadius_Circle) Or $iDistPoints = 0 Then Return True
    Return False
    EndFunc ;==>_PointIsInCircle

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

    Func _CircleIsTouchingCircle($iX_Circle1, $iY_Circle1, $iX_Circle2, $iY_Circle2, $iRadius_Circle1, $iRadius_Circle2)
    $iDistCircles = _GetPointsDistance($iX_Circle1, $iY_Circle1, $iX_Circle2, $iY_Circle2)
    If $iDistCircles < $iRadius_Circle1 + $iRadius_Circle2 Then Return True
    Return False
    EndFunc ;==>_CircleIsTouchingCircle

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

    Func _CircleIsInCircle($iX_Circle1, $iY_Circle1, $iX_Circle2, $iY_Circle2, $iRadius_Circle1, $iRadius_Circle2)
    $iDistCircles = _GetPointsDistance($iX_Circle1, $iY_Circle1, $iX_Circle2, $iY_Circle2)
    If $iRadius_Circle1 > $iRadius_Circle2 And $iDistCircles <= $iRadius_Circle1 - $iRadius_Circle2 Then Return True
    If $iRadius_Circle1 < $iRadius_Circle2 And $iDistCircles <= $iRadius_Circle2 - $iRadius_Circle1 Then Return True
    Return False
    EndFunc ;==>_CircleIsInCircle

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

    Func _GetPointsDistance($iPointX1, $iPointY1, $iPointX2, $iPointY2)
    Return Sqrt(($iPointX1 - $iPointX2) ^ 2 + ($iPointY1 - $iPointY2) ^ 2)
    EndFunc ;==>_GetPointsDistance

    [/autoit]


    Aber mal im Ernst: Dafür muss man doch kein Mathematiker sein. :huh:

    Edit: Sehe gerade, dass du ja von einer Ellipse sprichst... Da greift meine Funktion leider nicht mehr :( .

  • So hab mal eine neue Funktion geschrieben :thumbup: .

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>

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

    $hWnd = GUICreate("EllipseTest", 400, 400)
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, 4)

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

    $iX = 100
    $iY = 100
    $iWidth = 50
    $iHeight = 60

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

    _GDIPlus_GraphicsDrawEllipse($hGraphic, $iX, $iY, $iWidth, $iHeight)

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    If _PointIsInEllipse($nMsg[3], $nMsg[4], $iX + $iWidth / 2, $iY + $iHeight / 2, $iWidth, $iHeight) Then MsgBox(64, "Klick", "Innerhalb der Ellipse")
    EndSwitch
    WEnd

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

    Func _PointIsInEllipse($iX_Point, $iY_Point, $iXM_Ellipse, $iYM_Ellipse, $iWidth_Ellipse, $iHeight_Ellipse)
    Return 1 - Floor(($iX_Point - $iXM_Ellipse) ^ 2 / ($iWidth_Ellipse / 2) ^ 2 + ($iY_Point - $iYM_Ellipse) ^ 2 / ($iHeight_Ellipse / 2) ^ 2)
    EndFunc

    [/autoit]


    Sogar mit Beispiel :D.

    Edit: Neue Version! Die Funktion nimmt jetzt nur noch eine Zeile ein. :P

  • Das kann eigentlich fast nicht gehen. Musst auf 1 prüfen. Weil auch Minuswerte rauskommen wenn du außerhalb von der Ellipse klickst. Und wie wir bereits wissen sind auch Minuswerte True.

    [autoit]

    If _PointIsInEllipse($nMsg[3], $nMsg[4], $iX + $iWidth / 2, $iY + $iHeight / 2, $iWidth, $iHeight) = 1 Then

    [/autoit]
  • Ach verdammt stimmt ja :D .

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>

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

    $hWnd = GUICreate("EllipseTest", 400, 400)
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, 4)

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

    $iX = 100
    $iY = 100
    $iWidth = 50
    $iHeight = 60

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

    _GDIPlus_GraphicsDrawEllipse($hGraphic, $iX, $iY, $iWidth, $iHeight)

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    If _PointIsInEllipse($nMsg[3], $nMsg[4], $iX + $iWidth / 2, $iY + $iHeight / 2, $iWidth, $iHeight) Then MsgBox(64, "Klick", "Innerhalb der Ellipse")
    EndSwitch
    WEnd

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

    Func _PointIsInEllipse($iX_Point, $iY_Point, $iXM_Ellipse, $iYM_Ellipse, $iWidth_Ellipse, $iHeight_Ellipse)
    If ($iX_Point - $iXM_Ellipse) ^ 2 / ($iWidth_Ellipse / 2) ^ 2 + ($iY_Point - $iYM_Ellipse) ^ 2 / ($iHeight_Ellipse / 2) ^ 2 <= 1 Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc

    [/autoit]


    So geht es. ^^