hallo
hier ma ne frage an die mathematiker unter euch
gibts ne formel die mir berechnet ob ein bestimmter punkt in einer ellipse liegt?
thx schon ma im voraus
hallo
hier ma ne frage an die mathematiker unter euch
gibts ne formel die mir berechnet ob ein bestimmter punkt in einer ellipse liegt?
thx schon ma im voraus
Diese Funktionen hab ich mal geschrieben als ich mein Spiel "Targets" gebastelt habe.
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
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
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
Func _GetPointsDistance($iPointX1, $iPointY1, $iPointX2, $iPointY2)
Return Sqrt(($iPointX1 - $iPointX2) ^ 2 + ($iPointY1 - $iPointY2) ^ 2)
EndFunc ;==>_GetPointsDistance
Aber mal im Ernst: Dafür muss man doch kein Mathematiker sein.
Edit: Sehe gerade, dass du ja von einer Ellipse sprichst... Da greift meine Funktion leider nicht mehr .
So hab mal eine neue Funktion geschrieben .
#include <GDIPlus.au3>
#include <GUIConstants.au3>
$hWnd = GUICreate("EllipseTest", 400, 400)
GUISetState()
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
_GDIPlus_GraphicsSetSmoothingMode($hGraphic, 4)
$iX = 100
$iY = 100
$iWidth = 50
$iHeight = 60
_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
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
Sogar mit Beispiel :D.
Edit: Neue Version! Die Funktion nimmt jetzt nur noch eine Zeile ein.
geil danke
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 .
#include <GDIPlus.au3>
#include <GUIConstants.au3>
$hWnd = GUICreate("EllipseTest", 400, 400)
GUISetState()
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
_GDIPlus_GraphicsSetSmoothingMode($hGraphic, 4)
$iX = 100
$iY = 100
$iWidth = 50
$iHeight = 60
_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
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
So geht es.