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. ![]()