forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=48)
-   -   Джойстик(Сенсорный экран) (http://forum.boolean.name/showthread.php?t=17511)

Atqt 12.11.2012 18:43

Джойстик(Сенсорный экран)
 
Вложений: 1
Подскажите, как сделать так чтобы изображение джойстика которое следует за пальцем/пером не могло выйти за круглую огранку. Пример прилагается.

ffinder 12.11.2012 19:07

Ответ: Джойстик(Сенсорный экран)
 
у тебя есть радиус "пэда" (padRadius), и радиус "кнопки" (buttonRadius)
максимальное отклонение центра кнопки тогда может быть padRadius - buttonRadius

есть координаты центра пэда и координаты центра кнопки, по теореме Пифагора находим расстояние между ними и смотрим, чтобы оно не превышало предельную длину.

Atqt 12.11.2012 19:29

Ответ: Джойстик(Сенсорный экран)
 
Допустим нахожу по т. Пифагора значение отклонения и оно превысило норму, то каким образом из этого можно узнать нормальные координаты кнопки?

den 12.11.2012 19:33

Ответ: Джойстик(Сенсорный экран)
 
Находишь вектор кнопки: координаты пальца минус координаты центра большого кружка. Нормализуешь его (делишь каждую компоненту на длину). Потом умножаешь на разницу между радиусом большого кружка и маленького. Прибавляешь координаты большого кружка.

Atqt 12.11.2012 20:48

Ответ: Джойстик(Сенсорный экран)
 
Вот то что пишу:
Размер пада 240,240
Размер кнопки 80,80
al, bl, c - переменные для вычисления т. Пифагора
size.X, size.Y - перменнаые хранящие размер кнопки
sizeJ.X, sizeJ.Y - перменнаые хранящие размер пада
pos.X, pos.Y - переменные хранящие координаты кнопки
posJ.X, posJ.Y - переменные хранящие координаты пада
tc.X, tc.Y - переменные хранящие координаты нажатия
isHit - переменная для проверки попадания в пад
vB.X, vB.y - переменная нормализованного вектора
al = pos.X - (posJ.X + size.X / 2) - size.X;
if (al < 0) { al *= -1; }
bl = pos.Y - (posJ.Y + size.Y / 2) - size.Y;
if (bl < 0) { bl *= -1; }
c = Sqrt(al^2 + b^2);
if (tc.X > posJ.X && tc.X < posJ.X + sizeJ.X &&
tc.Y > posJ.Y && tc.Y < posJ.Y + sizeJ.Y)
{ isHit = true; }
else { isHit = false; };
if (isHit)
{
if (c > 80)
{
vB.X = (((tc.X - (posJ.X + sizeJ.X / 2)) / 120) * 80) + posJ.X;
vB.Y = (((tc.Y - (posJ.Y + sizeJ.Y / 2)) / 120) * 80) + posJ.Y;
pos.X = vB.X;
pos.Y = vB.Y;
}
else
{
pos.X = tc.X - size.X / 2;
pos.Y = tc.Y - size.Y / 2;
}
}
else
{
pos.X = posJ.X + sizeJ.X / 2 - size.X / 2;
pos.Y = posJ.Y + sizeJ.Y / 2 - size.Y / 2;
}

Когда джойстик превышиает радиус, то начинает выпрыгивать в непонятных направлениях. В чем ошибка?
З.Ы Это конечно не паскаль, но суть не меняется.

PassCall 06.12.2012 20:24

Ответ: Джойстик(Сенсорный экран)
 
Суть:

dx - расстояние между двумя кругами по x
dy - расстояние между двумя кругами по y

r - радиус ограничительного круга

dist = расстояние между центром "ограничительного круга" и центра "круга джойстика" (геометрию в школе все учили?)

Если dist>r, тогда вычисляем "излишек", то есть насколько линия превысила лимит длинны:
a=r/dist

теперь изменяем координаты на основе "излишка"

x=x*a;
y:=y*a;


так то!


Часовой пояс GMT +4, время: 01:55.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot