JP3552823B2 - 直線描画装置 - Google Patents

直線描画装置 Download PDF

Info

Publication number
JP3552823B2
JP3552823B2 JP34472595A JP34472595A JP3552823B2 JP 3552823 B2 JP3552823 B2 JP 3552823B2 JP 34472595 A JP34472595 A JP 34472595A JP 34472595 A JP34472595 A JP 34472595A JP 3552823 B2 JP3552823 B2 JP 3552823B2
Authority
JP
Japan
Prior art keywords
sequence
quotient
address
control sequence
straight line
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP34472595A
Other languages
English (en)
Other versions
JPH09161082A (ja
Inventor
桂 川上
洋 浦中
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Corp
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
Matsushita Electric Industrial Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Priority to JP34472595A priority Critical patent/JP3552823B2/ja
Publication of JPH09161082A publication Critical patent/JPH09161082A/ja
Application granted granted Critical
Publication of JP3552823B2 publication Critical patent/JP3552823B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Landscapes

  • Image Generation (AREA)

Description

【0001】
【発明の属する技術分野】
本発明は、紙の上に直線を描画するX−Yプロッタや、表示装置の画面に直線を表示する装置、記憶装置の内部に直線を描く作業をする計算装置などに利用することができる直線描画装置に関し、特に、高速な直線描画を可能にするものである。
【0002】
【従来の技術】
格子状に配置された記憶素子に直線を描画する場合、図2のように、データを書き込むべき格子点として、描画すべき直線に最も近いものが選ばれる。しかし、水平に並ぶ描画点の数は、一般に一定ではない。図2は、直線Lの傾きが3/8の例であるが、描画点が水平に3個と2個並ぶ場合が出現する。
【0003】
従来、このような点、即ち、垂直格子線上で直線に最も近い点を算出する方法としてDDA(Digital Differencial Analysis)及びBresenhamのアルゴリズムがよく知られている。後者は前者における積算誤差を取り除く方式である。これらについての説明は、例えばW.M.Newman & R.F.Spraull著“Principle of Interactive Computer Graphics” PP25−27,1981に詳しく述べられている。
【0004】
これらの方式は描画点のX座標とY座標とを逐次的に算出するものである。そのアルゴリズムをプログラムの形にした一例を図3に示す。図3では従来一般的に利用されているDDAに従って描画点の座標X,Yを計算する。図中のplot(X,Y)は座標(X,Y)に一点を描画する関数であり、描画する直線の傾きはM/Mであるものとする。これから分かるように、描画点1個につき2回の加算(第4行、第5行)と1回の判定(第6行)、更に数点につき1回の減算(第8行)が必要である。
【0005】
図3のアルゴリズムを図4を用いて更に詳しく説明する。図4は図2の中の一つの描画点の付近を拡大した図である。点Tは真の点、即ち、直線Lと垂直格子線との交点である。描画点Pは真の点Tに最も近い格子点である。従って点TからPまでのY座標の差をRとすると、
−1/2≦R<1/2 (1−1)
である。但し、説明の簡単のため、格子間隔は縦、横とも1とする。Tn+1とTとのY座標の差はM/Mであるから
n+1=R+M/M, (R+M/M<1/2のとき) (1−2)
n+1=R+M/M−1,(R+M/M≧1/2のとき) (1−3)
という関係が成立する。以上の事実に基づき、描画点のX,Y座標を計算する手法の一つが図3に掲げたDDAのアルゴリズムである。
【0006】
図3の第1行は、変数Rの初期値を設定するものである。第2行と第10行は対になっており、iを1から1ずつ増加させながら第3行から第9行までをM回繰り返すことを意味している。第3行は、点P、即ち座標(X,Y)に点を描画すること、即ちデータを書き込むことを意味する。第4行は、次の描画点のX座標を計算する、即ちX座標を1だけ増加することを意味する。つまり、第3行で描画した点の次の点、即ちPi+1のX座標が求められる。第5行は残差RをM/Mだけ増加することを意味する。格子間隔は1と仮定しているのでXが1だけ増加するとY座標はM/Mだけ増加する。Rは直線Lと格子線との交わる真の点のY座標の少数部分である。従って、第6行で残差が1/2より大きくなったか否かを調べ、もし1/2より大きければ、第7行で座標を1だけ増加し、第8行で残差から1を減ずる。
【0007】
実際にはこれを改良したBresenhamのアルゴリズムが多く利用されている。図3のプログラムを実際の計算機で実行する場合には図3の第5行で加算されるM/Mは有限の長さのレジスタに保持される。従ってこの値には丸め誤差が入り込む場合がある。Bresenhamのアルゴリズムは、この誤差が発生しないようにしたものである。
【0008】
【発明が解決しようとする課題】
図3のようなアルゴリズムで直線を描画する場合、座標計算には以下の4つの操作が必要であった。即ち、
(1)一描画点当りX座標計算のための加算1回
(2)一描画点当りY座標計算のための加算1回
(3)一描画点当りY座標の残差の大きさの判定1回
(4)数個の描画点につき1回の減算
が必要であった。従って、描画すべき点の数の2倍の加算操作、描画点と同数の判定操作、及び描画点数よりは少ないが描画点数に比例した回数の減算操作が必要であった。そのため、計算に多くの時間を要し、描画作業の高速化には限界があった。
【0009】
本発明は、こうした従来の問題点を解決するものであり、高速で直線を描画することができる直線描画装置を提供することを目的としている。
【0010】
【課題を解決するための手段】
そこで、本発明の直線描画装置では、直線の傾きを整数比M/Mで表現した場合に、MとMとをそれぞれ保持する第1及び第2の整数保持手段と、MとMとから商数列(即ち、MをMで除算したときの商がQ、余りがMであるとき、次にMをMで除算して、その商Qと、余りMとを求め、これを順次繰り返して得られるQ,Q,Q,‥の数列)を計算する商数列計算手段と、この商数列から、隣接する描画点間の格子点上の差異を表す制御数列(即ち、右隣の描画点のY座標と1だけずれている場合に“1”、ずれが無い場合に“0”と表した数列)を計算する制御数列計算手段と、この制御数列から描画点の座標を計算する座標計算手段とを設けている。図2の下部に制御数列の例を示す。
【0011】
この装置では、この制御数列を簡単に求めることによって、従来に比べて少ない操作で描画点の座標を求めることができ、高速での直線描画が可能となる。
【0012】
【発明の実施の形態】
本発明の請求項1に記載の発明は、格子点上に直線の近似点を描画する直線描画装置において、直線の傾きを定める第1及び第2の整数をそれぞれ保持する第1及び第2の整数保持手段と、第1及び第2の整数保持手段に保持された2つの整数による除算で商と余りとを求め、次に、先行する除算の除数を被除数とし、余りを除数とする除算を繰り返して各除算の商から成る商数列を計算する商数列計算手段と、この商数列から、隣接する描画点間の格子点上の差異を表す制御数列を計算する制御数列計算手段と、この制御数列から描画点の座標を計算する座標計算手段とを設け、前記商数列計算手段は、前記商数列を求める際、除算の結果の余りが生じた場合、除算の余りが0になるまで計算を繰り返すようにしたものであり、商数列の計算、制御数列の計算、及び、制御数列を基に1描画点当たり2回の加算、によって描画点の座標を求めることができる。
【0013】
請求項2に記載の発明は、前記商数列計算手段が、被除数を保持する被除数保持手段と、除数を保持する除数保持手段と、被除数保持手段に保持された被除数を除数保持手段に保持された除数で除算する除算手段と、この除算における商を保持する商数列保持手段と、この除算における余りを保持する余り保持手段と、余り保持手段の内容がゼロであることを検出するゼロ検出手段とを具備し、被除数保持手段及び除数保持手段が最初にそれぞれ第1の整数及び第2の整数を保持し、除算手段の除算が行なわれた後、除数保持手段の内容を被除数保持手段に転送し、余り保持手段の内容を除数手段に転送して、除算手段の次の除算を行ない、これを余り保持手段の内容がゼロとなるまで繰り返すようにしたものであり、これにより、制御数列の計算の基礎となる商数列を生成することができる。
【0014】
請求項3に記載の発明は、前記制御数列計算手段が、生成された制御数列を記憶する制御数列記憶手段と、制御数列記憶手段の第1のアドレスを保持する第1のポインタと、制御数列記憶手段の第2のアドレスを保持する第2のポインタと、商数列を記憶する商数列記憶手段とを具備し、制御数列記憶手段の0番地から第1のポインタの指示する番地までの内容を複製の単位として、商数列記憶手段から読出した商数列要素の値の回数だけ複製して、制御数列記憶手段の第2のポインタが指示する番地の次の番地から始まる領域に格納し、第2のポインタの保持するアドレスを格納後の最終番地に変更し、第1のポインタの保持するアドレスを、次の複製の単位となる番地に変更し、この動作を、商数列記憶手段に記憶された商数列要素について1回ずつ繰り返すようにしたものであり、これにより、商数列を用いて制御数列を生成することができる。
【0017】
以下、本発明の実施の形態について、図面を用いて説明する。
【0018】
本発明の直線描画方法は、新しく発明された数学的理論に基づいているので、次のような順で説明を行なう。即ち、
第1節 本発明の直線描画装置で使用される数学的概念の説明
第2節 本発明の直線描画装置の実施の形態とその動作説明
第3節 数学的証明
の3節に分けて説明する。
【0019】
第1節 本発明の直線描画装置で使用される数学的概念の説明
本発明の描画装置は、図2に示すように、直線を描画するための制御数列Cを簡単な操作で生成することによって、高速な描画を達成するものである。この制御数列は、一つの描画点の左に隣接する描画点が水平方向に存在するときに0、また、左に隣接する描画点が斜め方向に存在するときに1と表現した数列である。図4の直線Lの近似点PのX座標とY座標とは、制御数列Cから次のようにして算出することが出来る。即ち、
=Xn−1+1 (2−1)
=Yn−1+Cn−1 (2−2)
上記の式(2−1),(2−2)はCがゼロであればPはPn−1の右隣り、Cが1であればPはPn−1の右上となることを示している。
【0020】
式(2−1)と(2−2)から明らかなように、予め制御数列が知れていれば、一点を描画するのに2回の加算だけが必要で、判定は不要である。しかも、これらの加算は1または0を加えるという単純な整数演算である。この制御数列Cは、以下に述べる商数列から生成することができる。
【0021】
1.1 商数数列の定義
制御数列は、別の新たな数列(以下、商数列と呼ぶ)から生成することができる。商数列とは次のようにして求められる数列である。即ち直線Lの傾きをM/Mとする。但しM,Mは整数とする。このときまず、
=Q+M, M>M>0 (2−3)
を満足する整数Q、Mを求める。以下
n−1=Q+Mn+1, M>Mn+1>0 (2−4)
を満足する整数Q、Mを式(2−5)が成立するまで次々と求める。即ち
N−1=Q (2−5)
となるまで、言い換えれば
N+1=0 (2−6)
となるまで繰り返す。
【0022】
以上の計算は、Mn−1をMで割ったときの商と余りをそれぞれQとMn+1とするものである。以下、このようにして求めた数列Q,Q,・・・,Qを商数列Q、数列M,M,M,・・・,Mを除数列Mと呼ぶことにする。即ち、
Q={Q,Q,・・・Q} (2−7)
M={M,M,M,・・・M} (2−8)
である。
【0023】
なお、MN+1=0となるようなNは必ず存在する。即ち、M、Mから出発して(2−4)の除算を繰り返すと、最後には余りがゼロになる。なぜならば、Mは正の整数でありM>Mn+1であるから、nが増加するとともにMはMn−1に比べて小さくなる。従って、最後には次のどちらかの場合に到達する。即ち、
(ア) M=1となり、MN+1=0となる。
【0024】
(イ) MN+1≠1で且つ、MがMN+1で割り切れ、従ってMN+1=0となる。のどちらかである。従ってMN+1=0となるNが必ず存在する。MはMとMとの最大公約数であることは、ユークリッドのアルゴリズムから明らかである。
【0025】
1.2 制御数列の定義
1.1で定義した商数列Qから、図2の制御数列Cは次のようにして生成することができる。即ちまず、中間の長さの数列CとCとを以下のような漸化式で定義する。即ち、
={0} (2−9)
={1} (2−10)
={Cn−1&(Q−1)*Cn−1} (2−11)
={C&Cn−1} (2−12)
但し、記号&及び*は以下のような意味を持つものとする。即ち、有限の長さの数列α、βに対して
α&βは、数列αの右側に数列βを接続して出来る数列
γ*βは、数列βをγ個繰り返して出来る数列
を意味するものとする。
【0026】
このような数列Cから式(2−9)〜(2−12)によって制御数列Cを求めることができる。即ち、MN+1=0であるとき
C=M*C (2−13)
である。式(2−9)〜(2−13)が正しいことは「第3節 数学的証明」の項で後述する。
【0027】
第2節 本発明の直線描画装置の実施の形態とその動作説明
以上の説明から分かるように、制御数列Cnは、商数列、除数列を求める少数回の除算と、(2−9)〜(2−13)に従って1と0とのビット列をコピーする作業とによって求めることができ、本発明の直線描画装置は、こうして得た制御数列から描画点の座標を計算し、格子点上に直線の近似点を描画する。この具体的方法とそれを実施する装置とについて以下に述べる。但し、直線Lの傾きは整数比M/Mであるものとする。
【0028】
実施形態の直線描画装置は、図1に示すように、直線の傾きを表す2つの整数MとMとをそれぞれ保持するレジスタ101、102と、MとMとから商数列を計算する商数列計算装置103と、商数列から制御数列を生成する制御数列計算装置104と、制御数列から描画点の座標X、Yを計算する座標計算装置105との5つの部分から構成される。
【0029】
直線の傾きを表す2つの整数を保持するレジスタ101、102の必要な大きさは、直線の傾きの表現精度によって決まってくる。この実施形態では、直線の傾きを整数比M/Mで表現することとしているため、M及びMの大きさの数字を保持できればよい。例えば2000×2000の画素数を持つ表示装置に適用する場合では、これら2つのレジスタ101、102は12ビットあれば十分である。なぜならM及びMの最大値は2000であるからである。
【0030】
商数列計算装置103は、図5に示すように、被除数を記憶する被除数レジスタ501と、除数を記憶する除数レジスタ502と、被除数レジスタ501から読出した値を除数レジスタ502で読出した値で除算する除算器505と、除算器505で行なわれた除算の剰余を記憶する剰余レジスタ504と、剰余レジスタ504がゼロであるときにそれを検出して検出信号511を出力するゼロ検出装置506と、商数列を記憶する商数列記憶装置503と、商数列記憶装置503のアドレスを指示するアドレスポインタ507と、入力する二つの信号の一方を選択して出力するセレクタ508、509、516と、この商数列計算装置103の各部の動作を制御する商数列制御装置510とを備えている。
【0031】
この商数列計算装置103は、数値MとMとから、図8に示すフローチャートに従って商数列を計算し、商数列記憶装置503に格納する。
【0032】
まず、初期状態では、アドレスポインタ507はゼロを指定する。また、商数列制御装置510は、セレクタ508及び509の入力信号の選択を指示するセレクタ制御信号514としてゼロを設定し、それに応じて、セレクタ508及び509は両方とも左側の入力、即ち、MとMとをそれぞれ選択し通過させる。このことを前提に、商数列計算装置は次のように動作する。
【0033】
ステップ801:商数列制御装置510は、信号515によりアドレスポインタ507の内容をゼロに設定し、また、被除数レジスタ501及び除数レジスタ502に対してデータの格納を指示する制御信号512をONにする。それにより、数値MとMとが、それぞれ、セレクタ508及び509を経由して、被除数レジスタ501と除数レジスタ502とに格納される。
【0034】
ステップ802:被除数レジスタ501に格納された数値Mと除数レジスタ502に格納された数値Mとは除算器505に入力し、除算器505はM/Mを計算し、その商、即ちQを信号519によりセレクタ516に出力し、余りMを信号520により剰余レジスタ504に出力する。
この余りMの出力は剰余レジスタ504に格納される。ゼロ検出器506は、剰余レジスタ504に格納されたMの内容がゼロであるか否かを調べ、ゼロである場合には検出信号511をONに、ゼロでなければOFFにする。セレクタ516は、検出信号511がOFFのときは、除算器505から出力されたQ信号519を選択して商数列記憶装置503に出力する。一方、商数列制御装置510は、商数列記憶装置503に対してデータ格納を指示する制御信号513をONにする。それにより、商数列記憶装置503のアドレスポインタ507の指示するアドレスには、除算器505の商出力が格納される。
【0035】
ステップ803:ゼロ検出器506の出力する検出信号511がOFFのとき、つまり、剰余レジスタ504の内容がゼロでないときには、
ステップ804:商数列制御装置510は、アドレスポインタ507の内容を1だけ増やすことを指示する信号515を出力し、アドレスポインタ507は、アドレスを1だけ増加させる。
【0036】
ステップ805:商数列制御装置510は、セレクタ508と509とが両方とも右側の入力をそれぞれ選択するようにセレクタ制御信号514を1に設定し、また、制御信号512をONにする。その結果、除数レジスタ502の内容が被除数レジスタ501に転送され、また、剰余レジスタ504の内容が除数レジスタ502に転送される。
【0037】
この後、ステップ802に移り、剰余レジスタ504の内容がゼロになるまで、ステップ802、803、804、805の手順を繰り返す。
ステップ803において、剰余レジスタ504の内容がゼロになり、ゼロ検出器506の検出信号511がONになると、
ステップ806:セレクタ516は、左側の入力を選択する。これにより除数レジスタ502の内容が、セレクタ516を経て、商数列記憶装置503に格納され、動作を終了する。
【0038】
以上の動作により、商数列記憶装置503には、図9に示すように、商数列全部が格納され、その後に最後の除算に使用された除数が格納される。
【0039】
商数列から制御数列を生成する制御数列計算装置104は、図6に示すように、生成された制御数列を格納する制御数列記憶装置601と、制御数列記憶装置601のアドレスを指示するアドレスポインタ602、603と、商数列記憶装置503のアドレスを指示するポインタ604と、制御数列計算装置104の各部を制御して制御数列記憶装置601の中に制御数列を生成する制御数列制御装置605とを備えている。なお、商数列記憶装置503とそのアドレスを指示するアドレスポインタ507とは、図5の503及び507そのものであり、アドレスポインタ507は、商数列記憶装置503に格納されたデータの最後のアドレス位置をポイントしている。
【0040】
この制御数列計算装置104の動作を説明する前に、制御数列と商数列との関係を具体例を用いて説明する。
【0041】
後述するように、直線が7/18の傾きを有する場合、即ち、Mの値が18、Mの値が7である場合には、描画点は図20に示すように描かれる。この制御数列は{100101001001010010}であり、直線に沿ってこの数列の単位が繰返される。水平格子線上に並ぶ描画点の個数は3の場合と2の場合とがあり、制御数列をこの二種類のブロックの組合せとして、「100」「10」「100」「100」「10」「100」「10」と表すことができる。この「100」のブロックをBタイプ、「10」のブロックをAタイプとすると、Aタイプは水平格子線上にQ(Q=2)個の描画点が並び、BタイプはQ+1個の描画点が並んでいる。つまり、商数列の最初のQの値により、Aタイプ及びBタイプのブロックに含まれる描画点の数が決まってくる。
【0042】
また、制御数列は、このA及びBを用いて、B,A,B,B,A,B,Aのブロックの連結として表すことができるが、これはBの後に続くAの数が1のブロックと、Bの後に続くAの数が0のブロックとの組合せ、即ち、「B」「B」「B」「B」と表すことができる。この「B」をBタイプ、「B」をAタイプとすると、AタイプはQ(Q=1)個のブロックを含み、BタイプはQ+1個のブロックを含んでいる。つまり、商数列の次のQの値により、Aタイプ及びBタイプに含まれるブロック数が決まってくる。
【0043】
また、制御数列は、このA及びBを用いて、B,A,B,Bのブロックの連結として表すことができるが、これはBの後に続くAの数が1のブロックと、Bの後に続くAの数が0のブロックとの組合せ、即ち、「B」「B」「B」と表すことができる。この「B」をBタイプ、「B」をAタイプとすると、AタイプはQ(Q=1)個のブロックを含み、BタイプはQ+1個のブロックを含んでいる。つまり、商数列のその次のQの値により、Aタイプ及びBタイプに含まれるブロック数が決まってくる。
【0044】
また、制御数列は、このA及びBを用いて、B,A,Aのブロックの連結として表すことができるが、これはBの後にAが2つ続く1つのブロックである。これをAタイプとすると、AタイプはQ(Q=3)個のブロックを含んでいる。つまり、商数列のその次のQの値により、Aタイプに含まれるブロック数が決まってくる。
【0045】
この段階のAのように、Bに対応するブロックが存在しない状態は、商数列の算出において剰余が0の状態に相当している。このときA×M(Mは除数レジスタ502の内容。この具体例の場合M=1)が制御数列となる。
【0046】
さて、制御数列計算装置104の制御数列制御装置605は、商数列とこのような関係にある制御数列を、商数列記憶装置503に格納されている商数列を用いて、制御数列記憶装置601の中に生成する。その手順を図10及び図11に示すフローチャートを用いて説明する。
【0047】
ステップ1001:制御数列制御装置605は、制御数列記憶装置601の第1ワード(即ちアドレス0)に“1”を書き込む。更に商数列ポインタ604の内容を0に設定する。これによりアドレスポインタ604は、商数列記憶装置503の第1番地、即ちQが格納されている番地を指示する。
【0048】
ステップ1002:制御数列制御装置605は、アドレスポインタ604の指示するアドレスを読み出し(この場合はアドレス0を読むことになるのでQが読み出される)、制御数列記憶装置601の第2ワード(即ちアドレス1)から、今読み出された値の個数だけ、即ち、Q個だけの語にデータ“0”を書き込む。
【0049】
ステップ1003:次いで、制御数列制御装置605は、アドレスポインタ602に数値Q−1を、アドレスポインタ603に数値Qを書込み、
ステップ1004:アドレスポインタ604の内容を1だけ増加する。
【0050】
このときの制御数列記憶装置601の内容とアドレスポインタ602及びアドレスポインタ603のポイント位置とを図12に示している(アドレス0からポインタ602の指し示すアドレスQ−1までのデータが、先の具体例のAタイプのデータであり、アドレス0からポインタ603の指し示すアドレスQまでのデータがBタイプのデータとなる)。
【0051】
次に、制御数列制御装置605は、図11に示す手順に従って、
ステップ1101:商数列記憶装置503からポインタ604の指示する番地を読出す。この時読み出される値は、これまでに読み出された商数列の次の要素である。この値をQnとする。
【0052】
ステップ1102:制御数列記憶装置601の先頭番地、即ち、0番地からアドレスポインタ602が指示する番地までの内容をQ回繰り返して、アドレスポインタ603の指示する番地の次の番地から始まる領域にコピーする(この操作は、先の具体例において、ブロックBn−1の後にブロックAn−1をQ回繋げてブロックBを生成することに相当している)。この動作を図示したものが図13である。即ち、ゼロ番地からポインタ602が指示する番地までの内容をCとすると、CをQ繰り返してアドレスポインタ603の指示する番地の次から始まる領域へコピーする。
【0053】
ステップ1103:アドレスポインタ603には格納最終番地を格納する。即ち、アドレスポインタ603は破線で示した番地を指示することになる(アドレス0からアドレスポインタ603のポイントする番地までのデータが先の具体例におけるブロックBのデータとなる)。更に、アドレスポインタ603から以前のアドレスポインタ602の内容を減じた値に更に1を減じた値をアドレスポインタ602に格納する。即ち、アドレスポインタ602は図13の破線で示した番地を指示するようになる(アドレス0からアドレスポインタ602のポイントする番地までのデータが先の具体例におけるブロックAのデータとなる)。この段階で0番地からアドレスポインタ602の指示する番地までの内容がCn+1、0番地からアドレスポインタ603の指示する番地までの内容がCn+1となっている。この後、アドレスポインタ604の内容を1だけ増加する。
【0054】
ステップ1104:ポインタ604の内容とポインタ507の内容とを比較し、不一致であればステップ1101へ移行する。一致した場合は、
ステップ1105:既に商数列のすべての要素についてステップ1101〜ステップ1103を実行したことになる。従って、式(2−13)を計算する過程に移行する。ポインタ604が指示している番地を読み出す。即ち、Mが読み出される。
【0055】
ステップ1106:制御数列記憶装置601の0番地からアドレスポインタ602の指示する番地にはCが格納されている。従って、これをMN−1回繰り返してアドレスポインタ602の指示する番地の次の番地から始まる領域に格納する。これにより、M*Caになる。
【0056】
ステップ1107:最終格納番地をアドレスポインタ602に格納する。これにより、0番地からアドレスポインタ602の指示する番地までの内容が制御数列Cとなる。
【0057】
こうして生成された制御数列記憶装置601の内容の内、0番地からポインタ602の指示する番地までに格納されたデータが求める制御数列となる。
【0058】
制御数列から描画点の座標X、Yを計算する座標計算装置105は、図7に示すように、制御数列記憶装置601のアドレスを指示するポインタ701と、制御数列記憶装置601から読みだされたデータを格納するバッファ702と、描画点のX座標を保持するレジスタ704と、描画点のY座標を保持するレジスタ705と、バッファ702から出力された値とレジスタ705から出力された値とを加算する加算器703と、座標計算装置の各部を制御する座標計算制御装置706とを備えている。なお、制御数列記憶装置601及びアドレスポインタ602は、図6の601及び602そのものであり、アドレスポインタ602は制御数列記憶装置601の最終格納番地を指し示している。
【0059】
座標計算制御装置706は、制御数列記憶装置601から制御数列の要素を最初から一つずつ読み出し、これを基に描画点の座標(X,Y)を出力する。その動作をフローチャートにしたものが図14である。以下、図14に沿って動作を説明する。但しレジスタ704と705には、それぞれ(X,Y)の初期値、即ち最初の描画点の座標が格納されているものとする。
【0060】
ステップ1401:ポインタ701をゼロに設定する。これによりポインタ701は制御数列記憶装置601の先頭番地を指示することになる。
【0061】
ステップ1402:座標計算制御装置706は、ポインタ701の指示する番地を読み出すための制御信号710をONにして、その読み出されたデータをバッファ702に格納する。
【0062】
ステップ1403:座標計算制御装置706は、信号711をONにする。これによりレジスタ704は格納している値を1だけ増加する。同時にレジスタ705は、加算器703から出力された値、即ち、レジスタ705がそれまで保持していた値にバッファ702の内容を加えた値を格納する。バッファ702の内容は0または1であるので、レジスタ705の内容は元のままの値かあるいは1だけ増加した値となる。
【0063】
ステップ1404:レジスタ704と705の出力を描画点の座標(X,Y)として描画する。
【0064】
ステップ1405:座標計算制御装置706は、ポインタ701とポインタ602の保持する値同志を比較する。両者の内容が一致していればステップ1401へ移る。内容が一致するということは制御数列の最終要素を使ってステップ1402〜ステップ1403を実行したことを意味する。
【0065】
ポインタ701とポインタ602の内容が不一致である場合は、
ステップ1406:ポインタ701の内容を1だけ増加し、制御数列の次の要素を読み出す準備をする。この後、ステップ1402へ移行する。
【0066】
以上の動作により、描画点の座標(X,Y)が次々と生成され出力713と出力714とに出力される。
【0067】
以上の動作を具体的数値例を用いて再度説明する。MとMの値をそれぞれ18と7であるとして説明する。この場合、商数列Qは以下の計算より式(2−15)のようになる。この商数列は、4回の除算で生成することができる。
【0068】
18=2×7+4 より Q=2,M=7,M=4
7=1×4+3 より Q=1, M=3
4=1×3+1 より Q=1, M=1
3=3×1+0 より Q=3, M=0
Q={2,1,1,3} (2−15)
図1のレジスタ101と102とにそれぞれ数値18と7とが格納されている状態から説明を始める。まず、商数列制御装置510は、ステップ801とステップ802とを実行すると、商数列記憶装置503の0番地に数値2が、レジスタ504に数値4が格納される。次に、ステップ803を実行し、剰余レジスタ504の内容がゼロでないのでステップ804の実行へ移る。これによりポインタ507の内容は1となる。次にステップ805を実行すると、レジスタ501とレジスタ502にはそれぞれ数値7と4が格納される。再度ステップ802の実行により、商数列記憶装置503の1番地とレジスタ504にそれぞれ数値1と3とがそれぞれ格納される。この後、ステップ803、804、805を実行した後、第3回のステップ802の実行で商数列記憶装置503の2番地に1が、レジスタ504に1が格納される。
【0069】
更にステップ803、804、805を実行した後、第4回目のステップ802の実行により、商数列記憶装置503の3番地に数値3が、レジスタ504に数値0が格納される。この後ステップ803を実行すると、剰余レジスタ504の値がゼロであるので、ステップ806により、レジスタ502の内容、即ち数値1が商数列記憶装置503に格納される。この後、動作は終了する。この結果、商数列記憶装置503には、商数列
Q={2,1,1,3}
と、その後にM、即ち数値1が記憶され、商数列記憶装置503の内容は図15のようになり、ポインタ507は最終要素格納番地、即ち4番地を指示した状態になる。以上の過程をまとめると表1のようになる。
【0070】
Figure 0003552823
【0071】
次に、制御数列計算過程の説明に移る。図15のように、商数列Qと除数列Mの最終要素Mとが商数列記憶装置503に記憶された状態で制御数列制御装置605がステップ1001〜ステップ1004を実行する。即ち、制御数列制御装置605は、商数列記憶装置503の先頭アドレスを読み出す。この結果、数値“2”が読み出されるので、制御数列記憶装置601は図16のような状態になる。即ち、0番地に数値1が書き込まれ、その次から2語に数値0が書き込まれた状態になる。ポインタ602と603にはそれぞれ数値“1”と“2”が保持される。
【0072】
次に、制御数列制御装置605が、再度ステップ1101〜ステップ1104を実行すると、制御数列記憶装置601の内容は図17のようになる。即ち、ステップ1101において商数列記憶装置503から読み出される値は“1”であるから、図17の0番地からポインタ602の指示する番地の内容、即ち{1,0}が1回だけ3番地から始まる領域にコピーされる。この後、ポインタ603には数値4が、ポインタ602には数値4−1−1、即ち数値2が格納される。
【0073】
この後、ポインタ604とポインタ507の内容が比較される。それぞれには数値1と4が格納されているので、再度ステップ1101〜ステップ1103が実行される。この結果、制御数列記憶装置601の内容は図18のようになる。
【0074】
この後、ポインタ604の内容は2であるから、第3回目のステップ1101〜ステップ1103が実行され、制御数列記憶装置601の内容は図19のようになる。この後、ステップ1104を実行すると、ポインタ604の内容はポインタ507と一致する。従って、ステップ1105〜ステップ1107が実行されるが、Mの値は1であるのでステップ1106は0回繰り返される。従って、制御数列記憶装置601の0番地からポインタ602の指示する17番地までの内容が求める制御数列となり、ここで終了する。以上の過程をまとめると表2のようになる。
【0075】
Figure 0003552823
【0076】
次に、この結果に基づいて、座標計算装置105の動作を説明する。説明を簡単にするため(X,Y)の初期値は(0,0)とする。一般には最初の描画点P(X,Y)である場合には初期値を(X−1,Y−1)にすれば良い。
【0077】
まず、座標計算制御装置706がステップ1401〜ステップ1403を実行すると、信号線713と714とには1と1とが出力される。レジスタ704は1だけ増加するから“1”となる。レジスタ705にも1が加算されるから“1”となる。これは制御数列記憶装置601の先頭番地の内容、即ち1が読み出されるからである。第2回目のステップ1401〜ステップ1403を実行すると、出力713と714とにはそれぞれ“2”と“1”が出力される。これは、出力713の出力は毎回1だけ増加するが、出力714、即ちY出力は今回は増加しない。これは制御数列記憶装置601の第2ワード、即ち1番地には“0”が書かれているからである。
【0078】
このようにしてステップ1402〜ステップ1406のループが繰り返されると、出力713と714は表3のように変化していく。これを描画点にしたものが、図20である。
【0079】
Figure 0003552823
以上のとおり、制御数列が求まると、描画点の座標の計算には加算のみが必要であり、Bresenhamのアルゴリズムのような条件判定は不要である。また前述したように、商数列を生成するのに必要な除算回数は4回であり、これにより18個の点が描画できる。
【0080】
第3節 数学的証明
以上のように、式(2−3)〜(2−13)によって制御数列を求め、式(2−1)、(2−2)によって描画点の座標を算出する描画方法は、従来の方法(例えば図3の方法)で得られる、直線Lの最も良い近似点を表す座標と同一の座標を生成する。このことの数学的説明を以下に述べる。
【0081】
本発明の描画方法は、式(2−11)及び(2−12)の関係が成立することに基盤を置いている。この関係におけるn=1,n=2,n=3及びnが一般の値を取る場合について説明する。
【0082】
直線Lの傾きをM/M(M、Mは整数)とする。そしてM、Mに対して、式(2−3)〜(2−6)が成立しているものとする。図21のように、直線Lを近似する描画点Pが同一水平格子線上に並ぶ個数をKとすると
=Q (3−1)
または
=Q+1 (3−2)
である。式(3−1)及び(3−2)の証明は後の<証明1>に述べる。図22のように、描画点が水平にQ+1個並んだものをまとめてBタイプのブロックとし、図23のように、描画点が水平にQ個並んだものをまとめてAタイプのブロックと呼ぶことにする。すると、直線Lを近似する描画点の集合は、図24のようにAとBの2種類のブロックを連結したものになる。このようにKが1だけ異なる2つの値を取り得るのは、式(2−4)において、
≠0
の場合である。言い換えれば、MがMで割り切れれば、KはQの値だけを取る。
【0083】
図24のように、Bタイプのブロックから数えて次のBタイプのブロックが出現するまでのブロックの個数をKとする。言い換えればAタイプのブロックが連続する個数をK−1とすると
=Q (3−3)
または
=Q+1 (3−4)
である。式(3−3)及び(3−4)の証明は<証明2>に示す。
【0084】
従って、タイプBのブロックの次にタイプAのブロックがQ個続く場合と、Q−1個続く場合とが存在する。図25のように前者をブロックB、後者をブロックAと呼ぶことにする。更に、タイプBのブロックから数えて次のタイプBのブロックが出現するまでのブロック数をKとすると、同様に
=Q (3−5)
または
=Q+1 (3−6)
である。このことの証明は<証明3>に述べる。
【0085】
一般に図26のように、ブロックBから次のブロックBまでのブロック数をKm+1とすると、
m+1=Qm+1 (3−7)
または
m+1=Qm+1+1 (3−8)
である。このことを更に厳密に表現すると以下のようになる。即ち、一般に、ある直線Lに対して垂直格子線上で最も近い格子点列を次の条件を満たす2つの集合AとBとに分けることができる。そして、これらのAとBとは、式(2−4)の集合Qの要素である整数Qに対して次の関係を持つ。
【0086】
=Bm−1&(Q−1)*Am−1 (3−9)
=Bm−1&Q*Am−1 (3−10)
但し、X&Yは集合Xの右に集合Yを接続したものを意味し、α*Yは集合Yをα個接続したものを意味する。このことの証明は<証明4>に述べる。
【0087】
このようにKが1だけ異なる2つの値を取るのは、式(2−4)のMm+1≠0であるからである。このようなプロセスをn=Nとなるまで続けることができる。n=Nとなると式(2−4)の余りはゼロ、即ち
N+1=0
であるから以後、描画点はブロックAだけの繰り返しとなる。
【0088】
図26から分かるように、ブロックAはブロックBn−1のうしろにQ−1個のブロックAn−1を接続したものであり、ブロックBはこれにもう一つブロックAn−1を接続したものである。従って、ブロックAとBの制御数列をそれぞれC,Cとすると
=Cn−1&(Q−1)*Cn−1
=C&Cn−1
即ち、式(2−11)、(2−12)を得ることができる。MはMとMとの最大公約数であるからn=Nの以後はAの繰り返しとなり、式(2−13)を得る。
【0089】
<証明1>
図21のように直線Lを近似する描画点P〜Pが、同一水平線上に並ぶ個数をKとする。直線の傾きは整数比M/Mとする。簡単のため格子間隔は1とする。真の点、即ち、直線Lと垂直の格子線と交点をT〜Tとする。垂直方向でTに最も近い点、即ち描画点をPとする。真の点TのY座標から描画点PのY座標の値を引いたものをRとし、これを点Pの残差と呼ぶことにする。点PからPまでが水平格子線Hの上にあり、点Pi−1はH上に、点Pj+1はH上にあるとする。真の点Tと描画点Pとの位置の差Rは、
−1/2≦R<1/2 (4−1)
である。直線の傾きはM/Mであるから、TのY座標はTi−1のY座標よりM/Mだけ大きい。Ti−1は一本下の水平格子線Hの方に近い。従ってPのY座標はPi−1のY座標よりも1だけ大きい。このことから(4−1)より更に強い条件を導くことができる。即ち
=Ri−1+(M/M)−1 (4−2)
であるから、(4−2)を(4−1)に代入して
1/2−M/M<Ri−1 (4−3)
となる。結局、右隣の描画点が一本上の格子線上に存在する描画点Pi−1について
1/2−M/M≦Ri−1<1/2 (4−4)
の関係が成立する。このことはPについても成立するから
1/2−M/M≦R<1/2 (4−5)
またPi−1からPまでの距離はKであるから
=Ri−1+K(M/M)−1 (4−6)
であるから、式(4−4)、(4−5)、(4−6)よりRi−1、Rを消去すると
/M−1<K<M/M+1 (4−7)
となる。ここでM=Q+Mであるから
+(M/M)−1<K<Q+(M/M)+1 (4−8)
である。Kは整数であり、0<M/M<1であるから
=Q
または
=Q+1
である。証明終わり。
【0090】
<証明2>
図22のように、Bタイプのブロックの左端の描画点の更に左の描画点PB1Lの残差(以下、Bの左残差と呼ぶ)をRB1Lとする。また、Bの右端の描画点PB1Rの残差をRB1Rとする。PB1L、PB1Rの両方ともその右隣の描画点は一本上の水平格子線上に存在する。従って式(4−4)から
1/2−M/M≦RB1L<1/2 (5−1)
1/2−M/M≦RB1R<1/2 (5−2)
また、
△B=RB1R−RB1L (5−3)
とすると、△BはタイプBのブロックが引き起こす残差の変化分である。タイプBのブロックは、Q+1個の水平描画点を持つから1点につきM/Mだけ残差は増加する。また、PB1RはPB1Lより1本上の格子線上にあるから、残差は1だけ減じられる。従って
△B=(Q+1)M/M−1=(M−M)/M (5−4)
となる。
【0091】
また、同様に、Aタイプの左残差をRA1R、このブロックの右に隣接するブロックの左残差をRA1R、Aタイプのブロックが引き起こす残差の変化分を△Aとすると
1/2−M/M≦RA1L<1/2 (5−5)
1/2−M/M≦RA1R<1/2 (5−6)
△A=RA1R−RA1L (5−7)
△A=Q/M−1=−M/M (5−8)
となる。式(5−1)、(5−2)、(5−3)、(5−4)からRB1R、△Bを消去すると
1/2−M/M≦RB1L<1/2−(M−M)/M (5−9)
また、式(5−5)、(5−6)、(5−7)、(5−8)からRA1R、△Aを消去すると
1/2−(M−M)/M≦RA1L<1/2 (5−10)
となる。
【0092】
図24の第1番目のBタイプのブロック241から、次のBタイプのブロック244の直前までのブロック数をKとする。ブロック241はBタイプであるからその左残差は
1/2−M/M≦RB1L<1/2−(M−M)/M (5−11)
である。ブロック244もタイプBであるから、このブロックの左残差をRB1Nとすると
1/2−M/M≦RB1N<1/2−(M−M)/M」 (5−12)
である。Aタイプの並ぶ個数はK−1個であるから
B1N=RB1L+△B+(K−1)△A (5−13)
となる。式(5−4)、(5−8)、(5−13)より
B1N=RB1L+(M−M)/M−(K−1)M/M (5−14)
であるから、(5−11)、(5−12)、(5−14)より
(M/M)−1<K<(M/M)+1 (5−15)
である。式(2−4)に従って
=Q+M
だから
+(M/M)−1<K<Q+(M/M)+1 (5−16)
となる。ここで0<M/M<1でKは整数だから
=Q
または
=Q+1
である。証明終り。
【0093】
<証明3>
図25の251及び254のように、Bタイプのブロックの次にAタイプのブロックがQ個連続するものをBタイプのブロック、Q−1個連続するものをAタイプのブロックとする。任意のBタイプのブロックからその右方に存在するBタイプのブロックの直前までのブロック数をK個とする。Bタイプのブロック251の左残差をRB2L、Aタイプのブロック252の左残差をRA2Lとする。これらはそれぞれ左端にBタイプのブロックが在るからBタイプの左残差を持ち、式(5−9)より
1/2−M/M≦RB2L<1/2−(M−M)/M (6−1)
1/2−M/M≦RA2L<1/2−(M−M)/M (6−2)
となる。ブロック251にはBタイプのブロックが1個、AタイプのブロックがQ個並んでいるから
△B=RA2L−RB2L=△B+Q△A (6−3)
となる。ブロック253の左残差をRA2Nとすると
△A=RA2N−RA2L=△B+(Q−1)△A (6−4)
となる。式(6−3)、(6−4)の△A、△Bに(5−4)、(5−8)を代入すると
△A=M/M (6−5)
△B=−(M−M)/M (6−6)
となる。式(6−1)、(6−2)、(6−3)、(6−6)より
1/2−(M−M+M)/M≦RB2L<1/2−(M−M)/M (6−7)
を得る。ブロック254の左残差をRB2Nとすると、RB2Nも式(6−7)を満足しなければならないから
1/2−(M−M+M)/M≦RB2N<1/2−(M−M)/M (6−8)
となる。ブロック251から次のBタイプのブロック254までには、AタイプのブロックがK−1個存在するから
B2N=RB2L+△B+(K−1)△A (6−9)
であり、式(6−7)、(6−8)、(6−9)より
−M/M<△B+(K−1)△A<M/M (6−10)
を得る。△A>0、△B<0であることを考慮して、式(6−5)、(6−6)、(6−10)から△A、△Bを消去すると
+M/M−1<K<Q+M/M+1 (6−11)
0<M/M<1で、Kは整数だから
=Q
または
=Q+1
である。証明終り。
【0094】
<証明4>
一般式を数学的帰納法によって証明する。即ち、式(7−1)〜(7−6)が成立しているものとして、式(7−7)〜(7−12)を導出する。
【0095】
=Bn−1&(Q−1)*An−1 (7−1)
=Bn−1&Q*An−1 (7−2)
n−1<Rn−1<Un−1 (7−3)
n−1<Rn−1<Un−1 (7−4)
△An−1=(Sn−1−S)/M (7−5)
△Bn−1=(Sn−2−S)/M (7−6)
n+1=B&(Qn+1−1)*A (7−7)
n+1=B&Qn+1*A (7−8)
<R<U (7−9)
<R<U (7−10)
△A=(S−Sn+1)/M (7−11)
△B=(Sn−1−Sn+1)/M (7−12)
但し、U、U、W、Wはnが奇数の場合と偶数の場合とで、それぞれ以下の値を取る。即ち、
nが奇数の場合
=−1/2+Sn−1/M (7−13)
=W=−1/2+Sn+1/M (7−14)
=−1/2+S/M (7−15)
nが偶数の場合
=W=−1/2+Sn+1/M (7−16)
=−1/2+S/M (7−17)
=−1/2+Sn−1/M (7−18)
である。また、
=M−M+M+…+(−1) (7−19)
である。また、式(7−19)におけるM,M,‥,Mは式(2−8)の除数列の要素である。
【0096】
式(7−3)におけるRn−1は図26のタイプAn−1のブロック2602の最左端の描画点の左残差である。また、式(7−4)におけるRn−1はタイプBn−1の最左端の描画点の左残差である。また、△An−1はタイプAn−1のブロックの残差の増分である。即ち、ブロック2603の最左端の描画点の左残差からブロック2602の最左端の描画点の左残差を差し引いた値である。△Bn−1はタイプBの残差の増分である。即ち、ブロック2602の最左端の描画点の左残差Rn−1から、ブロック2601の最左端の描画点の左残差Rn−1を差し引いた値である。
【0097】
式(7−1)、(7−2)は、次のことを意味している。即ち、
(1)垂直方向で最も直線に近い描画点群は、図26のようにタイプAn−1とタイプBn−1の2種類の形状のブロックに分けることができる。
(2)これらのブロックの連鎖はタイプBn−1の右にQ−1個のタイプAn−1のブロックが接続する場合と、タイプBn−1の右にQ個のタイプAn−1のブロックが接続する場合とが存在する。また、この場合だけが存在する。前者をタイプA、後者をタイプBとする。
【0098】
上記(1)と(2)及び式(7−3)〜(7−6)を前提として、式(7−7)〜(7−12)を導出する。まず(1)、(2)より
△A=△Bn−1+(Q−1)△An−1 (7−20)
△B=△Bn−1+Q△An−1=△A+△An−1 (7−21)
である。これに(7−5)、(7−6)を代入すると
Figure 0003552823
以上から(7−11)、(7−12)が導出された。
【0099】
図26において、ブロック2605の左残差をR、ブロック2607のそれをRとする。Rはブロック2601の左残差の条件を満たさなければならないから、
n−1<R<Un−1 (7−22)
更にR+△Bはブロック2606の左残差を満たさなければならないから、
n−1<R+△B<Un−1 (7−23)
また、Rはブロック2606の左残差を満たさねばならないから
n−1<R<Un−1 (7−24)
また、R+△Aはブロック2611の左残差の条件を満たさねばならないから、
n−1<R+△A<Un−1 (7−25)
である。
【0100】
以上をもとに(7−22)〜(7−25)より(7−9)〜(7−10)を導出するが、nが奇数の場合と偶数の場合に分けて導出する。まず、nが奇数の場合、(7−11)、(7−12)、(7−19)より
Figure 0003552823
である。従って(2−4)から
△A<0
△B<0
である。従って(7−22)、(7−23)、(7−24)、(7−25)より
n−1<R<Un−1−△B (7−26)
n−1−△A<R<Un−1 (7−27)
を得る。nは奇数だから、n−1は偶数である、(7−16)、(7−17)、(7−18)より
Figure 0003552823
従って
−1/2+S/M<R<−1/2+Sn+1/M (7−28)
また、(7−16)、(7−17)より
n−1−△A=−1/2+S/M−(S−Sn+1)/M
=−1/2+Sn+1/M
n−1=−1/2+Sn−1/M
従って
−1/2+Sn+1/M<R<−1/2+Sn−1/M (7−29)
以上から
=−1/2+Sn+1/M
=−1/2+S/M
=−1/2+Sn−1/M
=−1/2+Sn+1/M
よって(7−13)、(7−14)、(7−15)が導出された。
【0101】
次にnが偶数の場合は
Figure 0003552823
である。nは偶数だから
△An>0
△Bn<0
である。従って(7−22)、(7−23)、(7−24)、(7−25)より
n−1−△B<R<Un−1
n−1<R<Un−1−△A
を得る。nは偶数だからn−1は奇数であり、(7−14)、(7−15)より
Figure 0003552823
従って
−1/2+Sn+1/M<R<−1/2+S/M
または(7−13)、(7−14)より
Figure 0003552823
従って
−1/2+Sn+1/M<R<−1/2+Sn−1/M
以上から
=−1/2+S/M
=−1/2+Sn+1/M
=−1/2+Sn+1/M
=−1/2+Sn−1/M
よって(7−16)、(7−17)、(7−18)が導出された。
【0102】
以上から、nが奇数の場合、偶数の場合とも式(7−9)、(7−10)が導出されたことになる。
【0103】
次に式(7−7)、(7−8)を導出する。図26のようにタイプAのブロックとタイプBのブロックとに描画点群は分けられると仮定して、2つのタイプBのブロック2605と2610との間にKn+1−1個のタイプAのブロックが存在したとする。ブロック2605と2610とは両方ともタイプBであるから、
<R<U (7−10)
<R+△B+(Kn+1−1)△A<U (7−30)
を満たす。
【0104】
−U<−R<−W (7−31)
であるから、式(7−30)、(7−31)の両辺を加算しRを消去すると
−(U−W)<△B+(Kn+1−1)△A<U−W (7−32)
を得る。(7−11)、(7−12)より
△B−△A=−(−1)/M (7−33)
また、式(7−13)、(7−14)、(7−17)、(7−18)より、nが奇数の場合も偶数の場合も
−W=Mn+1/M (7−34)
である。(7−32)、(7−33)、(7−34)より
−{Mn+1−(−1)}/M<Kn+1×△A<{Mn+1+(−1)}/M (7−35)
nが奇数の場合も偶数の場合も
/Mn+1−1<Kn+1<M/Mn+1+1 (7−36)
となる。(2−4)より
n+1+Mn+2/Mn+1−1<Kn+1<Qn+1+Mn+2/Mn+1+1
0<Mn+2/Mn+1<1でかつKn+1は整数だから
n+1=Qn+1
または
n+1=Qn+1+1
である。
【0105】
以上から、Bの右にAがQn+1−1個接続される場合と、Bの右にAがQn+1個接続される場合とが存在することが分かる。前者をAn+1、後者をBn+1とすれば、式(7−7)、(7−8)が導出されたことになる。従って、タイプAn−1のブロックとタイプBn−1のブロックとが接続されてできる連鎖は、次の2つのブロックの連鎖に分けることができる。即ち、
タイプAのブロック:1個のタイプBn−1のブロックにQ−1個のタイプAn−1のブロックが接続されたブロック
タイプBのブロック:1個のタイプBn−1のブロックにQ個のタイプAn−1のブロックが接続されたブロック
の2つである。n=1及びn=2の場合は、それぞれ<証明1>及び<証明2>によって成立している。従って、数学的帰納法により1からNまでのすべてのnについて、(7−7)〜(7−19)が成立する。証明終り。
【0106】
本発明の直線描画装置は、描画点の座標を高速に計算できる。直線の傾きを整数比、即ちM/Mとすると、以下の作業で描画点の座標を計算できる。
【0107】
(ア)MとMとから商数列を計算する。
【0108】
(イ)商数列から制御数列を計算する。
【0109】
(ウ)制御数列をもとに一描画点あたり、2回の加算で座標を生成する。
【0110】
上記(ア)(イ)の演算操作は、描画点の数に比例しない。直線の傾きM/Mだけから少数回の演算で実行できる。従って描画点の個数が多くなればなるほど効果がある。また、(ア)(イ)の演算操作は、描画の開始前に実行を済ませておくことができる。従って描画中には(ウ)の演算操作だけを行なえばよく、高速な描画が可能である。(ウ)の演算は“1”または“0”を加算する演算であるから、この部分を簡単なハードウエアで実現することも可能である。これに対して従来の方法、例えば図3のような例では描画と同時に座標計算のための数値演算と条件判定とを行なわなければならなかった。本発明はこのような欠点を克服するものである。
【0111】
更に(イ)で生成される制御数列は最小周期の情報であるから、描画点の数が多くても繰り返し利用することができる。加えて、Bresenhamのアルゴリズム同様、丸め誤差が積算することはなく、描画点数によらず正確な描画が出来る。即ち、本発明の装置によって生成される描画点はBresenhamのアルゴリズムによって生成されるものと同一になる。
【0112】
また、本装置の描画方法では、水平に並ぶ描画点の数を簡単な計算で予め算出することが出来る。従って、描画中に次に描画すべき点の座標を算出する必要はなく、描画以前にすべての点を算出するデータを得ることができる。もちろん描画と並列して描画点を算出することも可能である。描画中に判定操作も減算操作も不要である。従って、従来の方式に比べて大幅に描画時間を短縮できる。
【0113】
(実施の形態2)
第2の実施形態の直線描画装置は、図27に示すように、除算の代わりに減算を行なって制御数列を生成する統合計算装置271を備えており、座標計算装置272は、この統合計算装置271の生成した制御数列に基づいて直線を描画する。
【0114】
この装置の利点は
(1)除算器を必要としない。
(2)商数列記憶装置を必要としない。
の2点にある。
【0115】
この統合計算装置271は、28図に示すように、Mの値を保持するレジスタ102と、Mの値を保持するレジスタ101と、入力する3つの値の1つを選択して出力するセレクタ2817と、セレクタ2817の出力を保持する減数レジスタ2806と、入力する値から減数レジスタ2806の値を減算する減算器2807と、減算器2807、減数レジスタ2806またはレジスタ101の出力値の内の1つを選択して出力するセレクタ2808と、セレクタ2808の出力を保持する残余レジスタ2805と、減数レジスタ2806の内容が“1”であるか否かを検出する1検出器2816と、残余レジスタ2805の内容がゼロであることを検出するゼロ検出器2814と、生成された制御数列を記憶する制御数列記憶装置2801と、制御数列記憶装置2801に対するアドレスポインタ2802、2803と、統合計算装置271の各部を制御する統合制御装置2804とを備えている。
【0116】
この装置では、減算器2807が、残余レジスタ2805の値から減数レジスタ2806の値を減算し、この減算を一回行なう毎に、統合制御装置2804が制御数列記憶装置2801の内容を一部変更する。そして、この繰り返しにより、最終的に制御数列が制御数列記憶装置2801の内部に生成される。
【0117】
この装置の動作を図29のフローチャートを用いて説明する。図29のフローチャートは、ステップ2901による初期状態設定の後に、ステップ2902を起点として次の4つのルートを持つ。即ち、
ルート1:ステップ2902、ステップ2903、ステップ2904、ステップ2905、ステップ2906、ステップ2907を通過してステップ2902へ戻るルート
ルート2:ステップ2902、ステップ2903、ステップ2910、ステップ2911を通過してステップ2902へ戻るルート
ルート3:ステップ2902、ステップ2903、ステップ2904、ステップ2905、ステップ2908、ステップ2909を通過してステップ2902へ戻るルート
ルート4:ステップ2902、ステップ2912、ステップ2913を通過してステップ2902へ戻るルート
の4つである。
【0118】
以下、初期状態の設定(ステップ2901)及び上記4つのルートにおける動作を順に説明する。なお、このフローチャートでは、(A)は装置Aの内容を表すものとする。従って(A)→Bは、装置AまたはA番地の内容を装置Bに転送することを意味する。
【0119】
このフローチャートは、ルート1をQ回実行した後、ルート2を1回実行する。この後、ルート3をQ回実行した後、ルート2を1回実行するということをm=2〜Nまで実行し、最後にルート4を1回実行する。
【0120】
<初期状態設定>
ステップ2901:まず、統合制御装置2804は、セレクタ2817に対して一番左の入力信号を選択するための信号2718を、また、セレクタ2808に対して一番右の入力信号を選択するための信号を出力し、また、減数レジスタ2806及び残余レジスタ2805に対して入力データの格納を指示する信号2815を出力する。これを受けて減数レジスタ2806はセレクタ2817から出力されたMの値を格納し、また、残余レジスタ2805はセレクタ2808から出力されたMの値を格納する。また、統合制御装置2804は、ポインタ(Pa)2802及びポインタ(Pb)2803に、制御数列記憶装置2801の0番地を指示するようにゼロを格納し、制御数列記憶装置2801のPb2803の指示する番地に信号線2811を通じて“1”を格納する((Pb)←“1”)。従って、制御数列記憶装置2801の0番地にデータ1が格納される。
【0121】
<ルート1>
初期状態の設定の後、
ステップ2902:統合制御装置2804は、ゼロ検出器2814の出力を調べ、残余レジスタ2805の内容がゼロでないときは、
ステップ2903:減算器2809から出力される、減算結果の負を表す信号2810がONかどうかを調べる。減算器2807は、これに先立って、残余レジスタ2805から読出した値から減数レジスタ2806に保持されている値を減算する演算を行なう。統合制御装置2804は、この信号2810によって、減数レジスタ2806の値と残余レジスタ2805の値との大小関係を識別し、減数レジスタ2806の値の方が残余レジスタ2805の値より小さければ、
ステップ2904:統合制御装置2804は、制御信号により、セレクタ2808に最も左の入力を選択するように指示し、また、残余レジスタ2805に信号2815を出力して、入力データの格納を指示する。その結果、残余レジスタ2805には、セレクタ2808の選択した減算器2807の出力、即ち、残余レジスタ2805の内容から減数レジスタ2806に保持されている内容を減じた値が格納される。
【0122】
ステップ2905:Pa2802の内容が0のときは、
ステップ2906:統合制御装置2804は、制御数列記憶装置2801のPb2803の値に1を加算したアドレスに“0”を格納し、
ステップ2907:Pb2803に、今まで保持している値に1を加算した値を新たに保持させる。次いで、ステップ2902に戻る。
【0123】
このルートがQ回実行される。なぜなら、MからMを減ずることを、結果が負になる直前まで実行するからである。このQは式(2−7)におけるQと同じである。Q回実行後の制御数列記憶装置2801の内容は図12と同一となる(但し、Paはアドレス0を指している)。
【0124】
回の上記減算の実行の後では、残余レジスタ2805の内容の方が減数レジスタ2806の内容より小さくなっている。従って、減算器2807の出力2810はONとなり減算結果が負になることが表示される。統合制御装置2804は、この信号を検出しステップ2903から分岐しルート2を辿る。
【0125】
<ルート2>
ステップ2910:減算器2807の出力2810がONとなると、セレクタ2808は中側の入力、即ち、減数レジスタ2806の内容を通過させる。従って、残余レジスタ2805には、それまで減数レジスタ2806に保持されていた内容Mが格納される。また、統合制御装置2804は、これ以上減算をすると結果が負になるという場合に、セレクタ2817に対して最も右の入力を選択するように指示し、その結果、減数レジスタ2806には、それまでの残余レジスタ2805の内容が格納される。従って減数レジスタ2806にはM−Q、即ち、Mが格納される。
【0126】
ステップ2911:信号2810がONになると、統合制御装置2804はPa2802及びPb2803の値を読み出し、Pb−Pa−1の演算を行ない、その結果をPa2802に格納する。これによりPa2802は図12の位置を指示する状態に移る。
【0127】
<ルート3>
ルート2を通過した後、ルート3を通過する。このルートでは、ステップ2902、ステップ2903、ステップ2904はルート1と同一であり、残余レジスタ2805の内容から減数レジスタ2806に保持された値Mが減算され、減算値が残余レジスタ2805に格納される。
【0128】
ステップ2905:Pa2802がゼロではないので、ステップ2908に移行し、
ステップ2908:統合制御装置2804は、制御数列記憶装置2801とデータの送受を行ないながら、制御数列記憶装置2801の0番地からPa2802の指示する番地までの内容を、Pb2803の指示する番地の次の番地から始まる領域にコピーする。
【0129】
ステップ2909:次いで、このコピー操作の格納最終番地をPb2803が指示するように設定する。
【0130】
この後、ステップ2902に戻り、同じ手順を繰り返す。この繰り返しをQ回行ない、残余レジスタ2805の値が減数レジスタ2806の値Mより小さくなると、ルート2を通過し、減数レジスタ2806に保持されていた値Mを残余レジスタ2805に格納し、それまでの残余レジスタ2805の格納値M−Q・M、即ちMを減数レジスタ2806に格納する。その後、さらにルート3を繰り返す。
【0131】
第2回目以降のルート2の通過により、残余レジスタ2805にはMが格納され、減数レジスタ2806にはMm+1が格納される。従って、その後のルート3は、残余レジスタ2805、減数レジスタ2806にそれぞれM、Mm+1が格納されている状態で始まり、残余レジスタ2805の内容が減数レジスタ2806の値で減算され、減算値が負になる直前まで繰り返され、残余レジスタ2805にM−Qm+1・Mm+1が、減数レジスタ2806にMm+1が格納された状態で終える。その後のルート2の通過により、残余レジスタ2805にMm+1が、減数レジスタ2806にM−Qm+1・Mm+1、即ちMm+2が格納される。
【0132】
このルートをQ回繰り返して実行すると、ステップ1102〜1103を実行した場合と同一の結果(図13の状態)が得られる。
【0133】
<ルート4>
ルート2、ルート3の実行を繰り返した後に、残余レジスタ2805の内容が減数レジスタ2806の内容で割り切れるようになると、残余レジスタ2805の内容はゼロになるので、ステップ2902から分岐し、ルート4の操作が実行される。このルート4は式(2−13)の計算を行なうための準備をするものである。
【0134】
ステップ2912:統合制御装置2804は、1検出器2816から出力される信号を調べることによって、減数レジスタ2806の内容が“1”であるか否かを識別する。減数レジスタ2806の内容が1である場合は、制御数列記憶装置2801に記憶された数列が既に制御数列であるため、式(2−13)の計算は実際には不要になる。そこで、すべての操作を終了して良い。
【0135】
ステップ2913:減数レジスタ2806の内容が1でないということは、M≠1で且つMN+1=0であるということであるから、式(2−13)の計算を行なう。そのためには、ルート3をM回通過すれば良い。そこで、残余レジスタ2805には減数レジスタ2806の内容、即ち、Mを、また、減数レジスタ2806には“1”を設定する。
【0136】
次いで、ルート3の通過を繰り返す。ルート3を1回通過するごとに、Mから1が減算され、M回の通過が終了した時点で残余レジスタ2805の値がゼロになり、それをゼロ検出器2814が統合制御装置2804に伝えて、制御数列生成の操作が終了する。
【0137】
このように、第2の実施形態の装置は、除算器を必要とせず、簡単な構造で直線の描画を行なうことができる。
【0138】
【発明の効果】
以上の説明から明らかなように、本発明の直線描画装置は、描画点を得るための操作回数を従来に比べて大幅に減らすことができ、高速での描画作業が可能になる。
【図面の簡単な説明】
【図1】本発明の第1の実施形態における直線描画装置の構成を示すブロック図、
【図2】直線を格子点で近似する描画の例、
【図3】直線と格子点との関係を説明する図、
【図4】従来の直線描画方式の一例、
【図5】第1の実施形態の直線描画装置における商数列計算装置の構成を示すブロック図、
【図6】第1の実施形態の直線描画装置における制御数列計算装置の構成を示すブロック図、
【図7】第1の実施形態の直線描画装置における座標計算装置の構成を示すブロック図、
【図8】前記商数列計算装置の動作を説明するフローチャート、
【図9】前記制御数列計算装置における制御数列記憶装置の内容を説明する図、
【図10】前記制御数列計算装置の動作を説明するフローチャート、
【図11】前記制御数列計算装置の動作を説明するフローチャートの続き、
【図12】前記制御数列記憶装置の内容と2つのアドレスポインタとの関係を示す図、
【図13】前記制御数列記憶装置の内容の変化を説明する図、
【図14】前記座標計算装置の動作を説明するフローチャート、
【図15】前記商数列記憶装置の内容の具体例、
【図16】前記制御数列記憶装置の内容の変化の具体例(その1)、
【図17】前記制御数列記憶装置の内容の変化の具体例(その2)、
【図18】前記制御数列記憶装置の内容の変化の具体例(その3)、
【図19】前記制御数列記憶装置の内容の変化の具体例(その4)、
【図20】前記具体例における描画点を示す図、
【図21】本発明の基礎となる数学的事実を証明するための図(その1)、
【図22】本発明の基礎となる数学的事実を証明するための図(その2)、
【図23】本発明の基礎となる数学的事実を証明するための図(その3)、
【図24】本発明の基礎となる数学的事実を証明するための図(その4)、
【図25】本発明の基礎となる数学的事実を証明するための図(その5)、
【図26】本発明の基礎となる数学的事実を証明するための図(その6)、
【図27】本発明の第2の実施形態における直線描画装置の構成を示すブロック図、
【図28】第2の実施形態の直線描画装置における統合計算装置の構成を示すブロック図、
【図29】前記統合計算装置の動作を説明するフローチャートである。
【符号の説明】
101、102 レジスタ
103 商数列計算装置
104 制御数列計算装置
105、272 座標計算装置
271 統合計算装置
501 被除数レジスタ
502 除数レジスタ
503 商数列記憶装置
504 剰余レジスタ
505 除算器
506 ゼロ検出器
507、602、603、604、701、2802、2803 アドレスポインタ
508、509、516、2808、2817 セレクタ
510 商数列制御装置
601 制御数列記憶装置
605 制御数列制御装置
702 バッファ
703 加算器
704 Rxレジスタ
705 Ryレジスタ
706 座標計算制御装置
2801 制御数列記憶装置
2804 統合制御装置
2805 残余レジスタ
2806 減数レジスタ
2807 減算器
2814 ゼロ検出器
2816 1検出器

Claims (3)

  1. 格子点上に直線の近似点を描画する直線描画装置において、
    直線の傾きを定める第1及び第2の整数をそれぞれ保持する第1及び第2の整数保持手段と、
    前記第1及び第2の整数保持手段に保持された2つの整数による除算で商と余りとを求め、次に、先行する除算の除数を被除数とし、余りを除数とする除算を繰り返して各除算の商から成る商数列を計算する商数列計算手段と、
    前記商数列から、隣接する描画点間の格子点上の差異を表す制御数列を計算する制御数列計算手段と、
    前記制御数列から描画点の座標を計算する座標計算手段と
    を備え、前記商数列計算手段は、前記商数列を求める際、除算の結果の余りが生じた場合、除算の余りが0になるまで計算を繰り返すことを特徴とする直線描画装置。
  2. 前記商数列計算手段が、被除数を保持する被除数保持手段と、除数を保持する除数保持手段と、前記被除数保持手段に保持された被除数を前記除数保持手段に保持された除数で除算する除算手段と、前記除算における商を保持する商数列保持手段と、前記除算における余りを保持する余り保持手段と、前記余り保持手段の内容がゼロであることを検出するゼロ検出手段とを具備し、前記被除数保持手段及び除数保持手段が最初にそれぞれ前記第1の整数及び第2の整数を保持し、前記除算手段の除算が行なわれた後、前記除数保持手段の内容を前記被除数保持手段に転送し、前記余り保持手段の内容を前記除数手段に転送して、前記除算手段の次の除算を行ない、これを前記余り保持手段の内容がゼロとなるまで繰り返すことを特徴とする請求項1に記載の直線描画装置。
  3. 前記制御数列計算手段が、生成された制御数列を記憶する制御数列記憶手段と、前記制御数列記憶手段の第1のアドレスを保持する第1のポインタと、前記制御数列記憶手段の第2のアドレスを保持する第2のポインタと、商数列を記憶する商数列記憶手段とを具備し、前記制御数列記憶手段の0番地から前記第1のポインタの指示する番地までの内容を複製の単位として、前記商数列記憶手段から読出した商数列要素の値の回数だけ複製して、前記制御数列記憶手段の前記第2のポインタが指示する番地の次の番地から始まる領域に格納し、前記第2のポインタの保持するアドレスを前記格納後の最終番地に変更し、前記第1のポインタの保持するアドレスを、次の複製の単位となる番地に変更し、この動作を、前記商数列記憶手段に記憶された商数列要素について1回ずつ繰り返すことを特徴とする請求項1に記載の直線描画装置。
JP34472595A 1995-12-07 1995-12-07 直線描画装置 Expired - Fee Related JP3552823B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP34472595A JP3552823B2 (ja) 1995-12-07 1995-12-07 直線描画装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP34472595A JP3552823B2 (ja) 1995-12-07 1995-12-07 直線描画装置

Publications (2)

Publication Number Publication Date
JPH09161082A JPH09161082A (ja) 1997-06-20
JP3552823B2 true JP3552823B2 (ja) 2004-08-11

Family

ID=18371500

Family Applications (1)

Application Number Title Priority Date Filing Date
JP34472595A Expired - Fee Related JP3552823B2 (ja) 1995-12-07 1995-12-07 直線描画装置

Country Status (1)

Country Link
JP (1) JP3552823B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100435258B1 (ko) * 1997-09-03 2004-07-16 삼성전자주식회사 컴퓨터 그래픽의 3차원 직선 그리는 방법

Also Published As

Publication number Publication date
JPH09161082A (ja) 1997-06-20

Similar Documents

Publication Publication Date Title
US6295072B1 (en) Method and apparatus for rendering cubic curves
CN111951348A (zh) 确定框选区域的方法、装置及电子设备
JP3552823B2 (ja) 直線描画装置
US5179647A (en) Method and apparatus for implementing adaptive forward differencing using integer arithmetic
JP4255467B2 (ja) デジタルガンマ補正回路およびデジタルガンマ補正方法
JPH03144782A (ja) 三次元図形処理装置
US9286654B2 (en) Image scaling processor and image scaling processing method
JPH0567216A (ja) 図形塗りつぶし装置
JP2008009719A (ja) 直線描画方法、直線描画プログラム及び直線描画装置
JPH0785266A (ja) 画像回転装置
JP3280160B2 (ja) 文書処理装置および文書処理方法
JP5072558B2 (ja) データ処理装置
JP2802646B2 (ja) ベクトルフオントによる文字パターンの変倍処理方法
US12093691B2 (en) Loop unrolling processing apparatus, method, and program
JP2748787B2 (ja) 曲線発生装置
JPS62219164A (ja) 高速投影算出回路
JPH04260982A (ja) 直線ピクセル生成器及び直線ピクセル生成方法
JPH01166177A (ja) 太線描画方法
JP2713400B2 (ja) 投影情報生成装置
JP2541697B2 (ja) パイプライン演算装置
JP3181956B2 (ja) 図形データ格納方法および装置
JPH0575844A (ja) 情報生成装置
CN115687841A (zh) 一种国土控制面积计算审核系统
JP2770560B2 (ja) 図形処理装置
JPH0248780A (ja) 直線発生装置

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20040113

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040312

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20040427

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20040427

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090514

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100514

Year of fee payment: 6

LAPS Cancellation because of no payment of annual fees