Я использую функцию
acc = (float) Math.sqrt(x * x + y * y + z * z) - GRAVITY_EARTH;
, чтобы вычислить начальное ускорение при броске мяча.X, y и z - значения от акселерометра Android.
У меня также есть счетчик, который считает, когда бросающее движение превышает минимальное необходимое ускорение, и я пытаюсь обновить высоту виртуального шараи выведите его положение и скорость, используя эту формулу:
vel = acc + (-GRAVITY_EARTH * Float.parseFloat(timeCounter));
Но это только прилагает силу акселерометра, как я могу получить начальную скорость броска и затем вычислить высоту мяча в режиме реального времени?
Функция акселерометра ниже:
/* Get values from the built in accelerometer while they are being updated. */
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float x = event.values[0];
float y = event.values[0];
float z = event.values[0];
acc = (float) Math.sqrt(x * x + y * y + z * z) - GRAVITY_EARTH;
String a = String.format("%.3f", acc);
a = a.replace(",", ".");
currentAccText.setText(String.valueOf(a));
/* Is the current acc larger than set minimum value? */
if (acc >= minAcc) {
/* Has the timer not been started yet? */
if (timeCounter.equals("0.0")) {
timer.start();
a = String.format("%.3f", acc);
a = a.replace(",", ".");
thrownAccText.setText(a);
String hr = String.format("%.3f", heightRecord);
hr = hr.replace(",", ".");
recordHeightText.setText(hr);
}
}
vel = acc + (-GRAVITY_EARTH * Float.parseFloat(timeCounter));
height += vel;
heightBar.setProgress((int) height);
if (vel < 0.01f && vel > -0.01f) sound.start();
if (height > heightRecord) heightRecord = height;
if (height < 0.01f) height = 0.f;
String h = String.format("%.3f", height);
h = h.replace(",", ".");
heightText.setText(h);
if (height > 0.f) throwOrGroundText.setText("Throw!");
else throwOrGroundText.setText("On the ground.");
}
}