目盛りを描くプログラム 山中和義 2004/03/15 21:02:01 ├その1 山中和義 2004/03/15 21:03:17 ├その2 山中和義 2004/03/15 21:03:59 ├その3 山中和義 2004/03/15 21:04:29 ├サンプル 山中和義 2004/03/15 21:11:58 │└続き 山中和義 2004/03/15 21:12:33 ├今夜は忙しいので もりの 2004/03/16 00:06:32 ├サンプルその2 山中和義 2004/03/16 15:38:28 │├続き 山中和義 2004/03/16 15:39:23 │├EXTERNALPICTURE もりの 2004/03/16 20:41:17 ││└ちゃんと動作していますよ! 山中和義 2004/03/17 09:19:29 ││ └やっぱり もりの 2004/03/18 19:26:31 ││ └エラーにならない命令を模索して 山中和義 2004/03/19 10:36:10 │└いくつかのバリエーションです。 山中和義 2004/03/17 09:36:11 └数学の項目別棒グラフについて もりの 2004/03/20 22:41:41
目盛りを描くプログラム 山中和義 2004/03/15 21:02:01 ツリーへ
目盛りを描くプログラム |
返事を書く |
山中和義 2004/03/15 21:02:01 | |
部品として作ってみました。 使ってみてください。 |
├その1 山中和義 2004/03/15 21:03:17 ツリーへ
Re: 目盛りを描くプログラム |
返事を書く |
山中和義 2004/03/15 21:03:17 | |
その1 !目盛りを描く SET WINDOW 0,640,0,480 !左下が原点。横がX、縦Y SET COLOR mode "NATIVE" !RGB指定 SET TEXT font "",12 !文字サイズ !サンプル DRAW hMeasure(10,200,colorindex(1,0,1),-13,56,500, 1,-5,10, 1,0.1,"mm","cm", "U") DRAW hMeasure(10,320,colorindex(1,0,0),75,143,600, 5,10,100, 1,0.01,"cm","m", "D") DRAW hMeasure(10,400,colorindex(1,0,0),0,10,250, 1,5,10, 1,1,"g","g", "") DRAW vMeasure2(300,20,colorindex(0,0,0),100, 5,2,2, 1,0.1,"dl","g", "") !目盛りを描く DRAW vMeasure2(100,20,colorindex(0,0,1),150, 5,2,1, 0.1,0.1,"","g", "") END |
├その2 山中和義 2004/03/15 21:03:59 ツリーへ
Re: 目盛りを描くプログラム |
返事を書く |
山中和義 2004/03/15 21:03:59 | |
その2 !汎用ルーチン ver 0.1 by K.Yamanaka !●垂直に等分目盛りを描く !位置(x,y)に色cの目盛りを幅lenの線分で表す。 !目盛りはm3等分(大)、m2等分(中)、m1等分(小)して刻み、方向dir$に表示する。 !単位は目盛り(中)u1$、目盛り(大)u2$の数値と一緒に表示できる。 !単位との整合性は、目盛り(中)r1,目盛り(大)r2の比率で調整する EXTERNAL PICTURE vMeasure2(x,y,c,len,m1,m2,m3,r1,r2,u1$,u2$,dir$) SET LINE COLOR c PLOT LINES:x,y;x,y+len-1 !軸を描く LET mm = 1 if m1<>0 then LET mm = mm * ABS(m1) if m2<>0 then LET mm = mm * ABS(m2) if m3<>0 then LET mm = mm * ABS(m3) LET asp = len/mm !比率を算出する call checkside(dir$,dd,dt) !表示方向を設定する SET TEXT COLOR c for i=0 to mm LET dy = asp*i if m3<>0 and MOD(i,m2*m1)=0 then !大目盛りがある場合 PLOT LINES:x,y+dy; x+30*dd,y+dy !目盛りを描く if m3>0 then !数値がある場合 PLOT TEXT ,AT x+30*dd+30*dt,y+dy:STR$(i*r2)&u2$ end if else if m2<>0 and MOD(i,m1)=0 then !中目盛りがある場合 PLOT LINES:x,y+dy; x+20*dd,y+dy !目盛りを描く if m2>0 then !数値がある場合 PLOT TEXT ,AT x+20*dd+30*dt,y+dy:STR$(i*r1)&u1$ end if else if m1>0 then !小目盛りがある場合 PLOT LINES:x,y+dy; x+10*dd,y+dy !目盛りを描く end if end if end if next i END PICTURE !●水平に等分目盛りを描く !位置(x,y)に色cの目盛りを幅lenの線分で表す。 !目盛りはm3等分(大)、m2等分(中)、m1等分(小)して刻み、方向dir$に表示する。 !単位は目盛り(中)u1$、目盛り(大)u2$の数値と一緒に表示できる。 !単位との整合性は、目盛り(中)r1,目盛り(大)r2の比率で調整する EXTERNAL PICTURE hMeasure2(x,y,c,len,m1,m2,m3,r1,r2,u1$,u2$,dir$) SET LINE COLOR c PLOT LINES:x,y;x+len-1,y !軸を描く LET mm = 1 if m1<>0 then LET mm = mm * ABS(m1) if m2<>0 then LET mm = mm * ABS(m2) if m3<>0 then LET mm = mm * ABS(m3) LET asp = len/mm !比率を算出する call checkside(dir$,dd,dt) !表示方向を設定する SET TEXT COLOR c for i=0 to mm LET dx = asp*i if m3<>0 and MOD(i,m2*m1)=0 then !大目盛りがある場合 PLOT LINES:x+dx,y; x+dx,y+30*dd !目盛りを描く if m3>0 then !数値がある場合 PLOT TEXT ,AT x+dx-10,y+30*dd+20*dt:STR$(i*r2)&u2$ end if else if m2<>0 and MOD(i,m1)=0 then !中目盛りがある場合 PLOT LINES:x+dx,y; x+dx,y+20*dd !目盛りを描く if m2>0 then !数値がある場合 PLOT TEXT ,AT x+dx-10,y+20*dd+20*dt:STR$(i*r1)&u1$ end if else if m1>0 then !小目盛りがある場合 PLOT LINES:x+dx,y; x+dx,y+10*dd !目盛りを描く end if end if end if next i END PICTURE |
├その3 山中和義 2004/03/15 21:04:29 ツリーへ
Re: 目盛りを描くプログラム |
返事を書く |
山中和義 2004/03/15 21:04:29 | |
その3 !●水平に目盛りを描く !位置(x,y)に色cの目盛りを最小値min、最大値maxの範囲で、幅lenの線分で表す。 !目盛り(小)m、目盛り(中)m1、目盛り(大)m2を表示方向dir$に表示する。 !単位は目盛り(中)u1$、目盛り(小)u2$の数値と一緒に表示できる。 !単位との整合性は、目盛り(中)r1,目盛り(大)r2の比率で調整する EXTERNAL PICTURE hMeasure(x,y,c,min,max,len,m,m1,m2,r1,r2,u1$,u2$,dir$) SET LINE COLOR c PLOT LINES:x,y;x+len-1,y !軸を描く LET delta = max - min !幅を算出する LET asp = len/ABS(delta) !比率を算出する call checkside(dir$,dd,dt) !表示方向を設定する SET TEXT COLOR c for i=min to max LET dx = asp*(i-min) if m2<>0 and MOD(i,m2)=0 then !大目盛りがある場合 PLOT LINES:x+dx,y; x+dx,y+30*dd !目盛りを描く if m2>0 then !数値がある場合 PLOT TEXT ,AT x+dx-10,y+30*dd+20*dt:STR$(i*r2)&u2$ end if else if m1<>0 and MOD(i,m1)=0 then !中目盛りがある場合 PLOT LINES:x+dx,y; x+dx,y+20*dd !目盛りを描く if m1>0 then !数値がある場合 PLOT TEXT ,AT x+dx-10,y+20*dd+20*dt:STR$(i*r1)&u1$ end if else if m>0 then !小目盛りがある場合 if MOD(i,m)=0 then PLOT LINES:x+dx,y; x+dx,y+10*dd !目盛りを描く end if end if end if end if next i END PICTURE EXTERNAL SUB checkside(dir$,dd,dt) LET dd = 1 LET dt = 0.2 if dir$="D" or dir$="d" then LET dd = -1 LET dt = -1 end if if dir$="L" or dir$="l" then LET dd = -1 LET dt = -1.5 end if END SUB |
├サンプル 山中和義 2004/03/15 21:11:58 ツリーへ
Re: 目盛りを描くプログラム |
返事を書く |
山中和義 2004/03/15 21:11:58 | |
サンプル !水のかさを計る SET WINDOW 0,640,0,480 !左下が原点。横がX、縦Y SET COLOR mode "NATIVE" !RGB指定 SET TEXT font "",12 !文字サイズ LET xx = 100 !容器の左下位置 LET yy = 50 LET ht = 350 !高さ LET wd = 400 !幅 LET vv = 1 !容器の容量 ※1g LET x2 = xx + wd !作業用変数を設定する LET y2 = yy + ht LET OLD_MY = yy + 50 DRAW rect(xx+1,yy+1,x2-1,OLD_MY,colorindex(0,1,1),2) !水かさを描く DRAW bottle(xx,yy,colorindex(0,0,0),ht,vv) !容器を描く LET ok = -1 DO WHILE ok<0 MOUSE POLL MX,MY,MLB,MRB !マウスの状態をスキャンする if MLB=1 then !左ボタンが押されていれば do SET DRAW MODE HIDDEN DRAW rect(xx+1,yy+1,x2-1,OLD_MY,colorindex(1,1,1),2) !前の水かさを描く if MY<=yy then LET MY = yy+1 !最小値を設定する if MY>y2 then LET MY = y2 !最大値を設定する DRAW rect(xx+1,yy+1,x2-1,MY,colorindex(0,1,1),2) !新しい水かさを描く DRAW bottle(xx,yy,colorindex(0,0,0),ht,vv) !容器を描く SET DRAW MODE EXPLICIT LET OLD_MY = MY MOUSE POLL MX,MY,MLB,MRB !マウスの状態をスキャンする loop while MLB=1 !押され続ければ end if if MRB=1 then LET ok=0 !右ボタンが押されたら、プログラムを終了する loop STOP !容器、目盛りを描く PICTURE bottle(x,y,c,ht,v) SET LINE COLOR colorindex(0,0,0) for i=0 to 3 PLOT LINES:xx-i,y2;xx-i,yy-i;x2+i,yy-i;x2+i,y2 !容器を描く next i DRAW vMeasure2(x,y,c,ht-50, 5,2,v, 1,0.1,"dl","g", "") !目盛りを描く END PICTURE END |
│└続き 山中和義 2004/03/15 21:12:33 ツリーへ
Re: サンプル |
返事を書く |
山中和義 2004/03/15 21:12:33 | |
続き !汎用ルーチン ver 0.1 by K.Yamanaka !●垂直に等分目盛りを描く !位置(x,y)に色cの目盛りを幅lenの線分で表す。 !目盛りはm3等分(大)、m2等分(中)、m1等分(小)して刻み、方向dir$に表示する。 !単位は目盛り(中)u1$、目盛り(大)u2$の数値と一緒に表示できる。 !数値と単位との整合性は、目盛り(中)r1,目盛り(大)r2の比率で調整する。 EXTERNAL PICTURE vMeasure2(x,y,c,len,m1,m2,m3,r1,r2,u1$,u2$,dir$) SET LINE COLOR c PLOT LINES:x,y;x,y+len-1 !軸を描く LET mm = 1 if m1<>0 then LET mm = mm * ABS(m1) if m2<>0 then LET mm = mm * ABS(m2) if m3<>0 then LET mm = mm * ABS(m3) LET asp = len/mm !比率を算出する call checkside(dir$,dd,dt) !表示方向を設定する SET TEXT COLOR c for i=0 to mm LET dy = asp*i if m3<>0 and MOD(i,m2*m1)=0 then !大目盛りがある場合 PLOT LINES:x,y+dy; x+30*dd,y+dy !目盛りを描く if m3>0 then !数値がある場合 PLOT TEXT ,AT x+30*dd+30*dt,y+dy:STR$(i*r2)&u2$ end if else if m2<>0 and MOD(i,m1)=0 then !中目盛りがある場合 PLOT LINES:x,y+dy; x+20*dd,y+dy !目盛りを描く if m2>0 then !数値がある場合 PLOT TEXT ,AT x+20*dd+30*dt,y+dy:STR$(i*r1)&u1$ end if else if m1>0 then !小目盛りがある場合 PLOT LINES:x,y+dy; x+10*dd,y+dy !目盛りを描く end if end if end if next i END PICTURE EXTERNAL SUB checkside(dir$,dd,dt) LET dd = 1 LET dt = 0.2 if dir$="L" or dir$="l" then LET dd = -1 LET dt = -1.5 end if END SUB !下位描画ルーチン !矩形(長方形)を描画する★ EXTERNAL PICTURE rect(x1,y1,x2,y2, col, dtype) SET LINE COLOR col SET AREA COLOR col select case dtype case 1 !枠のみ PLOT LINES:x1,y1; x1,y2; x2,y2; x2,y1; x1,y1 case 2 !塗潰し(枠なし) PLOT AREA:x1,y1; x1,y2; x2,y2; x2,y1 case ELSE !枠(黒)と塗潰し SET LINE COLOR colorindex(0,0,0) PLOT AREA:x1,y1; x1,y2; x2,y2; x2,y1 PLOT LINES:x1,y1; x1,y2; x2,y2; x2,y1; x1,y1 end select END PICTURE |
├今夜は忙しいので もりの 2004/03/16 00:06:32 ツリーへ
Re: 目盛りを描くプログラム |
返事を書く |
もりの 2004/03/16 00:06:32 | |
今夜は忙しいので 明日使ってみましょう 使いやすいのかな?? |
├サンプルその2 山中和義 2004/03/16 15:38:28 ツリーへ
Re: 目盛りを描くプログラム |
返事を書く |
山中和義 2004/03/16 15:38:28 | |
サンプル その2 垂直の数値目盛りがなかったので、追加しておきます。 切り取って、お使いください。 使用例も作ってみました。(笑) !縦棒グラフを描く SET WINDOW 0,640,0,480 !左下が原点。横がX、縦Y SET COLOR mode "NATIVE" !RGB指定 SET TEXT font "",12 !文字サイズ !---------- ↓↓↓↓↓ ---------- dim iv(100),iname$(10),ic(10) LET title$ = "期末試験:数学" !タイトル名 LET NUM_ITEM = 4 !項目数 10 data 100,75,55,80,35, 45,60,70,87,60 !各項目の値 restore 10 for i=1 to NUM_ITEM read iv(i) next i 20 data "項目1","項目2","項目3","項目4","項目5" !各項目の名称 data "項目6","項目7","項目8","項目9","項目10" restore 20 for i=1 to NUM_ITEM read iname$(i) next i LET ic(1) = colorindex(0,0,1) !各項目のグラフの色 LET ic(2) = colorindex(0,0,1) LET ic(3) = colorindex(0,0,1) LET ic(4) = colorindex(0,0,1) LET ic(5) = colorindex(0,0,1) LET ic(6) = colorindex(0,0,1) LET ic(7) = colorindex(0,0,1) LET ic(8) = colorindex(0,0,1) LET ic(9) = colorindex(0,0,1) LET ic(10) = colorindex(0,0,1) LET vc = colorindex(1,1,0) !数値の色 LET itc = colorindex(1,0,0) !項目の色 LET tc = colorindex(1,0,1) !タイトルの色 LET min = 30 !最小値 LET max = 100 !最大値 LET base = 60 !X/項目軸 ※基準軸 LET xx = 100 !グラフエリアの左下位置 LET yy = 50 LET ht = 350 !高さ LET wd = 520 !幅 !---------- ↑↑↑↑↑ ---------- call DisplayTEXT(xx+wd*0.3,yy+ht+40,tc,title$) !タイトルを表示する LET y1 = yy+(base-min)*ht/(max-min) PLOT LINES:xx,y1;xx+wd,y1 !横軸(基準軸)を描く DRAW vMeasure(xx,yy,mc,min,max,ht,0,-5,10,1,1,"","点", "L") !縦軸を描く LET xstp = wd / NUM_ITEM !項目数に合わせて、幅を調整する for i=0 to NUM_ITEM-1 !全項目について LET t = iv(i+1) - base !差、向きを算出する LET ytmp = t * ht/(max - min) !棒の頭を算出する LET xtmp = xx + i*xstp !棒の根の位置を算出する DRAW rect(xtmp+xstp*0.2,y1,xtmp+xstp*0.8,y1+ytmp,ic(i+1),2) !棒グラフを描く if t<0 then !項目名は、方向を考慮して表示する call DisplayTEXT(xtmp+xstp*0.2,y1+ytmp-25,itc,iname$(i+1)) !下側 call DisplayTEXT(xtmp+xstp*0.4,y1+ytmp+3,vc,str$(iv(i+1))) else call DisplayTEXT(xtmp+xstp*0.2,y1+ytmp+10,itc,iname$(i+1)) !上側 call DisplayTEXT(xtmp+xstp*0.4,y1+ytmp-20,vc,str$(iv(i+1))) end if next i END |
│├続き 山中和義 2004/03/16 15:39:23 ツリーへ
Re: サンプルその2 |
返事を書く |
山中和義 2004/03/16 15:39:23 | |
続き !汎用ルーチン ver 0.1 by K.Yamanaka !●垂直に目盛りを描く !位置(x,y)に色cの目盛りを最小値min、最大値maxの範囲で、幅lenの線分で表す。 !目盛り(小)m、目盛り(中)m1、目盛り(大)m2を表示方向dir$に表示する。 !単位は目盛り(中)u1$、目盛り(小)u2$の数値と一緒に表示できる。 !単位との整合性は、目盛り(中)r1,目盛り(大)r2の比率で調整する EXTERNAL PICTURE vMeasure(x,y,c,min,max,len,m,m1,m2,r1,r2,u1$,u2$,dir$) SET LINE COLOR c PLOT LINES:x,y;x,y+len-1 !軸を描く LET delta = max - min !幅を算出する LET asp = len/ABS(delta) !比率を算出する call checkside(dir$,dd,dt) !表示方向を設定する SET TEXT COLOR c for i=min to max LET dy = asp*(i-min) if m2<>0 and MOD(i,m2)=0 then !大目盛りがある場合 PLOT LINES:x,y+dy; x+30*dd,y+dy !目盛りを描く if m2>0 then !数値がある場合 PLOT TEXT ,AT x+30*dd+30*dt,y+dy:STR$(i*r2)&u2$ end if else if m1<>0 and MOD(i,m1)=0 then !中目盛りがある場合 PLOT LINES:x,y+dy; x+20*dd,y+dy !目盛りを描く if m1>0 then !数値がある場合 PLOT TEXT ,AT x+20*dd+30*dt,y+dy:STR$(i*r1)&u1$ end if else if m>0 then !小目盛りがある場合 if MOD(i,m)=0 then PLOT LINES:x,y+dy; x+10*dd,y+dy !目盛りを描く end if end if end if end if next i END PICTURE EXTERNAL SUB checkside(dir$,dd,dt) LET dd = 1 LET dt = 0.2 if dir$="L" or dir$="l" then LET dd = -1 LET dt = -1.5 end if END SUB !下位描画ルーチン !矩形(長方形)を描画する★ EXTERNAL PICTURE rect(x1,y1,x2,y2, col, dtype) SET LINE COLOR col SET AREA COLOR col select case dtype case 1 !枠のみ PLOT LINES:x1,y1; x1,y2; x2,y2; x2,y1; x1,y1 case 2 !塗潰し(枠なし) PLOT AREA:x1,y1; x1,y2; x2,y2; x2,y1 case ELSE !枠(黒)と塗潰し SET LINE COLOR colorindex(0,0,0) PLOT AREA:x1,y1; x1,y2; x2,y2; x2,y1 PLOT LINES:x1,y1; x1,y2; x2,y2; x2,y1; x1,y1 end select END PICTURE !指定の位置に文字を表示する★ EXTERNAL SUB DisplayTEXT(x,y, c, s$) SET TEXT COLOR c PLOT TEXT, AT x,y: s$ END SUB |
│├EXTERNALPICTURE もりの 2004/03/16 20:41:17 ツリーへ
Re: サンプルその2 |
返事を書く |
もりの 2004/03/16 20:41:17 | |
EXTERNAL PICTURE でひっかかってしまいます 今はNECのマシンでやって いるのですが プログラム直せますか? |
││└ちゃんと動作していますよ! 山中和義 2004/03/17 09:19:29 ツリーへ
Re: EXTERNALPICTURE |
返事を書く |
山中和義 2004/03/17 09:19:29 | |
ちゃんと動作していますよ! BASICは5.1.9版で、パソコンはNECを使っています。 掲示板のプログラムを切り貼りして、動作しています。 特に、修正する必要もないですが、、、 |
││ └やっぱり もりの 2004/03/18 19:26:31 ツリーへ
Re: ちゃんと動作していますよ! |
返事を書く |
もりの 2004/03/18 19:26:31 | |
やっぱり 動きませんね いま マンガ喫茶でやって みましたが やはり うごきません? win 98では うごかないの? xpでないと動かないのでは |
││ └エラーにならない命令を模索して 山中和義 2004/03/19 10:36:10 ツリーへ
Re: やっぱり |
返事を書く |
山中和義 2004/03/19 10:36:10 | |
エラーにならない命令を模索して 記述してみましたが、そちらの愛機ではどうだか? 今までのエラー報告では、状況が把握できません。 エラーメッセージとか自分の環境を詳細に報告することが すべてを解決する、最良の道かと思います。 当方は、 NECのLavieC(PC-98NX(DOS/V系))、OSはWindowsME、BASICは5.1.9 ヘルプのバージョン情報は RICHED32.DLL 5.0.1462.7 RICHED20.DLL 5.30.23.1203 では、動作を確認しています。 NECは、PC-9800と上記の2種類があるためBASIC本体の組み込みには注意が必要です。 http://www.urban.ne.jp/home/kz4ymnk/seminar/basic/memori.txt http://www.urban.ne.jp/home/kz4ymnk/seminar/basic/mizukasa.txt http://www.urban.ne.jp/home/kz4ymnk/seminar/basic/vbargrph.txt http://www.urban.ne.jp/home/kz4ymnk/seminar/basic/vbargrph2.txt インターネットエクスプローラで、日本語が文字化けする場合があります。 そのときは、「表示」メニューの「エンコード」-「日本語(シフトJIS)」を 選択して再表示してください。 |
│└いくつかのバリエーションです。 山中和義 2004/03/17 09:36:11 ツリーへ
Re: サンプルその2 |
返事を書く |
山中和義 2004/03/17 09:36:11 | |
いくつかのバリエーションです。 グラフの形を決定している定数を変えることによって、 グラフを変形させることが可能です。 ●通常の場合 LET min = 0 !最小値 LET max = 100 !最大値 LET base = 0 !X/項目軸 ※基準軸 ●欠点、平均点を基準した場合 LET min = 30 !最小値 LET max = 100 !最大値 LET base = 60 !X/項目軸 ※基準軸 ※基準に満たない棒ic()を色分けすると目立ちます。 ●着目範囲のみ場合(棒の頭を表示し、棒の足は短くなる) LET min = 50 !最小値 LET max = 100 !最大値 LET base = 45 !X/項目軸 ※基準軸 ※位置xx,yy、高さhtも調整するとよい。 現状、目盛りの範囲は設定しないといけません。 最大値max、最小値minを値をもとに算出させると できますので、挑戦してみてください。 |
└数学の項目別棒グラフについて もりの 2004/03/20 22:41:41 ツリーへ
Re: 目盛りを描くプログラム |
返事を書く |
もりの 2004/03/20 22:41:41 | |
数学の項目別棒グラフについて 動きました 上記以外のものは動きません 改良点としては 項目数 単位 棒の色などを画面上で訂正や修正 できないとダメですね小学生や地域の 人たちが気軽に遊べないと 改良してみてください |