Android — перемещение объекта по кругу

#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. Я добавил небольшое объяснение того, что делает мой код. Я не уверен, поможет это вам или нет.