| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /**
- * Copyright (C) 2005-2012 XELOG AG
- */
- package ch.spherIC.recurvebowsight.logic;
-
- import android.os.AsyncTask;
-
-
- /**
- * @author FC Smilari
- */
- public class CalculationTask extends AsyncTask<TrajectoryCalculator, Integer, TrajectoryCalculator> {
-
- private static final Double PHI = 1.0;
- TrajectoryCalculator calculator;
-
- @Override
- protected TrajectoryCalculator doInBackground(final TrajectoryCalculator... params) {
-
- this.calculator = params[0];
-
- boolean exitLoop = false;
- Double angleX = 0.0;
- Double angleHigh = 0.0;
- Double angleLow = this.calculator.getStartAngle() + PHI;
- Double[][] results;
- Double frictionCoefficient = this.calculator.calculateFrictionCoeficient();
-
- // Startwerte für angleLow und angleHigh berechnen
- do {
- angleLow -= PHI;
- results = this.calculator.calculateTrajectory(angleLow, frictionCoefficient);
- } while (results[results.length - 1][TrajectoryCalculator.IDX_Y] - this.calculator.getDeltaHeight() > 0);
-
- angleHigh = angleLow;
-
- do {
- angleHigh += PHI;
- results = this.calculator.calculateTrajectory(angleHigh, frictionCoefficient);
- } while (results[results.length - 1][TrajectoryCalculator.IDX_Y] - this.calculator.getDeltaHeight() < 0);
-
-
- // Winkel suchen mit Hilfe der Regula Falsi und Flugbahnberechnungsiterationen
- do {
-
- angleX = (angleHigh + angleLow) / 2;
- results = this.calculator.calculateTrajectory(angleX, frictionCoefficient);
-
- if (Math.abs(this.calculator.getDeltaHeight() - results[results.length - 1][TrajectoryCalculator.IDX_Y])
- > this.calculator.getCalculationPrecision()) {
-
- if (results[results.length - 1][TrajectoryCalculator.IDX_Y] - this.calculator.getDeltaHeight() < 0) {
- angleLow = angleX;
- } else {
- angleHigh = angleX;
- }
-
- } else {
- exitLoop = true;
- }
-
- } while (!exitLoop);
-
- this.calculator.setStartAngle(angleX);
- this.calculator.setFlightCurve(results);
- this.calculator.setMaxHCurve(calculateMaxHeight(results));
-
- publishProgress(0, results.length - 1);
- sleep(5);
-
- for (int i = 0; i < results.length; i++) {
- publishProgress(1, i);
- sleep(5);
- }
-
- return this.calculator;
- }
-
- public static Double[] calculateMaxHeight(final Double[][] flightCurve) {
- Double[] maxHCurve = new Double[] { 0d, 0d };
- Double maxH = 0.0;
-
- for (int i = 0; i < flightCurve.length; i++) {
- if (flightCurve[i][TrajectoryCalculator.IDX_Y] > maxH) {
- maxH = flightCurve[i][TrajectoryCalculator.IDX_Y];
- maxHCurve[0] = maxH;
- maxHCurve[1] = flightCurve[i][TrajectoryCalculator.IDX_T];
- }
- }
-
- return maxHCurve;
- }
-
- @Override
- protected void onProgressUpdate(final Integer... values) {
- super.onProgressUpdate(values);
- this.calculator.getListener().updateTrajectoryTxtFld(values[0], this.calculator.getFlightCurve()[values[1]], this.calculator.getStartAngle(),
- this.calculator.getMaxHCurve());
- }
-
- @Override
- protected void onPostExecute(final TrajectoryCalculator calculator) {
- super.onPostExecute(calculator);
- calculator.getListener().onCalculationDone(calculator.getFlightCurve(), calculator.getStartAngle(), calculator.getMaxHCurve());
- }
-
- private void sleep(final long millis) {
- try {
- Thread.sleep(millis);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
|