Что нового

Геометрические формулы , работа с кругом и точкой (GUI)

winbotx

Новичок
Сообщения
29
Репутация
0
Добрый день
У меня проблема , которую довольно сложно описать , но я постараюсь.
У меня есть форма AutoIt , на этой форме есть точка , она имеет координаты x и y , заданные скриптом.
Также есть input , я хочу чтобы если туда ввести градус (от -180 до 180) то точка передвигалась на выставленное колличество градусов.
К примеру точка находится ровно по центру формы по ширине и выше центра по высоте я ввожу в input -170 и точка передвигается влево на 10 градусов.
Как это реализовать?
Какая формула?
Спасибо.



Добавлено:
Сообщение автоматически объединено:

Ещё чуть-чуть добавлю что градус между -180 и 180 находится сверху , а снизу находится 0.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
winbotx
Вот сильно урезанный пример с оф форума на такую тему

Код:
#include <GUIConstants.au3>
#include <GDIplus.au3>

Global $title = "GDI+"
Global Const $nPI       = 3.1415926535897932384626433832795
Global Const $PiDiv		= $nPI /180
Global $iRadius   = 200
Global $iCenter   = 600/2 -17
Global $iX1, $iY1, $iN, $Rad,$iT,$R
Global $graphics, $bitmap, $backbuffer, $hGUI,$hBrush
Global $iX = 0, $iY = 0, $Width = 500, $Height = 300, $Col, $hPen, $iWidth = 100, $iHeight =100
Global $ShadowColor = 0xFFFFFF00

$hwnd = GUICreate($title, $width, $height)
$Button = GUICtrlCreateButton("Градус", 30, 12, 61, 25, 0)
$Input = GUICtrlCreateInput("", 100, 12, 151, 24)
GUISetState()

_GDIPlus_Startup()

_GDIPlus_GraphicsSetSmoothingMode($BackBuffer, 2)
$graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
$bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
$backbuffer  = 	_GDIPlus_ImageGetGraphicsContext($bitmap)
$hPen2 = _GDIPlus_PenCreate ($ShadowColor,8)

$ioffset = 90
While 1
$GUIMsg = GUIGetMsg()	
Select
Case $GUIMsg = $Button
$ioffset=GUICtrlRead ($Input)
Case $GUIMsg = $GUI_EVENT_CLOSE
Exit
EndSelect
	;For $i = 0 + $ioffset  to 360 + $ioffset step 1
		$i = 0 + $ioffset
		_GDIPlus_GraphicsClear($BackBuffer, 0x50FFFFFF)	
		$iX = 0
		$iY = 0

			$eRadius = 300
			$Ex = $Width/ 4
			$Ey = $Ex
			
			$Center = $Height/2
			$R = ($PiDiv) - ($i * ($PiDiv))
			$iX1 = $Center + Cos($R) * $eRadius /2
			$iY1 = $Center - Sin($R) * $eRadius /2
			_GDIPlus_GraphicsDrawLine($Backbuffer, $Center, $Center, $iX1, $iY1, $hPen2)
		
		Sleep(30)

		_GDIPlus_GraphicsDrawImageRect($graphics, $bitmap, 40, 40, $width, $height)
	;Next
Wend
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
winbotx,
Переделайте сами для окна.
Код:
Global $iR = @DesktopHeight / 2 - 20, $iX = @DesktopWidth / 2, $iY = @DesktopHeight / 2

HotKeySet('{F5}', '_MouseCircle')
HotKeySet('{ESC}', '_Exit')

While 1
	Sleep(20)
WEnd

Func _MouseCircle()
	Local Const $degToRad = 4 * ATan(1) / 180
	MouseMove($iX + $iR, $iY, 0)
	$i = 0
	While 1
		$i += 5
		MouseMove($iX + $iR * Cos($i * $degToRad), $iY + $iR * Sin($i * $degToRad), 0)
		Sleep(3)
	WEnd
EndFunc   ;==>_MouseCircle

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Сам переделал. :smile:
Код:
#include <GUIConstantsEx.au3>

Global Const $degToRad = 4 * ATan(1) / 180
Global $iXc = 150, $iYc = 200, $iMov = 270, $iX = 140, $iY = 340, $iR = 140, $iStep = 5

$hGui = GUICreate('Test', 300, 350)
$nBtn = GUICtrlCreateButton('Click', 10, 10, 60, 30)
$nBtnCircle = GUICtrlCreateButton('Circle', 230, 10, 60, 30)
GUICtrlCreateLabel('', 0, 50, 300, 300)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlCreateLabel('', $iXc - 2, $iYc - 2, 4, 4)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0xFF0000)
$nLbl = GUICtrlCreateLabel('', $iXc - $iR * Cos($iMov * $degToRad) - 2, $iYc - $iR * Sin($iMov * $degToRad) - 2, 4, 4)
GUICtrlSetBkColor(-1, 0x000000)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nBtn
			$iMov += $iStep
			$iX = $iXc - $iR * Cos($iMov * $degToRad) - 2
			$iY = $iYc - $iR * Sin($iMov * $degToRad) - 2
			ControlMove($hGui, '', $nLbl, $iX, $iY)
		Case $nBtnCircle
			$iStep = -$iStep
			$iMov = 270
			For $i = 1 To 360 Step 5
				$iMov += $iStep
				$iX = $iXc - $iR * Cos($iMov * $degToRad) - 2
				$iY = $iYc - $iR * Sin($iMov * $degToRad) - 2
				ControlMove($hGui, '', $nLbl, $iX, $iY)
				Sleep(5)
			Next
	EndSwitch
WEnd
 
Автор
W

winbotx

Новичок
Сообщения
29
Репутация
0
Спасибо огромное ! :laugh:
Остался только один вопрос , от чего зависит (где прописано) где будет начальная точка к которой прибавляються градусы?
(В вашем примере она внизу по центру)
 

Mur

Осваивающий
Сообщения
132
Репутация
32
где будет начальная точка к которой прибавляються градусы?
(В вашем примере она внизу по центру)
Код:
Global Const $degToRad = 4 * ATan(1) / 180
 
Автор
W

winbotx

Новичок
Сообщения
29
Репутация
0
Спасибо , простите что задаю много вопросов)
Скажите пожалуйста , как изменить эту строчку чтобы точка была сверху по центру , либо слево , справо ? Спасибо ^^
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
winbotx
OffTopic:
Геометрию учить надо :smile:
 

Mur

Осваивающий
Сообщения
132
Репутация
32
8 -слева, 12 по центру сверху, 16 -справа
Например:
Код:
Global Const $degToRad = 12 * ATan(1) / 180

Можно и по-другому сделать, но я так менял.

DarWiM, мне тоже (=
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Только так он делает несколько оборотов.. ;)
 

Mur

Осваивающий
Сообщения
132
Репутация
32
Я же говорю - мне тоже ;D
Код:
Global $iXc = 150, $iYc = 200, $iMov = 270, $iX = 140, $iY = 340, $iR = 140, $iStep = 5

$iMov - место где будет начальная точка в градусах
Если нужно чтоб вернулась туда-же, то в Case тоже надо поменять значение.
Сделает единственный оборот.

Потому что менять так, как я сейчас описал выше, было лень...
 
Автор
W

winbotx

Новичок
Сообщения
29
Репутация
0
Почти всё идеально , но никак не могу сделать как мне надо.
Вот код :

Код:
#include <GUIConstantsEx.au3>
#include <NomadMemory.au3>

Global Const $degToRad = 8 * ATan(1) / 360
Global $iXc = 150, $iYc = 200, $iMov = 0, $iX = 140, $iY = 340, $iR = 140, $iStep = 1

$hGui = GUICreate('Test', 300, 350)
$nBtn = GUICtrlCreateButton('Click', 10, 10, 60, 30)
$nBtnCircle = GUICtrlCreateButton('Circle', 230, 10, 60, 30)
GUICtrlCreateLabel('', 0, 50, 300, 300)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlCreateLabel('', $iXc, $iYc, 4, 4)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0xFF0000)
$nLbl = GUICtrlCreateLabel('', $iXc - $iR * Cos($iMov * $degToRad) - 2, $iYc - $iR * Sin($iMov * $degToRad) - 2, 4, 4)
GUICtrlSetBkColor(-1, 0x000000)
GUISetState()


		 
While 1

		
	
	
	$iStep = GUICtrlRead($input) ;< вообще здесь , вместо этого чтение памяти игры ...
	  $iMov = $iStep
	  
            $iX = $iXc - $iR * Cos($iStep * $degToRad) - 2
            $iY = $iYc - $iR * Sin($iStep * $degToRad) - 2
            ControlMove($hGui, '', $nLbl, $iX, $iY)
WEnd



Дело в том , что когда я в игре смотрю на 0 градусов , точка находится слево , смотрю на 180 градусов , точка справо , а мне нужно чтобы когда я смотрю на 0 она была наверху ,а когда я смотрю на 180/-180 - внизу...
Не знаю как сделать.
P.S
OffTopic:
Да уш , мне надо учить геометрию :D
 

Mur

Осваивающий
Сообщения
132
Репутация
32
Поменять местами синусы и косинусы.

Код:
#include <GUIConstantsEx.au3>

Global Const $degToRad = 4 * ATan(1) / 180
Global $iXc = 150, $iYc = 200, $iMov = 0, $iX = 140, $iY = 340, $iR = 140, $iStep = 5

$hGui = GUICreate('Test', 300, 350)
$nBtn = GUICtrlCreateButton('Click', 10, 10, 60, 30)
$nBtnCircle = GUICtrlCreateButton('Circle', 230, 10, 60, 30)
GUICtrlCreateLabel('', 0, 50, 300, 300)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlCreateLabel('', $iXc - 2, $iYc - 2, 4, 4)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0xFF0000)
$nLbl = GUICtrlCreateLabel('', $iXc - $iR * sin($iMov * $degToRad) - 2, $iYc - $iR * cos($iMov * $degToRad) - 2, 4, 4)
GUICtrlSetBkColor(-1, 0x000000)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nBtn
            $iMov += $iStep
            $iX = $iXc - $iR * sin($iMov * $degToRad) - 2
            $iY = $iYc - $iR * cos($iMov * $degToRad) - 2
            ControlMove($hGui, '', $nLbl, $iX, $iY)
        Case $nBtnCircle
            $iStep = -$iStep
            $iMov = 0
            For $i = 1 To 360 Step 5
                $iMov += $iStep
                $iX = $iXc - $iR * sin($iMov * $degToRad) - 2
                $iY = $iYc - $iR * cos($iMov * $degToRad) - 2
                ControlMove($hGui, '', $nLbl, $iX, $iY)
                Sleep(5)
            Next
    EndSwitch
WEnd


Точка "в ноле" сверху.
 
Автор
W

winbotx

Новичок
Сообщения
29
Репутация
0
Всё , проблему решил сам , всем кто отписался - Спасибо
 
Верх