cocos2d помогите найти точки по кругу - PullRequest
2 голосов
/ 18 апреля 2009

Я пытаюсь решить сложную математическую задачу в контексте cocos2d для iphone.

В основном у меня есть колесо рулетки, которое вращается со временем.

Я хочу, чтобы спрайт фиксировался на колесе в определенных точках (например, порядковые точки компаса N, S, E, W) и отскакивал во всех других точках.

У меня есть изображение вращающегося колеса, и мне просто нужно решить часть, где я могу проверить, пересекался ли спрайт с кругом в нужной точке на круге, когда он вращается.

Я думаю, что этот вопрос идет в правильном направлении, но я не могу разобраться с этим. Может кто-нибудь помочь объяснить?

Лучший способ найти точку на окружности, ближайшей к данной точке

Ответы [ 2 ]

1 голос
/ 18 апреля 2009

Если я правильно понимаю:

Сначала проверьте расстояние между спрайтом и центром колеса рулетки. Это скажет вам, если спрайт находится на краю колеса. (Если нет, ничего не происходит, верно?)

Затем найдите угол, который спрайт составляет от "оси X" колеса рулетки.

spriteAngle = atan2(sprite.x - rouletteCentre.x, sprite.y - rouletteCentre.y)

Вам нужно найти эквивалент функции atan2(). Обычно он возвращает ответ в радианах; Вы можете преобразовать его в градусы, четверть оборота или что-то еще, если хотите.

Затем вычтите угол, на который вращается само колесо рулетки (если само колесо вращается, если нет, то вы уже сделали). Убедитесь, что ваши измерения угла соответствуют.

actualAngle = spriteAngle - rouletteRotationAngle

Обратите внимание, что actualAngle может находиться за пределами диапазона 0-360 градусов, и вам нужно будет сделать его "развернутым".

Наконец, вы захотите разрешить небольшой диапазон значений как приемлемый (например, от 98 градусов до 102 может считаться «северным»).

1 голос
/ 18 апреля 2009

Итак, у вас есть круг радиуса r с центром (x0, y0).

Точка лежит вне круга в координатах (x, y). Ваш вопрос заключается в том, чтобы найти ближайшую точку на самой окружности к точке (x, y).

Решение простое. Ближайшая проекция точки на окружность осуществляется простым масштабированием. Таким образом,

d = sqrt((x-x0)^2 + (y-y0)^2)
xp = x0 + (x - x0)*r/d
yp = y0 + (y - y0)*r/d

Новая точка (xp, yp) будет лежать на самом круге. Если честно, вам лучше работать в полярных координатах с началом координат в центре круга. Тогда все становится намного проще.

Ваш следующий вопрос будет, где он попал в круг? Не забывайте, что точки компаса на круге вращаются со временем. Функция atan2 даст вам угол, под которым лежит точка (xp-x0, yp-y0). Большинство наборов инструментов будут иметь эту функциональность. Смотри, что я вычел из источника здесь.

...