20160903
やっとほぼ完成したグラフ描画コード
Canvas canvas = holder.lockCanvas();
if (canvas != null){
Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawColor(Color.WHITE); //背景色
int width= canvas.getWidth();
int height=canvas.getHeight();
int a= width/2;//原点x座標
int b=height/2;//原点y座標
//x、y座標描画
paint.setStrokeWidth(3);
paint.setColor(Color.BLACK);
canvas.drawLine(a,0,a,height,paint);//x軸描画
canvas.drawLine(0,b,width,b,paint);//y軸描画
//外枠描画
paint.setStrokeWidth(10);
canvas.drawLine(0,0,width,0,paint);
canvas.drawLine(0,0,0,height,paint);
canvas.drawLine(width,0,width,height,paint);
canvas.drawLine(0,height,width,height,paint);
paint.setTextSize(50);
//グラフ描画準備
paint.setStrokeWidth(5);
//x拡大率
int magnificationX=100;
magnificationX=MainActivity.seekprg1;
if(magnificationX==0){//これがないとプログラムが停止する
magnificationX=1;
}
//画面の左端の数、すなわちxの値
//width,magnificationXはintなので丸められるのを防ぐ
double widthDouble=(double)width;
double magnificationXDouble=(double)magnificationX;
double range=widthDouble/ (magnificationXDouble*2);
//y拡大率
int magnificationY=500;
magnificationY= MainActivity.seekprg2;
if(magnificationY==0){
magnificationY=1;
}
double magnificationYDouble=(double)magnificationY;
//x 値の変化
int seekBarProgress=MainActivity.seekprg5;
//rangeの記述
paint.setColor(Color.BLACK);
// rangeの数字を丸める
BigDecimal range1 = new BigDecimal(String.valueOf(range));
//小数第1位で四捨五入
double range2 =range1.setScale(1, RoundingMode.HALF_UP).doubleValue();
//rangeを描画
canvas.drawText(String.valueOf("Range -" +(float)range2+"<x<"+(float)range2), 50, height-50, paint);
paint.setColor(Color.rgb(102,0,0));//関数表示だけ濃い茶
paint.setTextSize(60);//関数表示だけテキストサイズを大きくする
//////////////グラフ描画////////////////////////////////////////
canvas.drawText((String.valueOf("Math.sin(x)/x")), 50, 80, paint);
paint.setColor(Color.rgb(0,102,0));//グラフの色
//インクレメント設定
double x;
double y;
double increment=0.01;
for (x = -range; x <= range; x = x + increment) {
if (Math.sin(x) != 0) {
y = x/Math.sin(x);
//x,y 拡大率 関数に応じて調節する
float x1 = (float) (magnificationXDouble * x*1);
float y1 = (float) (magnificationYDouble * y*10);
//a,b平行移動してyをマイナスにする
canvas.drawPoint(x1 + a, -y1 + b, paint);
}
}
//MagX,MagYの描画
paint.setTextSize(50);
paint.setColor(Color.BLACK);
canvas.drawText(String.valueOf("MagX " +(float)magnificationX), 50, 80+60, paint);
canvas.drawText(String.valueOf("MagY " +(float)magnificationY), 50, 80+60+60, paint);
//y軸に平行な直線を描画
paint.setColor(Color.BLUE);
//seekbarの最大値値が1000であるときに賭ける必要がある倍率
float magnificationSeekBar=(float)(2*range/1000);
float x2=(float) (magnificationX *(-range + magnificationSeekBar*seekBarProgress ) );;
double x3=x2/magnificationXDouble;
float x4=(float)x3;
for(int k=0;k<b*2;k=k+1){
canvas.drawPoint(x2 + a, k , paint);
}
//x,yの値を計算して表示
x=x4;
if (x != 0) {
y = Math.sin(x)/x;
// 数字を丸める
BigDecimal x3b = new BigDecimal(String.valueOf(x3));
BigDecimal y3b = new BigDecimal(String.valueOf(y));
//小数第3位で四捨五入
double x3v =x3b.setScale(2, RoundingMode.HALF_UP).doubleValue();
double y3v =y3b.setScale(2, RoundingMode.HALF_UP).doubleValue();
paint.setColor(Color.BLACK);
canvas.drawText(String.valueOf("x =" +(float) x3v), 50,height-50-60-60, paint);
canvas.drawText(String.valueOf("y =" +(float) y3v), 50,height-50-60, paint);
}
//////////////////////////グラフ描画終わり///////////////////////////////////////////
holder.unlockCanvasAndPost(canvas);