两个铁球同时落地

本文介绍了一个模拟伽利略比萨斜塔实验的Android应用案例,通过编程实现两个不同大小铁球的同时下落,展示了如何使用Android系统的绘图和动画功能。
这是一篇"在比萨斜塔上模拟两个铁球同时落地",如下:

[img]http://dl.iteye.com/upload/attachment/365533/9e7dd723-2b14-3dba-b2eb-e0ddb1c8fa00.png[/img]


代码如下:



package com.chaoqun;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.Bitmap.Config;
import android.graphics.Paint.FontMetrics;
import android.graphics.PorterDuff.Mode;
import android.os.Bundle;
import android.os.Handler;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class TwoBalls extends Activity {
/** Called when the activity is first created. */
protected WindowManager.LayoutParams _windowParams;
protected WindowManager _windowManager;
protected static Display _display;
protected ImageView _icon01;
protected ImageView _icon02;
private Handler _messageHandler;
private Button _go;



@Override
protected void onDestroy() {
//清除手工添加的View
if(_icon01 != null && _windowManager != null) {
_windowManager.removeViewImmediate(_icon01);
_icon01 = null;
}

if(_icon02 != null && _windowManager != null) {
_windowManager.removeViewImmediate(_icon02);
_icon02 = null;
}
super.onDestroy();
}


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_go =(Button)findViewById(R.id.options_btn);
_display = ((WindowManager)this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); //获取屏幕介质信息
_messageHandler = new Handler();
_go.setOnClickListener( new OnClickListener() {

@Override
public void onClick(View v) {
startAnim(genBitMapforAnim("02", 40), _display.getWidth()-100 , 2, (30-40)/2);
startAnim(genBitMapforAnim("01", 30), _display.getWidth()-150, 1, 0);
//这里先后有时间差,忽略了,另外UI Thread在消息处理也有时间差,忽略了。
//要精确模拟,只有自定义View,单独绘制了。
}

});

}




protected Bitmap genBitMapforAnim(String itemCode, int size) {
String text = itemCode.length() >= 5 ? itemCode.substring(0, 5) : itemCode;
Bitmap result = Bitmap.createBitmap(size*2,size*2, Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawARGB(0, 0xff, 0, 0);
Paint paint = new Paint();
paint.setAntiAlias(true); //抗锯齿
paint.setFilterBitmap(true); //透明设置
paint.setColor(Color.RED);
paint.setAlpha(200);
canvas.drawCircle(size/2, size/2, size/2, paint);//绘制半径为size/2的圆
paint.setAlpha(255);
paint.setTextSize(9);
paint.setColor(Color.WHITE);
float textWidth = paint.measureText(text); //取得字体宽度
FontMetrics fm = paint.getFontMetrics();
float textHeight = (float)(fm.descent + fm.ascent) / 2; //取得字体高度

canvas.drawText(text, (size-textWidth) /2.0f,(size-textHeight)/2.0f, paint); //编号


final Rect rect = new Rect(0, 0,size, size);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(result, rect, rect, paint); //生成透明位图
return result;
}

protected void startAnim(final Bitmap bitmap, final int startXLocation, int id, final int offset) {
final int startY = 160;

final ImageView imageView = new ImageView(this);
imageView.setImageBitmap(bitmap);
if(_windowParams == null)
_windowParams = new WindowManager.LayoutParams();
_windowParams.gravity = Gravity.TOP | Gravity.LEFT; //标示要关注上下,左右位置
_windowParams.x = startXLocation; //起点坐标x
_windowParams.y = startY + offset; //起点坐标y, 设置offset是为了保证起始位置在同一高度

_windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
_windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
_windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
_windowParams.format = PixelFormat.TRANSLUCENT;
_windowParams.windowAnimations = 0;

if(_windowManager == null)
_windowManager = (WindowManager)TwoBalls.this.getSystemService("window"); //获取全局实例WindowManager


ImageView icon = id == 1 ? _icon01 : _icon02;
if(icon != null) {
_windowManager.removeViewImmediate(icon); //移除先前的View
icon = null;
}
else {
icon = imageView;
}

_windowManager.addView(icon, _windowParams); //添加View到当前界面


final Runnable runnable = new Runnable() {
double t = 0.0d;
final double g = 2.0d;
public void run() {
t++;
_windowParams.x = startXLocation; //由于WindowManager是单实例,所以这里要记录每个的x坐标
_windowParams.y = startY + offset + (int)(0.5 * g * t * t); //匀加速运动位置计算
_windowManager.updateViewLayout(imageView, _windowParams); //更新坐标
}
};

new Thread() {
long lastUpdate = System.currentTimeMillis();
public void run() {
//设置大家都经过同一高度(这里依旧考虑到球的半径不同)
while (_windowParams.y + offset < _display.getHeight() - 60 && !Thread.interrupted() && !TwoBalls.this.isFinishing()) {
if(System.currentTimeMillis() - lastUpdate >= 100) { //每隔100ms动一下,移动一侦
lastUpdate = System.currentTimeMillis();
_messageHandler.post(runnable);
}


}

if(!bitmap.isRecycled())
bitmap.recycle();

}
}.start();


}








}



已打包,有兴趣的看看.
源码地址: https://pan.quark.cn/s/3916362e5d0a 在C#编程平台下,构建一个曲线编辑器是一项融合了图形用户界面(GUI)构建、数据管理及数学运算的应用开发任务。 接下来将系统性地介绍这个曲线编辑器开发过程中的核心知识点:1. **定制曲线面板展示数据曲线**: - 控件选用:在C#的Windows Forms或WPF框架中,有多种控件可用于曲线呈现,例如PictureBox或用户自定义的UserControl。 通过处理重绘事件,借助Graphics对象执行绘图动作,如运用DrawCurve方法。 - 数据图形化:通过线性或贝塞尔曲线连接数据点,以呈现数据演变态势。 这要求掌握直线与曲线的数学描述,例如两点间的直线公式、三次贝塞尔曲线等。 - 坐标系统与缩放比例:构建X轴和Y轴,设定坐标标记,并开发缩放功能,使用户可察看不同区间内的数据。 2. **在时间轴上配置多个关键帧数据**: - 时间轴构建:开发一个时间轴组件,显示时间单位刻度,并允许用户在特定时间点设置关键帧。 时间可表现为连续形式或离散形式,关键帧对应于时间轴上的标识。 - 关键帧维护:利用数据结构(例如List或Dictionary)保存关键帧,涵盖时间戳和关联值。 需考虑关键帧的添加、移除及调整位置功能。 3. **调整关键帧数据,通过插值方法获得曲线**: - 插值方法:依据关键帧信息,选用插值方法(如线性插值、样条插值,特别是Catmull-Rom样条)生成平滑曲线。 这涉及数学运算,确保曲线在关键帧之间无缝衔接。 - 即时反馈:在编辑关键帧时,即时刷新曲线显示,优化用户体验。 4. **曲线数据的输出**: - 文件类型:挑选适宜的文件格式存储数据,例如XML、JSON或...
<think>好的,我现在需要帮用户解决如何计算铁球的表面积和质量的问题。首先,我得回忆一下相关的公式。表面积的话,应该是体表面积公式,4πr²,质量的话需要体积乘以密度。体积公式是(4/3)πr³,对吧?然后铁的密度大概是7.87克每立方厘米或者7870千克每立方米,可能需要确认一下单位转换。接下来,用户可能需要具体的步骤和示例。我应该先分步骤说明,每个步骤里整合公式和例子。要注意不能使用第一人称,所以得用被动语态或者直接陈述步骤。比如,“使用公式计算表面积”而不是“我们使用公式”。 然后,示例部分需要代入具体数值。比如假设半径是5厘米,这样表面积计算就是4π*5²,质量的话是体积乘以密度。这里要注意单位的转换,如果半径用厘米,密度用克每立方厘米,结果质量就是克,可能需要转换成千克或其他单位,根据用户需求而定。 还要检查是否有需要引用的内容,比如密度值是否准确。可能需要搜索确认铁的密度,不同资料可能有不同数值,比如有的用7.87克/立方厘米,有的用7860千克/立方米。这时候要确保数值正确,并注明这是近似值。另外,用户要求公式和代码的格式。数学公式需要用$或$$包裹,代码要用三个反引号注明语言。比如在示例中,如果要写Python代码,需要正确标注语言类型,并确保代码正确计算表面积和质量。 还要注意避免步骤词汇如“首先”、“然后”,所以步骤之间用换行分隔,每个步骤用方法或标题。例如,分为“表面积计算公式”和“质量计算公式”,每个下面详细说明。最后,生成相关问题的时候,要基于用户的问题和回答内容。比如,如何计算其他形状的铁制品的表面积和质量,单位转换问题,或者密度变化的影响。需要至少三个相关问题,用§§相关问题§§:开头,每个问题编号正确。 现在需要验证这些步骤是否正确,有没有遗漏的地方。比如,是否漏掉了单位转换的步骤,或者在示例中是否明确展示了计算过程。还要确保没有使用第一人称,符合用户的所有格式要求。</think>**表面积计算公式** 体表面积公式为: $$A = 4\pi r^2$$ 其中: - $A$ 为表面积 - $r$ 为体半径 - $\pi$ 取近似值3.1416 **质量计算公式** 质量需通过体积与密度计算。 体体积公式为: $$V = \frac{4}{3}\pi r^3$$ 质量公式为: $$m = \rho \cdot V$$ 其中: - $m$ 为质量 - $\rho$ 为铁的密度(约7.87 g/cm³ 或 7870 kg/m³) --- **示例计算** 假设铁球半径 $r = 5\ \text{cm}$: 1. **表面积计算** $$A = 4 \times 3.1416 \times 5^2 = 314.16\ \text{cm}^2$$ 2. **体积计算** $$V = \frac{4}{3} \times 3.1416 \times 5^3 = 523.6\ \text{cm}^3$$ 3. **质量计算** $$m = 7.87\ \text{g/cm³} \times 523.6\ \text{cm³} \approx 4121.3\ \text{g} = 4.12\ \text{kg}$$ --- **代码实现** ```python import math def calculate_sphere_properties(radius, density): surface_area = 4 * math.pi * radius ** 2 volume = (4/3) * math.pi * radius ** 3 mass = density * volume return surface_area, mass # 示例:半径5 cm,密度7.87 g/cm³ radius_cm = 5 density_g_per_cm3 = 7.87 surface_area, mass_g = calculate_sphere_properties(radius_cm, density_g_per_cm3) print(f"表面积: {surface_area:.2f} cm²") print(f"质量: {mass_g:.2f} g (约 {mass_g / 1000:.2f} kg)") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值