描画の位置補正

 投稿者:N.E.  投稿日:2010年 4月12日(月)17時47分15秒
  SET BITMAP SIZE a,b
SET WINDOW 1,a,b,1
となる座標(左上を1とする一画素当たりの座標が1)を定義し、
POINT STYLEが1の場合、
PLOT POINTで小数で表せる座標を指定したとき、
どのように処理をすれば、画面と同じ結果になるのでしょうか。
(計算で求めた座標と、画面の座標を同じ結果にする方法)

教えて下さい。
お願いします。
 

Re: 描画の位置補正

 投稿者:山中和義  投稿日:2010年 4月12日(月)19時33分14秒
  > No.1177[元記事へ]

N.E.さんへのお返事です。

> どのように処理をすれば、画面と同じ結果になるのでしょうか。
> (計算で求めた座標と、画面の座標を同じ結果にする方法)

SET POINTS: 12.3, 45.6
とすれば、BASIC側で最寄の位置(12,46)(だと思います)に点を打ちます。

SET POINTS: INT(12.3), INT(45.6)
とすれば、(12,45)に点を打ちます。

、、、が、
小数指定したとしても「指定した座標」と「表示した座標」との間には誤差があります。

描画ソフト、特にCADでは
操作は画面をクリックして、(描画した図形から)座標を読み込んでいるように見えますが、
(マウス座標値は精度も悪いので)近傍値として取得して、
内部の図形データ(浮動小数点数)から該当する座標を探すことになります。

「指定した座標」は「理論値」、「表示した座標」は「近似値」として扱う仕組みが必要になります。
 

Re: 描画の位置補正

 投稿者:N.E.  投稿日:2010年 4月12日(月)20時30分35秒
  > No.1178[元記事へ]

山中和義さんへのお返事です。

> SET POINTS: 12.3, 45.6
> とすれば、BASIC側で最寄の位置(12,46)(だと思います)に点を打ちます。
>
> SET POINTS: INT(12.3), INT(45.6)
> とすれば、(12,45)に点を打ちます。
>
> 、、、が、
> 小数指定したとしても「指定した座標」と「表示した座標」との間には誤差があります。
> 「指定した座標」は「理論値」、「表示した座標」は「近似値」として扱う仕組みが必要になります。

MAT PLOTを使えないでしょうか。

扇形を描こうとしているのですが、多角形として描くために、一点一点座標を求めています。
何かいい方法はないでしょうか。
ちなみに、1画素0.1での場合、四捨五入より約0.000000000000000005875ずれました。
 

Re: 描画の位置補正

 投稿者:山中和義  投稿日:2010年 4月12日(月)20時58分16秒
  > No.1179[元記事へ]

N.E.さんへのお返事です。

> MAT PLOTを使えないでしょうか。

配列変数の中身を整数化などすればいいのでは?

> 扇形を描こうとしているのですが、多角形として描くために、一点一点座標を求めています。

曲線描画は、格子状の点列に割り付けるので(ビットマップ方式の描画)、細かい折れ線描画です。
滑らかに見えるかは、解像度が関係していますので、たとえば小さい円を描くと歪みます。
(複数の「指定した点」が同一の「表示した点」になる)

> 何かいい方法はないでしょうか。

多角形以外ということでしょうか? 上記説明より他の手法はないです。

> ちなみに、1画素0.1での場合、四捨五入より約0.000000000000000005875ずれました。

何が何に対してなのか抽象過ぎて回答できません。
 

Re: 描画の位置補正

 投稿者:N.E.  投稿日:2010年 4月12日(月)21時23分22秒
  > No.1180[元記事へ]

山中和義さんへのお返事です。

> > MAT PLOTを使えないでしょうか。
>
> 配列変数の中身を整数化などすればいいのでは?

方法を教えて下さい。

> > 何かいい方法はないでしょうか。
>
> 多角形以外ということでしょうか? 上記説明より他の手法はないです。

簡単でわかりやすいなら多角形でもいいです。

> > ちなみに、1画素0.1での場合、四捨五入より約0.000000000000000005875ずれました。
描かれる位置のずれです。
例)0.04999999999999999999999…なら、0.04の位置に、
  0.045なら、0.05の位置に描かれるはずなのに、約0.000000000000000005875ずれ、
  0.04999999999999999994125で0.04に、
   0.04999999999999999994126で0.05になってしまうということです。
 

Re: 描画の位置補正

 投稿者:山中和義  投稿日:2010年 4月12日(月)21時44分49秒
  > No.1181[元記事へ]

N.E.さんへのお返事です。

> 例)0.04999999999999999999999…なら、0.04の位置に、
>   0.045なら、0.05の位置に描かれるはずなのに、約0.000000000000000005875ずれ、
>   0.04999999999999999994125で0.04に、
>    0.04999999999999999994126で0.05になってしまうということです。

連続する数値計算は、誤差が膨らみます。
通常16桁程度で計算していくので、結果の有効桁は10桁程度と思って
最終的な補正を行う必要があります。
たとえば、上記数値の最後4126は誤差として処理するということです。
 

Re: 描画の位置補正

 投稿者:山中和義  投稿日:2010年 4月13日(火)09時50分44秒
  > No.1179[元記事へ]

N.E.さんへのお返事です。

> 扇形を描こうとしているのですが、多角形として描くために、一点一点座標を求めています。

ちなみに私ならこう記述します。(2つの例)
!最近のグラフィックス・ライブラリ系の機能(特にワールド座標変換)がない場合
!自分でその機能を実現します。

LET p=1 !丸めする小数桁位置
LET zm=1/10^p !倍率

LET a=550 !描画領域
LET b=400
SET bitmap SIZE a,b
SET WINDOW 0,(a-1)*zm,0,(b-1)*zm !※左下が原点

CALL fan(100,50,20,60,300) !小さい
CALL fan(200,150,200,-150,120) !中ぐらい
CALL fan(250,100,350,30,330) !大きい

SUB fan(X,Y,R,SA,EA) !中心(X,Y)、半径Rの扇形を描く ※0≦R、-360≦SA≦EA≦360
   LET cx=ROUND(X*zm, p) !中心点と開始点を結ぶ
   LET cy=ROUND(Y*zm, p)
   PLOT LINES: cx,cy;
   FOR i=SA TO EA STEP 0.5
      LET th=RAD(i) !ラジアンへ
      LET xx=ROUND((R*COS(th)+X)*zm, p) !問題座標へ
      LET yy=ROUND((R*SIN(th)+Y)*zm, p)
      PLOT LINES: xx,yy; !多角形近似
      PRINT i;xx;yy !debug
   NEXT i
   PLOT LINES: cx,cy !終了点と中心点を結ぶ
END SUB



!FULL BASICのグラフィックス・ライブラリ系の機能を使って記述すると

SET LINE COLOR 4 !上書きを確認する

DRAW arc(100,50,20,60,300) WITH SCALE(zm) !小さい
DRAW arc(200,150,200,-150,120) WITH SCALE(zm) !中ぐらい
DRAW arc(250,100,350,30,330) WITH SCALE(zm) !大きい

PICTURE arc(X,Y,R,SA,EA) !中心(X,Y)、半径Rの扇形を描く ※0≦R、-360≦SA≦EA≦360
   DRAW arc0(SA,EA) WITH SCALE(R)*SHIFT(X,Y)
END PICTURE
PICTURE arc0(SA,EA) !原点を中心とした半径1の扇形を描く ※-360≦SA≦EA≦360
   PLOT LINES: 0,0; !中心点と開始点を結ぶ
   FOR i=SA TO EA STEP 0.5
      LET th=RAD(i) !ラジアンへ
      LET x=COS(th) !問題座標へ
      LET y=SIN(th)
      PLOT LINES: x,y; !多角形近似
      !!!PRINT i;x;y !debug
   NEXT i
   PLOT LINES: 0,0 !終了点と中心点を結ぶ
END PICTURE

END
 

戻る