#java #android #eclipse #geometry
#java #Android #eclipse #геометрия
Вопрос:
У меня возникли проблемы с чем-то, мне нужно сделать так, чтобы объект (Pong paddle) перемещался только по круговому маршруту вдоль экрана. то же самое, как если бы у вас было постоянное значение оси y, и оно перемещалось бы только по оси x, когда вы проводите по нему пальцем, но чтобы ограничить его круговым маршрутом.
есть идеи? Я видел эту вещь http://www.kirupa.com/developer/mx/circular.htm
и это только помогает понять, как постоянно перемещать что-то по кругу (несмотря на то, что это Flash, идея та же)
Спасибо
Ответ №1:
Точки на окружности могут быть определены с помощью функций:
x = a r cos(θ)
y = b r sin(θ)
Где (a, b) — центр круга.
В зависимости от желаемой скорости вы можете сказать, что хотите, чтобы полный круг выполнялся каждые T секунд. И если t — это время с начала анимации:
θ = (360 / T) * (t % T)
Вы можете использовать эти функции для создания собственного ViewAnimation, функции OpenGL или, если вы используете canvas, для установки положения элемента управления во время onDraw()
события.
Комментарии:
1. Спасибо за ответ, но это полезно, если он был анимирован. я хочу переместить его с помощью касания. По сути, мне нужна подвижная панель, которую можно перемещать только в пределах окружности круга на экране. Надеюсь, теперь все понятно
2. В этом случае вы можете использовать стандартную функцию расстояния, чтобы определить, как далеко весло находится от центра круга. Если это будет дальше, чем разрешено, не разрешайте это. ( purplemath.com/modules/distform.htm )
3. Приятно! Мне это нравится. еще один вопрос по этому поводу: есть ли способ, чтобы лопатка (которая довольно длинная и плоская) поворачивалась таким образом, чтобы плоская сторона всегда была обращена внутрь или в центр? Еще раз спасибо!
4. ДА. Я не уверен, как выглядит ваш код, но если вам нужен угол от центра до точки относительно горизонтальной оси, вы можете использовать эту формулу:
angle = atan2(y2 - y1, x2 - x1) * 180 / PI
Ответ №2:
Вот блок кода, который я использую для поворота изображения одним пальцем.
private float mCenterX, mCenterY;
private float direction = 0;
private float sX, sY;
private float startDirection=0;
private void touchStart(float x, float y) {
mCenterX = this.getWidth() / 2;
mCenterY = this.getHeight() / 2;
sX = x;
sY = y;
}
private void touchMove(float x, float y) {
// this calculate the angle the image rotate
float angle = (float) angleBetween2Lines(mCenterX, mCenterY, sX, sY, x,
y);
direction = (float) Math.toDegrees(angle) * -1 startDirection;
this.invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.rotate(direction, mCenterX, mCenterY);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// record the start position of finger
touchStart(x, y);
break;
case MotionEvent.ACTION_MOVE:
// update image angle
touchMove(x, y);
break;
case MotionEvent.ACTION_UP:
startDirection = direction;
break;
}
return true;
}
public double angleBetween2Lines(float centerX, float centerY, float x1,
float y1, float x2, float y2) {
double angle1 = Math.atan2(y1 - centerY, x1 - centerX);
double angle2 = Math.atan2(y2 - centerY, x2 - centerX);
return angle1 - angle2;
}
Надеюсь, это поможет
Редактировать: по сути, приведенный выше код позволяет пользователю поворачивать изображение, и центр изображения не изменится. Функция angleBetween2Line() предназначена для вычисления степени перемещения пальца по кругу, центр которого является центром изображения.
Комментарии:
1. Спасибо за быстрый комментарий! Я расскажу вам, чего я пытаюсь достичь здесь, я хочу 2D-игру в понг, но вместо весел, ограниченных только движением вверх / вниз (или вправо / влево), игра происходит на круглом поле. итак, я хочу иметь возможность перемещать весло по ограниченному кругу. У меня возникли проблемы с пониманием того, что делает опубликованный вами пример, можете ли вы уточнить, пожалуйста?
2. Я добавил небольшое объяснение того, что делает мой код. Я не уверен, поможет это вам или нет.