graph improvements

This commit is contained in:
Sergey Solovyev
2013-06-16 14:43:34 +04:00
parent d1677c97e6
commit 6a4d990d9c
7 changed files with 114 additions and 44 deletions

View File

@@ -15,12 +15,9 @@ import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.solovyev.android.Android;
import org.solovyev.android.Threads;
import org.solovyev.android.calculator.*;
import org.solovyev.android.calculator.model.AndroidCalculatorEngine;
import org.solovyev.android.menu.AMenuItem;
import org.solovyev.android.menu.ActivityMenu;
import org.solovyev.android.menu.IdentifiableMenuItem;
@@ -29,6 +26,8 @@ import org.solovyev.android.sherlock.menu.SherlockMenuHelper;
import org.solovyev.common.JPredicate;
import org.solovyev.common.msg.MessageType;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -38,6 +37,8 @@ import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import static org.solovyev.android.calculator.model.AndroidCalculatorEngine.Preferences;
/**
* User: serso
* Date: 12/30/12
@@ -66,7 +67,7 @@ public abstract class AbstractCalculatorPlotFragment extends CalculatorFragment
private int bgColor;
@Nonnull
private PlotData plotData = new PlotData(Collections.<PlotFunction>emptyList(), false, PlotBoundaries.newDefaultInstance());
private PlotData plotData = new PlotData(Collections.<PlotFunction>emptyList(), false, true, PlotBoundaries.newDefaultInstance());
@Nonnull
private ActivityMenu<Menu, MenuItem> fragmentMenu;
@@ -107,15 +108,6 @@ public abstract class AbstractCalculatorPlotFragment extends CalculatorFragment
@Nullable
protected abstract PlotBoundaries getPlotBoundaries();
@Override
public void onPause() {
PreferenceManager.getDefaultSharedPreferences(this.getActivity()).unregisterOnSharedPreferenceChangeListener(this);
savePlotBoundaries();
super.onPause();
}
@Override
public void onResume() {
super.onResume();
@@ -126,9 +118,18 @@ public abstract class AbstractCalculatorPlotFragment extends CalculatorFragment
updateChart(plotData, getSherlockActivity());
}
@Override
public void onPause() {
PreferenceManager.getDefaultSharedPreferences(this.getActivity()).unregisterOnSharedPreferenceChangeListener(this);
savePlotBoundaries();
super.onPause();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (AndroidCalculatorEngine.Preferences.angleUnit.getKey().equals(key)) {
if (Preferences.angleUnit.getKey().equals(key)) {
updateChart(this.plotData, getSherlockActivity());
}
}
@@ -139,6 +140,7 @@ public abstract class AbstractCalculatorPlotFragment extends CalculatorFragment
case plot_data_changed:
final CalculatorEventHolder.Result result = this.lastEventHolder.apply(calculatorEventData);
if (result.isNewAfter()) {
assert data != null;
onNewPlotData((PlotData) data);
}
break;
@@ -164,6 +166,7 @@ public abstract class AbstractCalculatorPlotFragment extends CalculatorFragment
createGraphicalView(view, plotData);
}
assert activity != null;
activity.invalidateOptionsMenu();
}
});

View File

@@ -8,9 +8,9 @@ import android.view.MotionEvent;
import android.view.View;
import android.widget.Scroller;
import android.widget.ZoomButtonsController;
import javax.annotation.Nonnull;
import org.solovyev.common.math.Point2d;
import javax.annotation.Nonnull;
import java.text.DecimalFormat;
import java.util.Collections;
import java.util.List;
@@ -18,17 +18,19 @@ import java.util.List;
public class CalculatorGraph2dView extends View implements GraphView {
/*
**********************************************************************
*
* CONSTANTS
*
**********************************************************************
*/
**********************************************************************
*
* CONSTANTS
*
**********************************************************************
*/
private static final int NO_TOUCH = -1;
private static final float TICKS_COUNT = 15;
public static final int TICK_SIZE_PXS = 3;
private static final float Y_TO_X_ADJUST_SCALE = 2f;
private static final DecimalFormat tickFormat = new DecimalFormat("##0.#####E0");
private static final int MAX_TICK_DIGITS = 4;
private static final String[] TICK_FORMATS = new String[MAX_TICK_DIGITS];
@@ -38,6 +40,7 @@ public class CalculatorGraph2dView extends View implements GraphView {
TICK_FORMATS[i] = "%." + i + "f";
}
}
/*
**********************************************************************
*
@@ -83,7 +86,9 @@ public class CalculatorGraph2dView extends View implements GraphView {
@Nonnull
private final GraphCalculator graphCalculator = new GraphCalculatorImpl();
private boolean mDrawn = false;
private boolean drawn = false;
private boolean adjustYAxis = false;
/*
**********************************************************************
@@ -162,12 +167,17 @@ public class CalculatorGraph2dView extends View implements GraphView {
public void invalidateGraphs() {
graphsData.clear();
if (mDrawn) {
mDrawn = false;
if (drawn) {
drawn = false;
invalidate();
}
}
@Override
public void setAdjustYAxis(boolean adjustYAxis) {
this.adjustYAxis = adjustYAxis;
}
public void onResume() {
}
@@ -228,7 +238,12 @@ public class CalculatorGraph2dView extends View implements GraphView {
}
private void drawGraph(@Nonnull Canvas canvas) {
mDrawn = true;
drawn = true;
if(adjustYAxis) {
adjustYAxis();
adjustYAxis = false;
}
final float graphWidth = dimensions.getGWidth();
final float graphHeight = dimensions.getGHeight();
@@ -300,6 +315,51 @@ public class CalculatorGraph2dView extends View implements GraphView {
graphsData.setLastXMax(xMax);
}
private void adjustYAxis() {
final float xMin = dimensions.getXMin();
final float xMax = dimensions.getXMax(xMin);
float yMax = -Float.MAX_VALUE;
float yMin = Float.MAX_VALUE;
graphsData.checkBoundaries(Float.MAX_VALUE, -Float.MAX_VALUE, Float.MAX_VALUE);
final List<PlotFunction> plotFunctions = graphViewHelper.getPlotFunctions();
for (int i = 0; i < plotFunctions.size(); i++) {
final PlotFunction plotFunction = plotFunctions.get(i);
final GraphData graph = graphsData.get(i);
graphCalculator.computeGraph(plotFunction.getXyFunction(), xMin, xMax, graph, graphsData, dimensions);
final float[] ys = graph.getYs();
for (int j = 0; j < graph.getSize(); j++) {
final float y = ys[j];
if (!Float.isNaN(y)) {
yMax = Math.max(yMax, y);
yMin = Math.min(yMin, y);
}
}
}
final float xDist = xMax - xMin;
yMax = Math.min(yMax, xDist);
yMin = Math.max(yMin, -xDist);
if (yMax - yMin > 0.00000001) {
final float yDist = yMax - yMin;
float maxYDist = Y_TO_X_ADJUST_SCALE * xDist;
if (yDist > maxYDist) {
// usually functions are symmetrical => just make a symmetry
yMax = yMax - yDist / 2 + maxYDist / 2;
yMin = yMin + yDist / 2 - maxYDist / 2;
}
dimensions.setYRange(yMin, yMax);
}
}
@Nonnull
private TickDigits drawGridAndAxis(@Nonnull Canvas canvas) {
final TickDigits result = new TickDigits();

View File

@@ -203,6 +203,11 @@ public class CalculatorGraph3dView extends GLView implements GraphView {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void setAdjustYAxis(boolean adjustYAxis) {
// not supported
}
@Override
public void onSurfaceCreated(GL10 gl, int width, int height) {
gl.glDisable(GL10.GL_DITHER);

View File

@@ -4,9 +4,10 @@ import android.graphics.Bitmap;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import org.solovyev.android.calculator.R;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.solovyev.android.calculator.R;
/**
* User: serso
@@ -50,6 +51,7 @@ public class CalculatorPlotFragment extends AbstractCalculatorPlotFragment {
final PlotBoundaries boundaries = plotData.getBoundaries();
graphView.setXRange(boundaries.getXMin(), boundaries.getXMax());
graphView.setYRange(boundaries.getYMin(), boundaries.getYMax());
graphView.setAdjustYAxis(plotData.isAdjustYAxis());
graphView.setPlotFunctions(plotData.getFunctions());

View File

@@ -38,17 +38,5 @@ public interface GraphView extends ZoomButtonsController.OnZoomListener, TouchHa
void invalidateGraphs();
/* void increaseDensity();
void decreaseDensity();*/
/*
**********************************************************************
*
* CUSTOMIZATION
*
**********************************************************************
*/
/* void setBgColor(int color);
void setAxisColor(int color);*/
void setAdjustYAxis(boolean adjustYAxis);
}