新しく発言する EXIT インデックスへ
目盛りを描くプログラム

  目盛りを描くプログラム 山中和義 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
数学の項目別棒グラフについて
動きました
上記以外のものは動きません

改良点としては

項目数
単位

棒の色などを画面上で訂正や修正
できないとダメですね小学生や地域の
人たちが気軽に遊べないと
改良してみてください








インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。