【问题标题】:Android - Moving an object in circleAndroid - 移动一个圆圈的对象
【发布时间】:2011-10-10 03:20:47
【问题描述】:

我遇到了一些问题, 我需要制作一个物体(乒乓球拍),使其只能沿着屏幕沿圆形路线移动。 就像你有一个恒定的 y 轴值一样,它只会在你拖动手指时沿 x 轴移动,但将其限制为圆形路线。

有什么见解吗? 我看到了这个东西 http://www.kirupa.com/developer/mx/circular.htm

它只有助于弄清楚如何不断地绕圈移动某物(尽管是 Flash,但想法是一样的)

谢谢

【问题讨论】:

    标签: java android eclipse geometry


    【解决方案1】:

    圆上的点可以由函数定义:

    x = a + r cos(θ)
    y = b + r sin(θ)
    

    其中 (a,b) 是圆的中心。

    根据您想要的速度,您可以说您希望每 T 秒发生一个完整的循环。如果 t 是动画开始的时间:

    θ = (360 / T) * (t % T)
    

    您可以使用这些函数来创建自己的 ViewAnimation、OpenGL 函数,或者如果您使用的是画布,则可以在 onDraw() 事件期间设置桨的位置。

    【讨论】:

    • 感谢您的回答,但如果是动画,这很有用。我想用触摸移动它。基本上,我想要的是一个只能在屏幕上一个圆圈内移动的可移动桨。希望现在一切顺利
    • 在这种情况下,您可以使用标准距离函数来确定桨距圆心的距离。如果超出允许范围,请不要允许。 (purplemath.com/modules/distform.htm)
    • 不错!我喜欢。关于这个的另一个问题,有没有办法让桨(它相当长而平坦)以平坦的一面总是面向内部或中心的方式旋转?再次感谢!
    • 是的。我不确定您的代码是什么样的,但如果您想要从中心到点的角度与水平轴的角度,您可以使用以下公式: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() 计算手指在以图像中心为中心的圆中移动的度数。

    【讨论】:

    • 感谢您的快速评论!我会告诉你我想在这里完成什么,我想要一个 2D 乒乓球游戏,但不是仅限于向上/向下移动(或向右/向左)的球拍,而是在圆形场地中进行。所以我希望能够在受限的圆形中移动桨。我无法弄清楚您发布的示例在做什么,您能详细说明一下吗?
    • 我添加了一些关于我的代码功能的解释。我不确定这对你有没有帮助。
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    相关资源
    最近更新 更多