Version für alte Androidversionen der Visiereinstellung für Recurvebogen.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

CalculationTask.java 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /**
  2. * Copyright (C) 2005-2012 XELOG AG
  3. */
  4. package ch.spherIC.recurvebowsight.logic;
  5. import android.os.AsyncTask;
  6. /**
  7. * @author FC Smilari
  8. */
  9. public class CalculationTask extends AsyncTask<TrajectoryCalculator, Integer, TrajectoryCalculator> {
  10. private static final Double PHI = 1.0;
  11. TrajectoryCalculator calculator;
  12. @Override
  13. protected TrajectoryCalculator doInBackground(final TrajectoryCalculator... params) {
  14. this.calculator = params[0];
  15. boolean exitLoop = false;
  16. Double angleX = 0.0;
  17. Double angleHigh = 0.0;
  18. Double angleLow = this.calculator.getStartAngle() + PHI;
  19. Double[][] results;
  20. Double frictionCoefficient = this.calculator.calculateFrictionCoeficient();
  21. // Startwerte für angleLow und angleHigh berechnen
  22. do {
  23. angleLow -= PHI;
  24. results = this.calculator.calculateTrajectory(angleLow, frictionCoefficient);
  25. } while (results[results.length - 1][TrajectoryCalculator.IDX_Y] - this.calculator.getDeltaHeight() > 0);
  26. angleHigh = angleLow;
  27. do {
  28. angleHigh += PHI;
  29. results = this.calculator.calculateTrajectory(angleHigh, frictionCoefficient);
  30. } while (results[results.length - 1][TrajectoryCalculator.IDX_Y] - this.calculator.getDeltaHeight() < 0);
  31. // Winkel suchen mit Hilfe der Regula Falsi und Flugbahnberechnungsiterationen
  32. do {
  33. angleX = (angleHigh + angleLow) / 2;
  34. results = this.calculator.calculateTrajectory(angleX, frictionCoefficient);
  35. if (Math.abs(this.calculator.getDeltaHeight() - results[results.length - 1][TrajectoryCalculator.IDX_Y])
  36. > this.calculator.getCalculationPrecision()) {
  37. if (results[results.length - 1][TrajectoryCalculator.IDX_Y] - this.calculator.getDeltaHeight() < 0) {
  38. angleLow = angleX;
  39. } else {
  40. angleHigh = angleX;
  41. }
  42. } else {
  43. exitLoop = true;
  44. }
  45. } while (!exitLoop);
  46. this.calculator.setStartAngle(angleX);
  47. this.calculator.setFlightCurve(results);
  48. this.calculator.setMaxHCurve(calculateMaxHeight(results));
  49. publishProgress(0, results.length - 1);
  50. sleep(5);
  51. for (int i = 0; i < results.length; i++) {
  52. publishProgress(1, i);
  53. sleep(5);
  54. }
  55. return this.calculator;
  56. }
  57. public static Double[] calculateMaxHeight(final Double[][] flightCurve) {
  58. Double[] maxHCurve = new Double[] { 0d, 0d };
  59. Double maxH = 0.0;
  60. for (int i = 0; i < flightCurve.length; i++) {
  61. if (flightCurve[i][TrajectoryCalculator.IDX_Y] > maxH) {
  62. maxH = flightCurve[i][TrajectoryCalculator.IDX_Y];
  63. maxHCurve[0] = maxH;
  64. maxHCurve[1] = flightCurve[i][TrajectoryCalculator.IDX_T];
  65. }
  66. }
  67. return maxHCurve;
  68. }
  69. @Override
  70. protected void onProgressUpdate(final Integer... values) {
  71. super.onProgressUpdate(values);
  72. this.calculator.getListener().updateTrajectoryTxtFld(values[0], this.calculator.getFlightCurve()[values[1]], this.calculator.getStartAngle(),
  73. this.calculator.getMaxHCurve());
  74. }
  75. @Override
  76. protected void onPostExecute(final TrajectoryCalculator calculator) {
  77. super.onPostExecute(calculator);
  78. calculator.getListener().onCalculationDone(calculator.getFlightCurve(), calculator.getStartAngle(), calculator.getMaxHCurve());
  79. }
  80. private void sleep(final long millis) {
  81. try {
  82. Thread.sleep(millis);
  83. } catch (InterruptedException e) {
  84. e.printStackTrace();
  85. }
  86. }
  87. }