android画抛物线代码

                    package com.yarin.android.Examples_05_04;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class GameView extends View implements Runnable
{
    /* 声明Paint对象 */
    private Paint mPaint = null;

    double maxS = 0;
    double maxH = 0;
    double maxT = 0;
    double dx;
    double dy;
    double d;
    MovingObject obj;
    boolean isDraw=false;
    public GameView(Context context)
    {
        super(context);
        /* 构建对象 */
        mPaint = new Paint();

        // 计算物体的最大高度、运动时间及最大射程

        obj = new MovingObject(30, Math.PI / 4, Color.RED);
        // 运行时间
        obj.T = 2 * obj.V0 * Math.sin(obj.Sita) / 9.8;

        // 最大高度
        obj.H = obj.V0 * obj.V0 * Math.sin(obj.Sita) * Math.sin(obj.Sita)
                / (2 * 9.8);

        // 最大射程
        obj.Smax = 2 * obj.V0 * obj.V0 * Math.sin(obj.Sita)
                * Math.cos(obj.Sita) / 9.8;

        if (obj.Smax > maxS)
        {
            maxS = obj.Smax;
        }

        if (obj.H > maxH)
        {
            maxH = obj.H;
        }

        if (obj.T > maxT)
        {
            maxT = obj.T;
        }

        dx = (800 - 20) / maxS;
        dy = (480 - 20) / maxH;

        d = Math.min(dx, dy);
        //最大运行时间
        Log.v("TAG", String.valueOf(maxT));
        //最大高度
        Log.v("TAG", String.valueOf(maxH));
        //最大射程
        Log.v("TAG", String.valueOf(maxS));

    }

    public void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        /* 设置画布的颜色 */
        canvas.drawColor(Color.BLACK);

        /* 设置取消锯齿效果 */
        mPaint.setAntiAlias(true);
        canvas.drawColor(Color.GREEN);
        if(isDraw)
        {
            canvas.drawCircle((float)obj.X, (float)obj.Y, 10, mPaint);
        }
        

    }

    // 触笔事件
    public boolean onTouchEvent(MotionEvent event)
    {

        switch (event.getAction())
        {
        case MotionEvent.ACTION_DOWN:
            new Thread(this).start();
            break;
        }
        return true;
    }


    public void run()
    {
        for (double t = 0; t < maxT; t += 0.01)
        {
            Log.v("TAG", String.valueOf(t));
            isDraw=true;
            // 水平坐标
            double x = obj.V0 * Math.cos(obj.Sita) * t;

            // 竖直坐标
            double y = obj.V0 * Math.sin(obj.Sita) * t - 9.8 * t * t / 2;

            if (y < 0)
            {
                continue;
            }

            // 坐标转换
            obj.X = 10 + d * x;
            obj.Y = 480 - 10 - d * y;
            try
            {
                Thread.sleep(10);
            } catch (InterruptedException e)
            {
                Thread.currentThread().interrupt();
            }
            // 使用postInvalidate可以直接在线程中更新界面
            postInvalidate();

        }

    }
}

class MovingObject
{
    // 重力加速度
    public final double G = 9.8;

    // / <summary>
    // / 构造函数
    // / </summary>
    // / V0物体的初速度
    // / Sita物体初速度与水平方向的夹角
    // / Color颜色
    public MovingObject(double V0, double Sita, int red)
    {
        this.V0 = V0;
        this.Sita = Sita;
        this.Color = red;
    }

    // / <summary>
    // / 物体的初速度
    // / </summary>
    public double V0;

    // / <summary>
    // / 物体初速度与水平方向的夹角
    // / </summary>
    public double Sita;

    // / <summary>
    // / 物体的横坐标
    // / </summary>
    public double X;

    // / <summary>
    // / 物体的纵坐标
    // / </summary>
    public double Y;

    // 物体的颜色
    public int Color;

    // 要绘制的物体的矩形
    public Rect GetObjectRectangle()
    {
        return new Rect((int) X - 3, (int) Y - 3, 6, 6);
    }

    // / <summary>
    // / 最大射程
    // / </summary>
    public double Smax;

    // / <summary>
    // / 最大高度
    // / </summary>
    public double H;

    // / <summary>
    // / 运行时间
    // / </summary>
    public double T;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值