瀏覽代碼

Berechnung

master
gitsvn 12 年之前
父節點
當前提交
99c5251e15

+ 11
- 0
res/drawable/evs_background.xml 查看文件

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="@color/qrt_translucent_white" />
<stroke
android:width="2dp"
android:color="@color/gray_medium" />
</shape>

res/drawable-hdpi/evs_nok_background.xml → res/drawable/evs_nok_background.xml 查看文件


res/drawable-hdpi/evs_ok_background.xml → res/drawable/evs_ok_background.xml 查看文件


+ 1
- 3
res/layout/rbs_archerysetup_item.xml 查看文件

@@ -39,9 +39,7 @@
android:textAppearance="?android:attr/textAppearanceMediumInverse"
android:textColor="@color/black"
android:textSize="18sp"
app:drawBorder="true"
app:drawBorderColor="@color/black"
app:drawBorderWidth="1dp"
app:drawBorder="false"
app:font="@string/TitilliumWeb_Bold" />
<ch.spherIC.recurvebowsight.components.FontTextView

+ 1
- 2
res/layout/rbs_main.xml 查看文件

@@ -940,10 +940,9 @@
android:layout_marginLeft="5dp"
android:layout_marginRight="1dp"
android:layout_weight="1"
android:background="@drawable/evs_ok_background"
android:background="@drawable/evs_background"
android:gravity="left|center_vertical"
android:paddingLeft="9dp"
android:text="12.2"
android:textAppearance="?android:attr/textAppearanceMediumInverse"
app:txtFont="@string/TitilliumWeb_Bold" />
</TableRow>

+ 1
- 0
res/values-de/strings.xml 查看文件

@@ -54,5 +54,6 @@
<string name="caption_Cancel">Abbrechen</string>
<string name="caption_NoSelection">Keine Auswahl&#8230;</string>
<string name="caption_FillAllMandatoryFields">Um die Berechnung durchzuführen, müssen alle Parameterfelder abgefüllt sein.</string>
<string name="caption_Calculating">Berechnung läuft&#8230;</string>
</resources>

+ 2
- 1
res/values/strings.xml 查看文件

@@ -55,5 +55,6 @@
<string name="caption_Cancel">Cancel</string>
<string name="caption_NoSelection">No selection&#8230;</string>
<string name="caption_FillAllMandatoryFields">To start the calculation all parameter fields must be filled.</string>

<string name="caption_Calculating">Calculating&#8230;</string>
</resources>

+ 126
- 63
src/ch/spherIC/recurvebowsight/RBSMainActivity.java 查看文件

@@ -1,6 +1,7 @@
package ch.spherIC.recurvebowsight;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
@@ -14,13 +15,14 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
@@ -38,6 +40,8 @@ import ch.spherIC.recurvebowsight.database.RBSDatabaseHelper;
import ch.spherIC.recurvebowsight.database.dao.RiserDao;
import ch.spherIC.recurvebowsight.database.dao.SightDao;
import ch.spherIC.recurvebowsight.dialog.ChooseArcherySetupDlg.ChooseArcherySetupDlgDismissListener;
import ch.spherIC.recurvebowsight.logic.CalculationTask;
import ch.spherIC.recurvebowsight.logic.TrajectoryCalculator;
import ch.spherIC.recurvebowsight.model.IArcherySetup;
import ch.spherIC.recurvebowsight.model.IRiser;
import ch.spherIC.recurvebowsight.model.ISight;
@@ -47,7 +51,6 @@ import ch.spherIC.recurvebowsight.model.Sight;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
@@ -55,6 +58,7 @@ import java.util.StringTokenizer;
public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDismissListener, TrajectoryCalculation {
public static final DecimalFormat DF = new DecimalFormat("0.##");
public static final DecimalFormat DF_1 = new DecimalFormat("0.00");
public static final DecimalFormat DF_EVS = new DecimalFormat("0.#");
public static final int DLG_CHOOSE_ARCHERYSETUP = 0;
@@ -64,6 +68,8 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
private static final Double ANGLE_90 = 90d;
private static final int MIN_DISTANCE = 50;
private static final double CENTI = 0.01;
private static final double MILLI = 0.001;
private ViewFlipper viewFlipper;
private ScrollView paramsScrollView;
@@ -98,12 +104,13 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
private TextView scVertScaleRngTxtFld;
private TextView scVertScaleMiddleTxtFld;
private FontTextView scEvSValue;
private Button calcSettingBtn;
private boolean showInfoMenu;
private IArcherySetup selectedArcherySetup;
private Double startAngle;
private Activity riserSightConfigActivity;
private AlertDialog calculationAlert;
@Override
@@ -112,6 +119,10 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
setContentView(R.layout.rbs_main);
PlatformUtils.getPlatformSelectionColor(getApplicationContext());
this.calculationAlert = new AlertDialog.Builder(this).create();
this.calculationAlert.setCancelable(false); // This blocks the 'BACK' button
this.calculationAlert.setMessage(getApplicationContext().getResources().getString(R.string.caption_Calculating));
UnitConverter.setApplication(getApplication());
RBSDatabaseHelper.setContext(this);
RBSDatabaseHelper.getInstance().initializeDB();
@@ -130,41 +141,19 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
List<IRiser> risers = RiserDao.getInstance().loadAll();
risers.add(0, new Riser(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, null));
this.scRiserSpinner.setAdapter(new FontArrayAdapter<IRiser>(this, R.layout.rbs_spinner, risers,
this.scRiserSpinner));
this.scRiserSpinner.setAdapter(new FontArrayAdapter<IRiser>(this, R.layout.rbs_spinner, risers, this.scRiserSpinner));
List<ISight> sights = SightDao.getInstance().loadAll();
sights.add(0,
new Sight(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, "", null, null));
this.scSightSpinner.setAdapter(new FontArrayAdapter<ISight>(this, R.layout.rbs_spinner, sights,
this.scSightSpinner));
sights.add(0, new Sight(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, "", null, null));
this.scSightSpinner.setAdapter(new FontArrayAdapter<ISight>(this, R.layout.rbs_spinner, sights, this.scSightSpinner));
addRiserAndSightSpinnerListeners();
}
// ************************************************************************
// ** TEST WEISE AB HIER***************************************************
// ************************************************************************
this.listView1 = (ListView) findViewById(R.id.listView1);
String[] values = new String[] { "Riser", "Sight", "General Config" };
final ArrayList<String> list = new ArrayList<String>(Arrays.asList(values));
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
this.listView1.setAdapter(adapter);
this.listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position,
final long id) {
final String item = (String) parent.getItemAtPosition(position);
if (item.equals("Riser")) {
Intent intent = new Intent(RBSMainActivity.this, RiserSightConfigurationActivity.class);
startActivity(intent);
}
}
});
@Override
protected void onRestoreInstanceState(final Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
this.viewFlipper.setDisplayedChild(savedInstanceState.getInt("ViewFlipper.SelectedView", 0));
}
@Override
@@ -206,6 +195,8 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
this.scVertScaleRngTxtFld = (TextView) findViewById(R.id.scVertScaleRngTxtFld);
this.scVertScaleMiddleTxtFld = (TextView) findViewById(R.id.scVertSkalaMiddleTxtFld);
this.scEvSValue = (FontTextView) findViewById(R.id.scEvSValue);
this.calcSettingBtn = (Button) findViewById(R.id.scBtnCalc);
}
@@ -247,9 +238,10 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
}
RBSMainActivity.this.scHeVSTxtFld.setVisibility(View.INVISIBLE);
RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().width,
RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().height,
0f));
RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld
.getLayoutParams().width,
RBSMainActivity.this.scHeVSTxtFld
.getLayoutParams().height, 0f));
RBSMainActivity.this.scHeVSSpinner.setVisibility(View.VISIBLE);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner.getLayoutParams().width,
@@ -257,14 +249,13 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
1f);
params.gravity = Gravity.FILL_VERTICAL;
RBSMainActivity.this.scHeVSSpinner.setLayoutParams(params);
RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this,
R.layout.rbs_spinner,
listHeVis,
RBSMainActivity.this.scHeVSSpinner));
RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this, R.layout.rbs_spinner,
listHeVis, RBSMainActivity.this.scHeVSSpinner));
RBSMainActivity.this.scHeVSSpinner.setSelection(0);
if (RBSMainActivity.this.selectedArcherySetup != null
&& RBSMainActivity.this.selectedArcherySetup.getSight().getId() == sight.getId()) {
RBSMainActivity.this.scHeVSSpinner.setSelectionByVal(DF.format(RBSMainActivity.this.selectedArcherySetup.getSightHorSetting()));
RBSMainActivity.this.scHeVSSpinner.setSelectionByVal(DF.format(RBSMainActivity.this.selectedArcherySetup
.getSightHorSetting()));
}
RBSMainActivity.this.scaVTxtFld.setText(DF.format(sight.getAV()));
RBSMainActivity.this.scaHTxtFld.setText(DF.format(sight.getAH()));
@@ -272,15 +263,16 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
+ DF.format(sight.getVertSkalaRangeMax()));
} else {
RBSMainActivity.this.scHeVSSpinner.setVisibility(View.INVISIBLE);
RBSMainActivity.this.scHeVSSpinner.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner.getLayoutParams().width,
RBSMainActivity.this.scHeVSSpinner.getLayoutParams().height,
0f));
RBSMainActivity.this.scHeVSSpinner.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner
.getLayoutParams().width,
RBSMainActivity.this.scHeVSSpinner
.getLayoutParams().height, 0f));
RBSMainActivity.this.scHeVSTxtFld.setVisibility(View.VISIBLE);
RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().width,
RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().height,
1f));
RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this,
R.layout.rbs_spinner,
RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld
.getLayoutParams().width,
RBSMainActivity.this.scHeVSTxtFld
.getLayoutParams().height, 1f));
RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this, R.layout.rbs_spinner,
new ArrayList<String>(),
RBSMainActivity.this.scHeVSSpinner));
RBSMainActivity.this.scaVTxtFld.setText("");
@@ -438,6 +430,13 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
this.txtViewParams.setOnTouchListener(tabListener);
this.txtViewResults.setOnTouchListener(tabListener);
this.txtViewSight.setOnTouchListener(tabListener);
this.calcSettingBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
calculateSettings();
}
});
}
@@ -474,6 +473,34 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
calculate();
return true;
case R.id.addConfiguration:
// ************************************************************************
// ** TEST WEISE AB HIER***************************************************
// ************************************************************************
// this.listView1 = (ListView) findViewById(R.id.listView1);
//
// String[] values = new String[] { "Riser", "Sight", "General Config" };
//
// final ArrayList<String> list = new ArrayList<String>(Arrays.asList(values));
// final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
// this.listView1.setAdapter(adapter);
// this.listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//
// @Override
// public void onItemClick(final AdapterView<?> parent, final View view, final int position,
// final long id) {
// final String item = (String) parent.getItemAtPosition(position);
// if (item.equals("Riser")) {
Intent intent = new Intent(RBSMainActivity.this, RiserSightConfigurationActivity.class);
startActivity(intent);
// }
// }
// });
return true;
case R.id.moreItems:
this.showInfoMenu = true;
closeOptionsMenu();
@@ -588,20 +615,20 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
public void onArcherySetupDlgDismissed(final IArcherySetup archerySetup) {
this.selectedArcherySetup = archerySetup;
if (archerySetup != null && archerySetup.getId() != -999) {
this.arrowDiameterTxtFld.setText(archerySetup.getArrowDiameter().toString());
this.arrowCwTxtFld.setText(archerySetup.getArrowCw().toString());
this.arrowWeightTxtFld.setText(archerySetup.getArrowWeight().toString());
this.bowPulloutTxtFld.setText(archerySetup.getBowPullout().toString());
this.arrowV0TxtFld.setText(archerySetup.getArrowV0().toString());
this.arrowNockHeightTxtFld.setText(archerySetup.getArrowNockHeight().toString());
this.targetCenterHeightTxtFld.setText(archerySetup.getArrowCenterHeight().toString());
this.arrowDiameterTxtFld.setText(DF.format(archerySetup.getArrowDiameter()));
this.arrowCwTxtFld.setText(DF.format(archerySetup.getArrowCw()));
this.arrowWeightTxtFld.setText(DF.format(archerySetup.getArrowWeight()));
this.bowPulloutTxtFld.setText(DF.format(archerySetup.getBowPullout()));
this.arrowV0TxtFld.setText(DF.format(archerySetup.getArrowV0()));
this.arrowNockHeightTxtFld.setText(DF_1.format(archerySetup.getArrowNockHeight()));
this.targetCenterHeightTxtFld.setText(DF_1.format(archerySetup.getArrowCenterHeight()));
this.calcTimeIntervalCboBox.setSelectionByVal(archerySetup.getDeltaTime().toString());
this.calcAccuracyCboBox.setSelectionByVal(archerySetup.getCalcPrecision().toString());
this.scRiserSpinner.setSelectedRiser(archerySetup.getRiser());
this.scRiserSpinner.fireSelectionChangedEvent();
this.scSightSpinner.setSelectedSight(archerySetup.getSight());
this.scSightSpinner.fireSelectionChangedEvent();
this.scVertScaleMiddleTxtFld.setText(archerySetup.getSightVertSkalaMiddle().toString());
this.scVertScaleMiddleTxtFld.setText(DF.format(archerySetup.getSightVertSkalaMiddle()));
} else {
this.arrowDiameterTxtFld.setText("");
this.arrowDiameterTxtFld.setText("");
@@ -656,7 +683,25 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
if (allParamFieldsValid()) {
/** TODO: TrajectoryCalculator-Objekt instanzieren mit Eigabewerten, CalculationTask instanzieren und executen mit TrajectoryCalculator-Objekt*/
CalculationTask calcTask = new CalculationTask();
TrajectoryCalculator calculator = new TrajectoryCalculator(Double.valueOf(this.arrowDiameterTxtFld.getText().toString().trim()) * MILLI, //
Double.valueOf(this.arrowCwTxtFld.getText().toString().trim()), //
Double.valueOf(this.arrowWeightTxtFld.getText().toString().trim()) * MILLI, //
Double.valueOf(this.arrowV0TxtFld.getText().toString().trim()), //
Double.valueOf(this.shootingDistanzTxtFld.getText().toString().trim()), //
Double.valueOf(this.arrowNockHeightTxtFld.getText().toString().trim())
- Double.valueOf(this.targetCenterHeightTxtFld.getText().toString().trim()), //
Double.valueOf(this.airTemperatureTxtFld.getText().toString().trim()), //
Double.valueOf(this.airRelativeHumidityTxtFld.getText().toString().trim())
* CENTI, //
Double.valueOf(this.calcTimeIntervalCboBox.getSelectedItem().toString().trim()), //
Double.valueOf(this.calcAccuracyCboBox.getSelectedItem().toString().trim())
* CENTI, //
this);
calculator.setStartAngle(0d);
calcTask.execute(calculator);
this.calculationAlert.show();
} else {
Toast toast = Toast.makeText(this, getResources().getString(R.string.caption_FillAllMandatoryFields), Toast.LENGTH_LONG);
@@ -669,9 +714,21 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
@Override
public void onCalculationDone(final Double[][] flightCurve, final Double startAngle, final Double[] maxHCurve) {
this.startAngle = startAngle;
/** TODO: Flugbahnkurven-View (Werte-Tabelle und Chart) updaten */
calculateSettings();
if (this.calculationAlert != null) {
this.calculationAlert.dismiss();
}
this.txtViewSight.doSingleTouch();
}
/**
* Berechnet die definitve Visiereinstellung anhand des berechneten Flugbahnwinkels.
*/
private void calculateSettings() {
if (allSightParamFieldsValid()) {
@@ -688,15 +745,21 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi
Double vVh = Double.valueOf(this.scVvisHTxtFld.getText().toString()) + Double.valueOf(this.scaHTxtFld.getText().toString());
Double vVv = Double.valueOf(this.scVvisVTxtFld.getText().toString()) + Double.valueOf(this.scaVTxtFld.getText().toString());
Double a = Double.valueOf(this.bowPulloutTxtFld.getText().toString()) * 10;
Double heVs = this.scHeVSSpinner.getVisibility() == View.VISIBLE ? Double.valueOf(this.scHeVSSpinner.getSelectedItem().toString()) : Double.valueOf(this.scHeVSTxtFld.getText().toString());
Double heVs = this.scHeVSSpinner.getVisibility() == View.VISIBLE ? Double.valueOf(this.scHeVSSpinner.getSelectedItem().toString())
: Double.valueOf(this.scHeVSTxtFld.getText().toString());
Double lhNA = this.selectedArcherySetup.getHNA() * 10;
Double dltH = (Double.valueOf(this.arrowNockHeightTxtFld.getText().toString())
- Double.valueOf(this.targetCenterHeightTxtFld.getText().toString())) * Math.pow(10, 3);
Double ldistH = Double.valueOf(this.shootingDistanzTxtFld.getText().toString()) * Math.pow(10, 3);
Double minSkala = this.scVertScaleRngTxtFld.getText().toString().contains("-") ? Double.valueOf(this.scVertScaleRngTxtFld.getText().toString().substring(0,
this.scVertScaleRngTxtFld.getText().toString().indexOf('-'))) : 0d;
Double maxSkala = this.scVertScaleRngTxtFld.getText().toString().contains("-") ? Double.valueOf(this.scVertScaleRngTxtFld.getText().toString().substring(this.scVertScaleRngTxtFld.getText().toString().indexOf('-') + 1,
this.scVertScaleRngTxtFld.getText().toString().length())) : 0d;
Double minSkala = this.scVertScaleRngTxtFld.getText().toString().contains("-")
? Double.valueOf(this.scVertScaleRngTxtFld.getText().toString().substring(0,
this.scVertScaleRngTxtFld.getText().toString()
.indexOf('-'))) : 0d;
Double maxSkala = this.scVertScaleRngTxtFld.getText().toString().contains("-")
? Double.valueOf(this.scVertScaleRngTxtFld.getText().toString().substring(this.scVertScaleRngTxtFld.getText().toString()
.indexOf('-') + 1,
this.scVertScaleRngTxtFld.getText().toString()
.length())) : 0d;
// PIN auf Höhe Pfeil
x0 = (a + vVh + heVs) * Math.cos(Math.toRadians(this.startAngle));

+ 15
- 0
src/ch/spherIC/recurvebowsight/components/XTextView.java 查看文件

@@ -23,8 +23,12 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.MotionEvent;
import ch.spherIC.recurvebowsight.R;
@@ -89,6 +93,7 @@ public class XTextView extends FontTextView {
setPadding(getPaddingLeft() + this.drawborderWidth, getPaddingTop() + this.drawborderWidth, getPaddingRight() + this.drawborderWidth,
getPaddingBottom() + this.drawborderWidth);
}
a.recycle();
}
@@ -158,4 +163,14 @@ public class XTextView extends FontTextView {
return this.drawborderColor;
}
public void doSingleTouch() {
long now = SystemClock.uptimeMillis();
MotionEvent evtDwn = MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, 0, 0, 0);
MotionEvent evtUp = MotionEvent.obtain(now, now + 1, MotionEvent.ACTION_UP, 0, 0, 0);
dispatchTouchEvent(evtDwn);
dispatchTouchEvent(evtUp);
evtDwn.recycle();
evtUp.recycle();
}
}

+ 2
- 1
src/ch/spherIC/recurvebowsight/database/RBSDatabaseHelper.java 查看文件

@@ -121,7 +121,8 @@ public final class RBSDatabaseHelper extends SQLiteOpenHelper {
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
// TODO Auto-generated method stub
/** TODO Upgrade tasks */
}

+ 70
- 6
src/ch/spherIC/recurvebowsight/logic/CalculationTask.java 查看文件

@@ -11,19 +11,83 @@ import android.os.AsyncTask;
*/
public class CalculationTask extends AsyncTask<TrajectoryCalculator, Void, TrajectoryCalculator> {
private static final Double PHI = 1.0;
@Override
protected TrajectoryCalculator doInBackground(final TrajectoryCalculator... params) {
TrajectoryCalculator trjCalc = params[0];
/** TODO: Berechnung anlog ArrowFlight-TrajectoryCalculatorThread.run(), Resultate in trjCalc abspeichern */
TrajectoryCalculator calculator = params[0];
boolean exitLoop = false;
Double angleX = 0.0;
Double angleHigh = 0.0;
Double angleLow = calculator.getStartAngle() + PHI;
Double[][] results;
Double frictionCoefficient = calculator.calculateFrictionCoeficient();
// Startwerte für angleLow und angleHigh berechnen
do {
angleLow -= PHI;
results = calculator.calculateTrajectory(angleLow, frictionCoefficient);
} while (results[results.length - 1][TrajectoryCalculator.IDX_Y] - calculator.getDeltaHeight() > 0);
angleHigh = angleLow;
do {
angleHigh += PHI;
results = calculator.calculateTrajectory(angleHigh, frictionCoefficient);
} while (results[results.length - 1][TrajectoryCalculator.IDX_Y] - calculator.getDeltaHeight() < 0);
// Winkel suchen mit Hilfe der Regula Falsi und Flugbahnberechnungsiterationen
do {
angleX = (angleHigh + angleLow) / 2;
results = calculator.calculateTrajectory(angleX, frictionCoefficient);
if (Math.abs(calculator.getDeltaHeight() - results[results.length - 1][TrajectoryCalculator.IDX_Y])
> calculator.getCalculationPrecision()) {
if (results[results.length - 1][TrajectoryCalculator.IDX_Y] - calculator.getDeltaHeight() < 0) {
angleLow = angleX;
} else {
angleHigh = angleX;
}
return trjCalc;
} else {
exitLoop = true;
}
} while (!exitLoop);
calculator.setStartAngle(angleX);
calculator.setFlightCurve(results);
calculator.setMaxHCurve(calculateMaxHeight(results));
return calculator;
}
private 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 onPostExecute(final TrajectoryCalculator trjCalc) {
super.onPostExecute(trjCalc);
trjCalc.getListener().onCalculationDone(trjCalc.getFlightCurve(), trjCalc.getStartAngle(), trjCalc.getMaxHCurve());
protected void onPostExecute(final TrajectoryCalculator calculator) {
super.onPostExecute(calculator);
calculator.getListener().onCalculationDone(calculator.getFlightCurve(), calculator.getStartAngle(), calculator.getMaxHCurve());
}
}

+ 7
- 4
src/ch/spherIC/recurvebowsight/logic/TrajectoryCalculator.java 查看文件

@@ -57,7 +57,6 @@ public class TrajectoryCalculator {
* @param deltaHeight
* @param airTemperature
* @param relativeHumidity
* @param startAngle
* @param deltaTime
* @param calculationPrecision
* @param listener
@@ -88,10 +87,10 @@ public class TrajectoryCalculator {
}
public Double[][] calculateTrajectory() {
public Double[][] calculateTrajectory(final Double startAngle, final Double frictionCoefficient) {
List<Double[]> results = new ArrayList<Double[]>();
Double angle = Math.toRadians(this.startAngle);
Double angle = Math.toRadians(startAngle);
Double vxOld = Math.cos(angle) * this.v0;
Double vyOld = Math.sin(angle) * this.v0;
Double vxNew = 0d;
@@ -101,7 +100,7 @@ public class TrajectoryCalculator {
Double xOld = 0d;
Double yOld = 0d;
Double totTime = 0d;
Double k = calculateFrictionCoeficient(this.arrowCw, this.arrowDiameter, this.airTemperature, this.relativeHumidity);
Double k = frictionCoefficient; //calculateFrictionCoeficient(this.arrowCw, this.arrowDiameter, this.airTemperature, this.relativeHumidity);
Double m = this.arrowWeight;
Double[] r1 = new Double[5];
@@ -164,6 +163,10 @@ public class TrajectoryCalculator {
}
public Double calculateFrictionCoeficient() {
return calculateFrictionCoeficient(this.arrowCw, this.arrowDiameter, this.airTemperature, this.relativeHumidity);
}
public Double calculateFrictionCoeficient(final Double arrowCw, final Double arrowDiameter,
final Double airTemperature, final Double relativeHumidity) {

Loading…
取消
儲存