android中的弹丸运动

时间:2011-10-10 13:49:56

标签: android

我正在尝试在android中实现射弹运动。我希望我的物体能够根据输入来跟踪轨迹。

但我很少遇到实施问题:

  1. 我应该假设初始速度及其x和y分量。
  2. 如何确保我的轨迹落在可见屏幕内。
  3. displacemnet的瞬时x和y分量由x=uxt + (1/2) axt2y= uyt + (1/2) ayt2给出。那么如何存储整个x和y坐标列表来绘制轨迹路径。
  4. 最后,让我的对象遵循绘制坐标绘制的路径的最佳方法是什么。
  5. =============================================== ============

    编辑1:

    这是我目前的进展: -

    基于我的Imageview的触摸事件,我正在计算角度旋转,即弧度角度,我也确保角度的最大允许值为90度。如果用户旋转超过90度,我的代码设置角度变量到90度,即它的最大值。

    我假设Y为正,因此我的引力是负的。

    我假设初始速度为100mm / s,即单位为毫米,因此修改了重力引起的加速度值,默认情况下为m / s2。

    这是我绘制轨迹点的代码,我得到了y轴初始速度的正值,但沿y轴的位移有一个很大的负值。我的x轴值都是正的,但我仍无法绘制因为值不在画布中。请帮助。: -

    这是我的代码: -

     public void drawProjectile(double angle)
         {
             Log.w(this.getClass().getName(),"drawProjectile called");
             mUx = mUi*Math.cos(angle);
             mUy = mUi*Math.sin(angle);
             now =1;// unit is seconds
    
             for(int i = 1;i<=10;i++)
             {
                 Log.w(this.getClass().getName(),"In plotting points loop");
    
             Log.d(this.getClass().getName(), "Value of Current Time is: " +Long.toString(now));
             mX1=(float) (mUx*now);
             mY1 = (float)(mUy*now+(mGravity*100/2)*now*now);
    
             Log.d(this.getClass().getName(), "Value of mUx: " + Double.toString(mUx));
             Log.d(this.getClass().getName(), "Value of mUy: " + Double.toString(mUy));
             Log.d(this.getClass().getName(), "Value of mX1: " + Float.toString(mX1));
             Log.d(this.getClass().getName(), "Value of mY1: " + Float.toString(mY1));
             mCanvas.drawPoint(mX1, mY1, mPaint);
    
             now+=5;
             }
    

    样本测试值为: -

    10-17 17:21:36.842: WARN/com.example.sitolia.Balls(617): drawProjectile called
    10-17 17:21:36.842: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:36.842: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 1
    10-17 17:21:36.842: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:36.852: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:36.852: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 8.71558
    10-17 17:21:36.852: DEBUG/com.example.sitolia.Balls(617): Value of mY1: 94.71947
    10-17 17:21:36.852: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:36.852: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 6
    10-17 17:21:36.885: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:36.885: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:36.885: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 52.29348
    10-17 17:21:36.885: DEBUG/com.example.sitolia.Balls(617): Value of mY1: 421.3168
    10-17 17:21:36.885: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:36.885: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 11
    10-17 17:21:36.885: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:36.893: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:36.893: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 95.87138
    10-17 17:21:36.893: DEBUG/com.example.sitolia.Balls(617): Value of mY1: 502.91415
    10-17 17:21:36.893: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:36.893: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 16
    10-17 17:21:36.893: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 139.44928
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of mY1: 339.5115
    10-17 17:21:36.902: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 21
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 183.02718
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of mY1: -68.89114
    10-17 17:21:36.902: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 26
    10-17 17:21:36.902: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:36.912: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:36.912: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 226.60509
    10-17 17:21:36.912: DEBUG/com.example.sitolia.Balls(617): Value of mY1: -722.2938
    10-17 17:21:36.912: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:36.912: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 31
    10-17 17:21:36.912: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:36.912: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:36.922: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 270.18298
    10-17 17:21:36.922: DEBUG/com.example.sitolia.Balls(617): Value of mY1: -1620.6964
    10-17 17:21:36.922: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:36.922: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 36
    10-17 17:21:36.922: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:36.922: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:36.992: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 313.7609
    10-17 17:21:36.992: DEBUG/com.example.sitolia.Balls(617): Value of mY1: -2764.099
    10-17 17:21:36.992: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:36.992: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 41
    10-17 17:21:36.992: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:36.992: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:36.992: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 357.33878
    10-17 17:21:37.002: DEBUG/com.example.sitolia.Balls(617): Value of mY1: -4152.502
    10-17 17:21:37.002: WARN/com.example.sitolia.Balls(617): In plotting points loop
    10-17 17:21:37.002: DEBUG/com.example.sitolia.Balls(617): Value of Current Time is: 46
    10-17 17:21:37.002: DEBUG/com.example.sitolia.Balls(617): Value of mUx: 8.715580058482463
    10-17 17:21:37.037: DEBUG/com.example.sitolia.Balls(617): Value of mUy: 99.61946930316475
    10-17 17:21:37.037: DEBUG/com.example.sitolia.Balls(617): Value of mX1: 400.9167
    10-17 17:21:37.037: DEBUG/com.example.sitolia.Balls(617): Value of mY1: -5785.9043
    10-17 17:21:37.037: DEBUG/com.example.sitolia.SitoliaActivity(617): Value of angle in ontouch: 1.4835298
    

1 个答案:

答案 0 :(得分:1)

一些初步建议: 确定哪个Y方向上升(正面或负面)并确保数学的坐标系统和图形API对此达成一致。出于这个答案的目的,我将负Y称为负,因此引力是一个正值。

您的问题:

  1. Y速度需要较大的负值,x速度需要较小的值(否则它只是直线和向下)。通常这些是使用学校级三角法从发射速度和角度到地面计算的。

  2. 理想情况下,您需要缩放图形API(即映射到屏幕的坐标系)以显示动态需要的任何空间。首先,您可以更容易地坚持计算出适合屏幕的vx和vy的初始值。

  3. 如果你想存储一个你将使用数组的坐标列表,但是由于我在下面的4解决方案,通常不需要这样做

  4. 通常情况下,计算点数是多么容易,你可以根据需要绘制它们,特别是在绘制轨迹的代码中,你可以遍历t的所有相关值,计算x和y位移并在该点绘制一个点 - 因此当您沿着循环中增加更高的t值前进时,将绘制轨迹线。

  5. 关于计时器:  我认为您需要决定是否要在整个屏幕上为射弹设置动画,或者将射弹的路径同时绘制成一条线。我不太了解在Android中使用的准确性或机制(我是一个Android新手),但一般认为用于此类动画的策略是依赖于来自操作系统的常规回调但是然后使用某种~1 / 100s准确的时间标记来衡量你画最后一帧和现在之间的时间 - 用它作为将时间变量向前推进并绘制新帧的数量。此策略可确保动画在不同的硬件和软件环境中以相同的速度运行。