20161011
数学のプログラムはやればできるのに、インターフェースで苦労している。NavigationDrawerとFragmentを使って作るのが流行りみたいだ。で、コードを調べるとリフレクションが出てきた。そんなのありかよって感じ、カプセル化に反するみたいだ。今日初めて知った。Fragmentなんて少し前の分厚いAndroidstudioの参考書には全く記載がない。
20160726
三角関数を30個作った。意外に少ないと感じる。式を変形させて50個にしたい。
20160723
五月から数学アプリを作り始めて、ようやく原型みたいなものができた。3か月かかってしまった。seekbar intent surfaceview thread を利用したアプリで、高校数学に出てくるすべての関数をグラフにする計画だ。
20160619
数学アプリを作成して世界中にアプリを売って、ワンランクアップの生活をしてみたいな。
10年以上前にjavaアプレットで数学アプリを作成していたけれど、ブラウザのセキュリティの関係があるためなのかアプレットは動作しなくなってしまった。AndroidStudioが出たので再度挑戦したいと思っている。モンテカルロ法でパイを求めるアニメーションはできた。区分求積法でパイを求めたり、テーラー展開をアニメーションで表示したり。数値計算したり。高校数学でプログラムでわかりやすくなる課題をできるだけ多く作成しアプリにするつもりだ。Canvusでガリガリ書くスマートではプログラムだけれど、今のところネット上でテーラー展開をアニメーションで表示するのを説明するサイトはないし。検索範囲を世界に広げてみたいと思っているけど。で、ここ1週間ほど、いい手はないか調べていたけれで、検索したけれどネット上にどこにもなくて、強引にガリガリ書いて、完成させました。以下がそうです。ネットで検索してコードをコピペして、自分で書き換えたものです。
package com.example.wata.myapplication;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public class GraphicView extends View {
private int n =0;
int lastnumber=40;
double[] x= new double[1000000];
double[] y= new double[1000000];
private ScheduledExecutorService ses = null;
//再描画のメソッド
private final Runnable task = new Runnable(){
@Override
public void run() {
n=n+1;
//アニメーションを停止する
if (n>lastnumber-1) {
onPause();
}
// 画面を更新
postInvalidate();
}
};
//コンストラクタ
public GraphicView(Context context) {
super(context);
}
public void onResume(){
// タイマーの作成
ses = Executors.newSingleThreadScheduledExecutor();
// 一定時間ごとにRunnableの処理を実行
// => scheduleAtFixedRate(Runnableオブジェクト , 最初の実行時間 , 実行の周期 , 値の単位(列挙型TimeUnitの値) )
ses.scheduleAtFixedRate(task, 2000,100, TimeUnit.MILLISECONDS);
}
public void onPause(){
if (ses != null) {
// タイマーを停止する
ses.shutdown();
ses = null;
}
}
@Override
protected void onDraw(Canvas canvas) {
//super.onDraw(canvas);
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setTextSize(100);
paint.setStrokeWidth(5);//drawpointの大きさ
Cos cos=new Cos();
//n項まで展開
cos.set(n);
for(int i = 0; i < 2000; i++)
{
x[i]=i;
y[i] = cos.get(i);
}
for( int i=0;i<2000 ;i++) {//配列に代入されている値を全部出す
double y1=Math.cos( Math.PI/180*i);
paint.setColor(Color.BLUE);
canvas.drawPoint((int) (x[i]), (int) (-100 * (y1) + 1000), paint);
paint.setColor(Color.RED);
canvas.drawPoint((int) (x[i]), (int) (-100 * (y[i]) + 1000), paint);
String scounter1 = String.valueOf(n);
canvas.drawText(scounter1, 200, 1500, paint);
}
}
}
-------
上のファイルはGraphicView.java そのほかにCos.java ,MainActivty.javaを必要とする。
package com.example.wata.myapplication;
/**
* Created by wata on 2016/06/05.
*/
public class Cos {
int n; //n項まで展開
void set(int n) {
this.n = n;
}
double get(double x) {
double s = 1.0;
double e = 1.0;
int k = 1;
// π/180*x
double x1 = 0.017453292519938889 * x;
for (k = 1; k <= n; k += 2) {
//cosx=1-x*x/1*2+x*x*x*x/1*2*3*4+
e = (-e * x1 * x1) / (double) ((k + 1) * k);
s += e;
}
return s;
}
}
-----------------------
package com.example.wata.myapplication;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
private GraphicView graphicView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//GraphicViewのオブジェクト生成
graphicView = new GraphicView(this);
setContentView(graphicView);
}
@Override
protected void onPause() {
// TODO 自動生成されたメソッド・スタブ
super.onPause();
graphicView.onPause();
}
@Override
protected void onResume() {
// TODO 自動生成されたメソッド・スタブ
super.onResume();
graphicView.onResume();
}
---------------------------------------------------------------------------------
以下は描画範囲を限定するプログラムだけれど役に立たないと思う。
final Paint paint = new Paint();
float height=canvas.getHeight();
float width=canvas.getWidth();
//グラフ描画範囲
float originalpointx=width/2;//原点x
float originalpointy=height/2;//原点y
float margin=width/10;//marginはwidthの1/10
float side=width/2-margin;//辺side=width/2-margin
float upperleftx=margin;//上、左x座標
float upperlefty=originalpointy-side; //上、左y座標
float uppercenterx=originalpointx;//上、中央x座標
float uppercentery=originalpointy-side;//上、中央y座標
float upperrightx=originalpointx+side;//上、右x座標
float upperrighty=originalpointy-side;//上、右y座標
float centerleftx=margin;
float centerlefty=originalpointy;
float centerrightx=originalpointx+side;
float centerrighty=originalpointy;
float underleftx=margin;
float underlefty=originalpointy+side;
float undercenterx=originalpointx;
float undercentery=originalpointy+side;
float underrightx=originalpointx+side;
float underrighty=originalpointy+side;
//グラフ描画
paint.setAntiAlias(true);
paint.setStrokeWidth(3);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.GRAY);
canvas.drawLine(upperleftx,upperlefty,upperrightx,upperrighty,paint);
canvas.drawLine(centerleftx,centerlefty,centerrightx,centerrighty,paint);
canvas.drawLine(upperleftx,upperlefty,underleftx,underlefty,paint);
canvas.drawLine(uppercenterx,uppercentery,undercenterx,undercentery,paint);
canvas.drawLine(upperrightx,upperrighty,underrightx,underrighty,paint);
canvas.drawLine(underleftx,underlefty,underrightx,underrighty,paint);
float a=originalpointx; //x軸方向にa平行移動
float b=originalpointy; //y軸方向にb平行移動
paint.setColor(Color.BLUE);
paint.setStrokeWidth(5);
float x;
float y;
for(x=-10;x<10;x=x+0.1f) {
y=x*x/10;
int uppery=(int)upperlefty;
int undery=(int)underlefty;
int leftx=(int)upperleftx;
int rightx=(int)upperrightx;
int x1=(int) (x*50+a);//画面上の点のx座標
int y1=(int) (-y*50+b);//画面上の点のy座標
if(x1<rightx) {
if (x1 > leftx) {
if (y1 < undery) {
if (y1 > uppery) {
canvas.drawPoint(x * 50 + a, -y * 50 + b, paint);
//a,b平行移動してyをマイナスにする
}
}
}
}
}