座標軸描画のバグ

 投稿者:荒田浩二  投稿日:2009年 6月 5日(金)18時49分43秒
  軸・格子を描く組込みの絵定義に、いくつかの不具合を発見したので報告します。

(1) GRID(p,q),AXES(p,q),GRID0(p,q),AXES0(p,q)で一方の引数を0にすると横軸縦軸ともに目盛りが描かれない。

(2) GRID(p,q),AXES(p,q)で特定の数値を設定すると右端,上端の数字が描かれない。
10 LET a=23  ! a=41,46,51,82,87,92,97,…
20 LET b=1   ! b=2,4,8,11,13,16,21,22,26,27,…
30 SET WINDOW -a,a,-b,b
40 DRAW GRID(a/5,b/10)
50 END

(3) GRID(p,q),AXES(p,q)でy座標の領域の幅をごく小さく設定すると、描かれないはずのx軸の数字が上端に描画されることがある。
10 LET c=.0000001
20 SET WINDOW -5,5,7-c,7
30 DRAW GRID(1,c/10)
40 END
 

Re: 座標軸描画のバグ

 投稿者:白石 和夫  投稿日:2009年 6月 6日(土)18時07分17秒
  > No.405[元記事へ]

ご報告ありがとうございました。
文字列の一部が境界にかかると文字列全体を描かないのはWindows APIの仕様だと思います。
座標値の扱いが変なのは,以前に報告のあったPLOT LINES文の不具合と同種のものです。
こちらはPLOT TEXT文にもかかわる不具合なので対策を考えます。
 

Re: 座標軸描画のバグ

 投稿者:荒田浩二  投稿日:2009年 6月 7日(日)21時49分10秒
  > No.406[元記事へ]

よろしくお願いいたします。
 

Re: 座標軸描画のバグ

 投稿者:山中和義  投稿日:2009年 6月15日(月)10時49分32秒
  > No.406[元記事へ]

ユーザー絵定義を使った場合は、(2),(3)は正常に表示するようだ。
10 LET c=.0000001
20 SET WINDOW -5,5,7-c,7
30 DRAW GRID2(1,c/10) ! <-----
40 END
50 MERGE "grid2.lib" ! <----- ※EXTERNAL PICTURE 文による直接の記述もOK


また、DRAW circle、DRAW disk についても同じ現象が発生する。
SET WINDOW -500,500,-500,500

LET phi=(1+SQR(5))/2 !黄金比
LET a=2*PI*phi !黄金角

LET r=1
LET th=0
FOR i=0 TO 900
   LET r=1.1*r !らせん状
   LET th=th+a
   LET x1=r*COS(th)
   LET y1=r*SIN(th)
   !DRAW disk WITH SCALE(r*0.3)*SHIFT(x1,y1)
   DRAW circle WITH SCALE(r*0.3)*SHIFT(x1,y1)
NEXT i

END

MERGE "circle.lib"


WindowsMeとXPでは、障害内容が違う。
 Meの場合、OSのDIBENG.DLLでエラーとなりBASICが強制終了となる。
 XPの場合、描画しない、黒ベタになる。
 

Re: 座標軸描画のバグ

 投稿者:白石 和夫  投稿日:2009年 6月22日(月)17時18分41秒
  > No.405[元記事へ]

> (1) GRID(p,q),AXES(p,q),GRID0(p,q),AXES0(p,q)で一方の引数を0にすると横軸縦軸ともに目盛りが描かれない。
 仕様です。
 本来であれば続行可能例外とすべきところですが,無条件に無視して先に進みます。


> (2) GRID(p,q),AXES(p,q)で特定の数値を設定すると右端,上端の数字が描かれない。
> 10 LET a=23  ! a=41,46,51,82,87,92,97,…
> 20 LET b=1   ! b=2,4,8,11,13,16,21,22,26,27,…
> 30 SET WINDOW -a,a,-b,b
> 40 DRAW GRID(a/5,b/10)
> 50 END
 数字だけの問題でなく,格子自体の描画が欠落していました。

> (3) GRID(p,q),AXES(p,q)でy座標の領域の幅をごく小さく設定すると、描かれないはずのx軸の数字が上端に描画されることがある。
> 10 LET c=.0000001
> 20 SET WINDOW -5,5,7-c,7
> 30 DRAW GRID(1,c/10)
> 40 END
 Windowsの座標系に縮小するアルゴリズムがWindowsの実際の動作に適合しないのが原因のようです。
 

Re: 座標軸描画のバグ

 投稿者:白石 和夫  投稿日:2009年 6月22日(月)18時25分16秒
  > No.412[元記事へ]

> SET WINDOW -500,500,-500,500
> LET phi=(1+SQR(5))/2 !黄金比
> LET a=2*PI*phi !黄金角
> LET r=1
> LET th=0
> FOR i=0 TO 900
>    LET r=1.1*r !らせん状
>    LET th=th+a
>    LET x1=r*COS(th)
>    LET y1=r*SIN(th)
>    !DRAW disk WITH SCALE(r*0.3)*SHIFT(x1,y1)
>    DRAW circle WITH SCALE(r*0.3)*SHIFT(x1,y1)
> NEXT i
> END
>  Meの場合、OSのDIBENG.DLLでエラーとなりBASICが強制終了となる。

Win Meの場合,Windowsの座標系に許される範囲外の座標値を指定すると
DIBENG.DLLでエラーになるようです。
とりあえず,GDI座標系の範囲外の数値が渡らないようにしてみます。
 

Re: 座標軸描画のバグ

 投稿者:荒田浩二  投稿日:2009年 6月24日(水)22時14分51秒
  > No.417[元記事へ]

対処していただきありがとうございます。

>> (1) GRID(p,q),AXES(p,q),GRID0(p,q),AXES0(p,q)で一方の引数を0にすると横軸縦軸ともに目盛りが描かれない。
> 仕様です。
> 本来であれば続行可能例外とすべきところですが,無条件に無視して先に進みます。

y=tan(x)のグラフ描画で DRAW GRID(PI/2,0) という座標軸がほしかったので無理なお願いをしました。
独自の対策として、座標設定より大きな数値を引数に取れば目盛りは描画されないので DRAW GRID(PI/2,100) とし目的を達しました。
一般的には次の絵定義grid2で描画可能です。

SET WINDOW -5,5,-5,5
DRAW grid2(0,1)
END
EXTERNAL PICTURE grid2(p,q)
ASK WINDOW x1,x2,y1,y2
IF p<>0 THEN LET a=p ELSE LET a=2*(ABS(x1)+ABS(x2))
IF q<>0 THEN LET b=q ELSE LET b=2*(ABS(y1)+ABS(y2))
DRAW GRID(a,b)
END PICTURE
 

戻る