Hallo,
ich habe etwas langweile und wollte ein Radius von XY malen.
Ich habe aber kA wie ich das anstellen soll
Ich will das man als Radius 50 angibt und das er dann von X und Y ein Kreis malt oder ein Rechteck aber in einzelnen Punkten
Beispiel:
[Blockierte Grafik: http://s2.imgimg.de/uploads/radiusdb574a17PNG.png]
Gibt es eine Vormel die mir das ausrechnet oder eine UDF ?
mfg Freaky
Radius berechnen
-
- [ offen ]
-
Freaky -
9. August 2010 um 14:46 -
Geschlossen -
Erledigt
-
-
Nach einfachen googeln bin ich hier gelandet:
http://www.chemieonline.de/forum/showthread.php?t=86769Man findet viiiele formeln dazu, wahrscheinlich auch hier im forum
-
Danke aber ich kann damit nichts anfangen:(
[Blockierte Grafik: http://www.chemieonline.de/images/forum_latex/49b2b2f311f61350176466d900b7bbf1.gif] -
hm dann schau dir am besten mal das an:
[ gelöst ] Dynamischen Kreis zeichnen bzw mit MouseMove abfahren?(progandys antwort am besten )
-
Danke funktioniert sogar
Aber bei mir Zeichnet er kein voll kommenden Kreis.
[Blockierte Grafik: http://s2.imgimg.de/uploads/Kreis57aceec3PNG.png] -
biste dir da sicher?
ich hab progandy's script verwendet und zum Spaß mal mit paint getestet und es läuft einwandfrei
(obwohl die Bewegung nicht gleichmäßig ist, aber das spielt ja keine Rolle oder?) -
Spielt keine Rolle, habe es aber mit GDI+ malen gelassen
Egal kann das aber verkrafte -
Hier noch ein anderer Ansatz:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>Opt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit]_Main()
[/autoit] [autoit][/autoit] [autoit]Func _Main()
[/autoit] [autoit][/autoit] [autoit]
Local $hGUI, $hGraphic; Erstellt eine GUI
[/autoit] [autoit][/autoit] [autoit]
$hGUI = GUICreate("GDI+", 400, 300)
GUISetState(); Zeichnet einen Ellipsenausschnitt mit Verbindung zur Halbachse ("Kuchenstück")
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
_DrawCircle($hGraphic, 50, 100, 100); Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
[/autoit] [autoit][/autoit] [autoit]
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE; Ressourcen freigeben
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()EndFunc ;==>_Main
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _DrawCircle($hGraphic, $Radius, $MitteX, $MitteY)
[/autoit]
Local $Theta, $TempX, $TempY
For $Theta = 0 To 2 * 3.1416 Step 3.1416 / 180
$TempX = $MitteX + cos($Theta) * $Radius
$TempY = $MitteY + sin($Theta) * $Radius
_GDIPlus_GraphicsDrawPie($hGraphic, $TempX, $TempY, 1, 1, 0, 360)
Next
EndFunc -
Danke aber ich wollte halt in einzelnen Punkte um z.B. später mit der Maus abzufahren
-
Du hast die Lösung von Progandy aus dem Thread genommen?
Er nimmt als Laufvariable nicht den Winkel sondern direkt den Koordinatenbereich.
Da die trigonometrischen Funktionen aber nicht linear verlaufen hat man dadurch Gebiete mit großer Punktdichte (kleiner Anstieg) und Bereiche mit hoher Punktdichte.
Deswegen dieser Ungleichmäßige Verlauf.
Lineare Abhängigkeit hast du aber wenn du stattdessen als Laufvariable den Winkel nimmst.
Willst du das dann schau nochmal in den selben Thread bei meiner Antwort weiter oben.Edit: Bzw. Ahnungslos hier über mir hat es ebenfalls über Winkel gelöst
-
Hier wird das auch mit Punkten gemacht, jedoch ist auch dieser nicht "vollkommen"
Spoiler anzeigen
[autoit]#include "GDIP.au3"
[/autoit] [autoit][/autoit] [autoit]
#include$hWnd = GUICreate("Test", 400,400)
[/autoit] [autoit][/autoit] [autoit]
GUISetState()_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$hPen = _GDIPlus_PenCreate(0xFF00FF00)
dim $sPos[2]
$sPos[0] = 200
$sPos[1] = 200
$sSize = 100;Füllen:
[/autoit] [autoit][/autoit] [autoit]
for $y = -$sSize to $sSize step 1
$g = Round(Sqrt($sSize^2 - $y^2)*2)
for $n = 0 to $g step 1
_GDIPlus_GraphicsDrawRect($hGraphic, $sPos[0] -$g/2 + $n , $sPos[1] + $y,1,1)
next
Next
for $y = -$sSize to $sSize step 1
$g = Round(Sqrt($sSize^2 - $y^2))
_GDIPlus_GraphicsDrawRect($hGraphic, $sPos[0] -$g , $sPos[1] + $y,1,1,$hPen)
_GDIPlus_GraphicsDrawRect($hGraphic, $sPos[0] +$g , $sPos[1] + $y,1,1,$hPen)
Next_GDIPlus_GraphicsDispose($hGraphic)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Shutdown()Do
[/autoit]
Until GUIGetMsg() = $GUI_EVENT_CLOSEEdit: Einfach den Kreis 2 mal zeichnen und um 90° gedreht: vielleicht kannst du damit was anfangen!
Spoiler anzeigen
[autoit]#include "GDIP.au3"
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstants.au3>$hWnd = GUICreate("Test", 400,400)
[/autoit] [autoit][/autoit] [autoit]
GUISetState()_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
[/autoit] [autoit][/autoit] [autoit]
$hPen = _GDIPlus_PenCreate(0xFF00FF00)
dim $sPos[2]
$sPos[0] = 200
$sPos[1] = 200
$sSize = 100for $y = -$sSize to $sSize step 1
[/autoit] [autoit][/autoit] [autoit]
$g = Round(Sqrt($sSize^2 - $y^2))
_GDIPlus_GraphicsDrawRect($hGraphic, $sPos[0] -$g , $sPos[1] + $y,1,1,$hPen)
_GDIPlus_GraphicsDrawRect($hGraphic, $sPos[0] +$g , $sPos[1] + $y,1,1,$hPen)
_GDIPlus_GraphicsDrawRect($hGraphic, $sPos[0] +$y , $sPos[1] -$g,1,1,$hPen)
_GDIPlus_GraphicsDrawRect($hGraphic, $sPos[0] +$y , $sPos[1] +$g,1,1,$hPen)
Next_GDIPlus_GraphicsDispose($hGraphic)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Shutdown()Do
[/autoit]
Until GUIGetMsg() = $GUI_EVENT_CLOSE -
Hier mein Vorschlag:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
;coded by UEZ
#include <GDIPlus.au3>
$r = 250
$width = 2 * $r
$height = 2 * $r
$GUI = GUICreate("GDI+", $width, $height)
GUISetState()_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
$Graphic = _GDIPlus_GraphicsCreateFromHWND($GUI)
$Bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $Graphic)
$Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
$Pen_Size = 2
$Pen = _GDIPlus_PenCreate(0xFFF08080, $Pen_Size)
$pi180 = ACos(-1) / 180
$step1 = 2
$step2 = 8While 1
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsClear($Buffer, 0xFFFFFFFF)
_GDIPlus_PenSetColor($Pen, 0xFFF08080)
;zeichne Kreis
For $x = 0 To 359 Step $step1
_GDIPlus_GraphicsDrawEllipse($Buffer, $r + Cos($x * $pi180) * ($r - $Pen_Size - 1), $r + Sin($x * $pi180) * ($r - $Pen_Size - 1), $Pen_Size, $Pen_Size, $Pen)
Next
_GDIPlus_PenSetColor($Pen, 0xFF208040)
;zeichne Rechteck
For $x = 0 To $width Step $step2
_GDIPlus_GraphicsDrawEllipse($Buffer, $x, $Pen_Size, $Pen_Size, $Pen_Size, $Pen)
_GDIPlus_GraphicsDrawEllipse($Buffer, $x, $width - $Pen_Size, $Pen_Size, $Pen_Size, $Pen)
_GDIPlus_GraphicsDrawEllipse($Buffer, $Pen_Size, $x, $Pen_Size, $Pen_Size, $Pen)
_GDIPlus_GraphicsDrawEllipse($Buffer, $height - $Pen_Size, $x, $Pen_Size, $Pen_Size, $Pen)
Next_GDIPlus_GraphicsDrawImageRect($Graphic, $Bitmap, 0, 0, $width, $height)
[/autoit]
Switch GUIGetMsg()
Case -3
_GDIPlus_PenDispose($Pen)
_GDIPlus_GraphicsDispose($Buffer)
_GDIPlus_BitmapDispose($Bitmap)
_GDIPlus_GraphicsDispose($Graphic)
_GDIPlus_Shutdown()
Exit
EndSwitch
sleep(10)
WEndGruß,
UEZ -
Zum Abfragen mit der Maus muss man einfach eine Funktion aufstellen, die zum jeweiligen x Koordinatenwert der Maus passt. Mit der Formel wird überprüft, ob die Maus den Zugehörigen y Koordinaten Wert hat oder nicht. Wenn sie ihn hat dann befindet sie sich auf dem Kreis.
Das Script ist nur ein Schema, hab es daher nicht getestet, kann evtl. Verbesserungen vertragen...
Spoiler anzeigen
[autoit]
[/autoit]
$XMittelpunkt = $iWidth/2
$YMittelpunkt = $iHeight/2
$radius = 50
*GDIPlus starten*
While 1
$alpha = ACos((MouseGetPos(0) - $XMittelpunkt)/$radius)
$Hoehe= $YMittelpunkt * Sin($alpha)*$radius
If MouseGetPos(1) = $Hoehe Then Tooltip("Kreis")
Wend