JP3552823B2 - 直線描画装置 - Google Patents
直線描画装置 Download PDFInfo
- 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
Links
Images
Landscapes
- Image Generation (AREA)
Description
【発明の属する技術分野】
本発明は、紙の上に直線を描画する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)に一点を描画する関数であり、描画する直線の傾きはM1/M0であるものとする。これから分かるように、描画点1個につき2回の加算(第4行、第5行)と1回の判定(第6行)、更に数点につき1回の減算(第8行)が必要である。
【0005】
図3のアルゴリズムを図4を用いて更に詳しく説明する。図4は図2の中の一つの描画点の付近を拡大した図である。点Tnは真の点、即ち、直線Lと垂直格子線との交点である。描画点Pnは真の点Tnに最も近い格子点である。従って点TnからPnまでのY座標の差をRnとすると、
−1/2≦Rn<1/2 (1−1)
である。但し、説明の簡単のため、格子間隔は縦、横とも1とする。Tn+1とTnとのY座標の差はM1/M0であるから
Rn+1=Rn+M1/M0, (Rn+M1/M0<1/2のとき) (1−2)
Rn+1=Rn+M1/M0−1,(Rn+M1/M0≧1/2のとき) (1−3)
という関係が成立する。以上の事実に基づき、描画点のX,Y座標を計算する手法の一つが図3に掲げたDDAのアルゴリズムである。
【0006】
図3の第1行は、変数Rnの初期値を設定するものである。第2行と第10行は対になっており、iを1から1ずつ増加させながら第3行から第9行までをM0回繰り返すことを意味している。第3行は、点Pi、即ち座標(Xi,Yi)に点を描画すること、即ちデータを書き込むことを意味する。第4行は、次の描画点のX座標を計算する、即ちX座標を1だけ増加することを意味する。つまり、第3行で描画した点の次の点、即ちPi+1のX座標が求められる。第5行は残差RmをM1/M0だけ増加することを意味する。格子間隔は1と仮定しているのでXが1だけ増加するとY座標はM1/M0だけ増加する。Rmは直線Lと格子線との交わる真の点のY座標の少数部分である。従って、第6行で残差が1/2より大きくなったか否かを調べ、もし1/2より大きければ、第7行で座標を1だけ増加し、第8行で残差から1を減ずる。
【0007】
実際にはこれを改良したBresenhamのアルゴリズムが多く利用されている。図3のプログラムを実際の計算機で実行する場合には図3の第5行で加算されるM1/M0は有限の長さのレジスタに保持される。従ってこの値には丸め誤差が入り込む場合がある。Bresenhamのアルゴリズムは、この誤差が発生しないようにしたものである。
【0008】
【発明が解決しようとする課題】
図3のようなアルゴリズムで直線を描画する場合、座標計算には以下の4つの操作が必要であった。即ち、
(1)一描画点当りX座標計算のための加算1回
(2)一描画点当りY座標計算のための加算1回
(3)一描画点当りY座標の残差の大きさの判定1回
(4)数個の描画点につき1回の減算
が必要であった。従って、描画すべき点の数の2倍の加算操作、描画点と同数の判定操作、及び描画点数よりは少ないが描画点数に比例した回数の減算操作が必要であった。そのため、計算に多くの時間を要し、描画作業の高速化には限界があった。
【0009】
本発明は、こうした従来の問題点を解決するものであり、高速で直線を描画することができる直線描画装置を提供することを目的としている。
【0010】
【課題を解決するための手段】
そこで、本発明の直線描画装置では、直線の傾きを整数比M1/M0で表現した場合に、M1とM0とをそれぞれ保持する第1及び第2の整数保持手段と、M1とM0とから商数列(即ち、M0をM1で除算したときの商がQ1、余りがM2であるとき、次にM1をM2で除算して、その商Q2と、余りM3とを求め、これを順次繰り返して得られるQ1,Q2,Q3,‥の数列)を計算する商数列計算手段と、この商数列から、隣接する描画点間の格子点上の差異を表す制御数列(即ち、右隣の描画点の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に示すように、直線を描画するための制御数列Cnを簡単な操作で生成することによって、高速な描画を達成するものである。この制御数列は、一つの描画点の左に隣接する描画点が水平方向に存在するときに0、また、左に隣接する描画点が斜め方向に存在するときに1と表現した数列である。図4の直線Lの近似点PnのX座標とY座標とは、制御数列Cnから次のようにして算出することが出来る。即ち、
Xn=Xn−1+1 (2−1)
Yn=Yn−1+Cn−1 (2−2)
上記の式(2−1),(2−2)はCnがゼロであればPnはPn−1の右隣り、Cnが1であればPnはPn−1の右上となることを示している。
【0020】
式(2−1)と(2−2)から明らかなように、予め制御数列が知れていれば、一点を描画するのに2回の加算だけが必要で、判定は不要である。しかも、これらの加算は1または0を加えるという単純な整数演算である。この制御数列Cnは、以下に述べる商数列から生成することができる。
【0021】
1.1 商数数列の定義
制御数列は、別の新たな数列(以下、商数列と呼ぶ)から生成することができる。商数列とは次のようにして求められる数列である。即ち直線Lの傾きをM1/M0とする。但しM1,M0は整数とする。このときまず、
M0=Q1M1+M2, M1>M2>0 (2−3)
を満足する整数Q1、M2を求める。以下
Mn−1=QnMn+Mn+1, Mn>Mn+1>0 (2−4)
を満足する整数Qn、Mnを式(2−5)が成立するまで次々と求める。即ち
MN−1=QNMN (2−5)
となるまで、言い換えれば
MN+1=0 (2−6)
となるまで繰り返す。
【0022】
以上の計算は、Mn−1をMnで割ったときの商と余りをそれぞれQnとMn+1とするものである。以下、このようにして求めた数列Q1,Q2,・・・,QNを商数列Q、数列M0,M1,M2,・・・,MNを除数列Mと呼ぶことにする。即ち、
Q={Q1,Q2,・・・QN} (2−7)
M={M0,M1,M2,・・・MN} (2−8)
である。
【0023】
なお、MN+1=0となるようなNは必ず存在する。即ち、M0、M1から出発して(2−4)の除算を繰り返すと、最後には余りがゼロになる。なぜならば、Mnは正の整数でありMn>Mn+1であるから、nが増加するとともにMnはMn−1に比べて小さくなる。従って、最後には次のどちらかの場合に到達する。即ち、
(ア) MN=1となり、MN+1=0となる。
【0024】
(イ) MN+1≠1で且つ、MNがMN+1で割り切れ、従ってMN+1=0となる。のどちらかである。従ってMN+1=0となるNが必ず存在する。MNはM0とM1との最大公約数であることは、ユークリッドのアルゴリズムから明らかである。
【0025】
1.2 制御数列の定義
1.1で定義した商数列Qから、図2の制御数列Cは次のようにして生成することができる。即ちまず、中間の長さの数列Ca,nとCb,nとを以下のような漸化式で定義する。即ち、
Ca,0={0} (2−9)
Cb,0={1} (2−10)
Ca,n={Cb,n−1&(Qn−1)*Ca,n−1} (2−11)
Cb,n={Ca,n&Ca,n−1} (2−12)
但し、記号&及び*は以下のような意味を持つものとする。即ち、有限の長さの数列α、βに対して
α&βは、数列αの右側に数列βを接続して出来る数列
γ*βは、数列βをγ個繰り返して出来る数列
を意味するものとする。
【0026】
このような数列Ca,nから式(2−9)〜(2−12)によって制御数列Cを求めることができる。即ち、MN+1=0であるとき
C=MN*Ca,N (2−13)
である。式(2−9)〜(2−13)が正しいことは「第3節 数学的証明」の項で後述する。
【0027】
第2節 本発明の直線描画装置の実施の形態とその動作説明
以上の説明から分かるように、制御数列Cnは、商数列、除数列を求める少数回の除算と、(2−9)〜(2−13)に従って1と0とのビット列をコピーする作業とによって求めることができ、本発明の直線描画装置は、こうして得た制御数列から描画点の座標を計算し、格子点上に直線の近似点を描画する。この具体的方法とそれを実施する装置とについて以下に述べる。但し、直線Lの傾きは整数比M1/M0であるものとする。
【0028】
実施形態の直線描画装置は、図1に示すように、直線の傾きを表す2つの整数M0とM1とをそれぞれ保持するレジスタ101、102と、M0とM1とから商数列を計算する商数列計算装置103と、商数列から制御数列を生成する制御数列計算装置104と、制御数列から描画点の座標X、Yを計算する座標計算装置105との5つの部分から構成される。
【0029】
直線の傾きを表す2つの整数を保持するレジスタ101、102の必要な大きさは、直線の傾きの表現精度によって決まってくる。この実施形態では、直線の傾きを整数比M1/M0で表現することとしているため、M1及びM0の大きさの数字を保持できればよい。例えば2000×2000の画素数を持つ表示装置に適用する場合では、これら2つのレジスタ101、102は12ビットあれば十分である。なぜならM1及びM0の最大値は2000であるからである。
【0030】
商数列計算装置103は、図5に示すように、被除数を記憶する被除数レジスタ501と、除数を記憶する除数レジスタ502と、被除数レジスタ501から読出した値を除数レジスタ502で読出した値で除算する除算器505と、除算器505で行なわれた除算の剰余を記憶する剰余レジスタ504と、剰余レジスタ504がゼロであるときにそれを検出して検出信号511を出力するゼロ検出装置506と、商数列を記憶する商数列記憶装置503と、商数列記憶装置503のアドレスを指示するアドレスポインタ507と、入力する二つの信号の一方を選択して出力するセレクタ508、509、516と、この商数列計算装置103の各部の動作を制御する商数列制御装置510とを備えている。
【0031】
この商数列計算装置103は、数値M0とM1とから、図8に示すフローチャートに従って商数列を計算し、商数列記憶装置503に格納する。
【0032】
まず、初期状態では、アドレスポインタ507はゼロを指定する。また、商数列制御装置510は、セレクタ508及び509の入力信号の選択を指示するセレクタ制御信号514としてゼロを設定し、それに応じて、セレクタ508及び509は両方とも左側の入力、即ち、M0とM1とをそれぞれ選択し通過させる。このことを前提に、商数列計算装置は次のように動作する。
【0033】
ステップ801:商数列制御装置510は、信号515によりアドレスポインタ507の内容をゼロに設定し、また、被除数レジスタ501及び除数レジスタ502に対してデータの格納を指示する制御信号512をONにする。それにより、数値M0とM1とが、それぞれ、セレクタ508及び509を経由して、被除数レジスタ501と除数レジスタ502とに格納される。
【0034】
ステップ802:被除数レジスタ501に格納された数値M0と除数レジスタ502に格納された数値M1とは除算器505に入力し、除算器505はM0/M1を計算し、その商、即ちQ1を信号519によりセレクタ516に出力し、余りM2を信号520により剰余レジスタ504に出力する。
この余りM2の出力は剰余レジスタ504に格納される。ゼロ検出器506は、剰余レジスタ504に格納されたM2の内容がゼロであるか否かを調べ、ゼロである場合には検出信号511をONに、ゼロでなければOFFにする。セレクタ516は、検出信号511がOFFのときは、除算器505から出力されたQ1信号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の傾きを有する場合、即ち、M0の値が18、M1の値が7である場合には、描画点は図20に示すように描かれる。この制御数列は{100101001001010010}であり、直線に沿ってこの数列の単位が繰返される。水平格子線上に並ぶ描画点の個数は3の場合と2の場合とがあり、制御数列をこの二種類のブロックの組合せとして、「100」「10」「100」「100」「10」「100」「10」と表すことができる。この「100」のブロックをB1タイプ、「10」のブロックをA1タイプとすると、A1タイプは水平格子線上にQ1(Q1=2)個の描画点が並び、B1タイプはQ1+1個の描画点が並んでいる。つまり、商数列の最初のQ1の値により、A1タイプ及びB1タイプのブロックに含まれる描画点の数が決まってくる。
【0042】
また、制御数列は、このA1及びB1を用いて、B1,A1,B1,B1,A1,B1,A1のブロックの連結として表すことができるが、これはB1の後に続くA1の数が1のブロックと、B1の後に続くA1の数が0のブロックとの組合せ、即ち、「B1A1」「B1」「B1A1」「B1A1」と表すことができる。この「B1A1」をB2タイプ、「B1」をA2タイプとすると、A2タイプはQ2(Q2=1)個のブロックを含み、B2タイプはQ2+1個のブロックを含んでいる。つまり、商数列の次のQ2の値により、A2タイプ及びB2タイプに含まれるブロック数が決まってくる。
【0043】
また、制御数列は、このA2及びB2を用いて、B2,A2,B2,B2のブロックの連結として表すことができるが、これはB2の後に続くA2の数が1のブロックと、B2の後に続くA2の数が0のブロックとの組合せ、即ち、「B2A2」「B2」「B2」と表すことができる。この「B2A2」をB3タイプ、「B2」をA3タイプとすると、A3タイプはQ3(Q3=1)個のブロックを含み、B3タイプはQ3+1個のブロックを含んでいる。つまり、商数列のその次のQ3の値により、A3タイプ及びB3タイプに含まれるブロック数が決まってくる。
【0044】
また、制御数列は、このA3及びB3を用いて、B3,A3,A3のブロックの連結として表すことができるが、これはB3の後にA3が2つ続く1つのブロックである。これをA4タイプとすると、A4タイプはQ4(Q4=3)個のブロックを含んでいる。つまり、商数列のその次のQ4の値により、A4タイプに含まれるブロック数が決まってくる。
【0045】
この段階のA4のように、B4に対応するブロックが存在しない状態は、商数列の算出において剰余が0の状態に相当している。このときA4×M(Mは除数レジスタ502の内容。この具体例の場合M=1)が制御数列となる。
【0046】
さて、制御数列計算装置104の制御数列制御装置605は、商数列とこのような関係にある制御数列を、商数列記憶装置503に格納されている商数列を用いて、制御数列記憶装置601の中に生成する。その手順を図10及び図11に示すフローチャートを用いて説明する。
【0047】
ステップ1001:制御数列制御装置605は、制御数列記憶装置601の第1ワード(即ちアドレス0)に“1”を書き込む。更に商数列ポインタ604の内容を0に設定する。これによりアドレスポインタ604は、商数列記憶装置503の第1番地、即ちQ1が格納されている番地を指示する。
【0048】
ステップ1002:制御数列制御装置605は、アドレスポインタ604の指示するアドレスを読み出し(この場合はアドレス0を読むことになるのでQ1が読み出される)、制御数列記憶装置601の第2ワード(即ちアドレス1)から、今読み出された値の個数だけ、即ち、Q1個だけの語にデータ“0”を書き込む。
【0049】
ステップ1003:次いで、制御数列制御装置605は、アドレスポインタ602に数値Q1−1を、アドレスポインタ603に数値Q1を書込み、
ステップ1004:アドレスポインタ604の内容を1だけ増加する。
【0050】
このときの制御数列記憶装置601の内容とアドレスポインタ602及びアドレスポインタ603のポイント位置とを図12に示している(アドレス0からポインタ602の指し示すアドレスQ1−1までのデータが、先の具体例のA1タイプのデータであり、アドレス0からポインタ603の指し示すアドレスQ1までのデータがB1タイプのデータとなる)。
【0051】
次に、制御数列制御装置605は、図11に示す手順に従って、
ステップ1101:商数列記憶装置503からポインタ604の指示する番地を読出す。この時読み出される値は、これまでに読み出された商数列の次の要素である。この値をQnとする。
【0052】
ステップ1102:制御数列記憶装置601の先頭番地、即ち、0番地からアドレスポインタ602が指示する番地までの内容をQn回繰り返して、アドレスポインタ603の指示する番地の次の番地から始まる領域にコピーする(この操作は、先の具体例において、ブロックBn−1の後にブロックAn−1をQn回繋げてブロックBnを生成することに相当している)。この動作を図示したものが図13である。即ち、ゼロ番地からポインタ602が指示する番地までの内容をCa,nとすると、Ca,nをQn繰り返してアドレスポインタ603の指示する番地の次から始まる領域へコピーする。
【0053】
ステップ1103:アドレスポインタ603には格納最終番地を格納する。即ち、アドレスポインタ603は破線で示した番地を指示することになる(アドレス0からアドレスポインタ603のポイントする番地までのデータが先の具体例におけるブロックBnのデータとなる)。更に、アドレスポインタ603から以前のアドレスポインタ602の内容を減じた値に更に1を減じた値をアドレスポインタ602に格納する。即ち、アドレスポインタ602は図13の破線で示した番地を指示するようになる(アドレス0からアドレスポインタ602のポイントする番地までのデータが先の具体例におけるブロックAnのデータとなる)。この段階で0番地からアドレスポインタ602の指示する番地までの内容がCa,n+1、0番地からアドレスポインタ603の指示する番地までの内容がCb,n+1となっている。この後、アドレスポインタ604の内容を1だけ増加する。
【0054】
ステップ1104:ポインタ604の内容とポインタ507の内容とを比較し、不一致であればステップ1101へ移行する。一致した場合は、
ステップ1105:既に商数列のすべての要素についてステップ1101〜ステップ1103を実行したことになる。従って、式(2−13)を計算する過程に移行する。ポインタ604が指示している番地を読み出す。即ち、MNが読み出される。
【0055】
ステップ1106:制御数列記憶装置601の0番地からアドレスポインタ602の指示する番地にはCa,Nが格納されている。従って、これをMN−1回繰り返してアドレスポインタ602の指示する番地の次の番地から始まる領域に格納する。これにより、MN*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】
以上の動作を具体的数値例を用いて再度説明する。M0とM1の値をそれぞれ18と7であるとして説明する。この場合、商数列Qは以下の計算より式(2−15)のようになる。この商数列は、4回の除算で生成することができる。
【0068】
18=2×7+4 より Q1=2,M1=7,M2=4
7=1×4+3 より Q2=1, M3=3
4=1×3+1 より Q3=1, M4=1
3=3×1+0 より Q4=3, M5=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}
と、その後にM4、即ち数値1が記憶され、商数列記憶装置503の内容は図15のようになり、ポインタ507は最終要素格納番地、即ち4番地を指示した状態になる。以上の過程をまとめると表1のようになる。
【0070】
【0071】
次に、制御数列計算過程の説明に移る。図15のように、商数列Qと除数列Mの最終要素MNとが商数列記憶装置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が実行されるが、M4の値は1であるのでステップ1106は0回繰り返される。従って、制御数列記憶装置601の0番地からポインタ602の指示する17番地までの内容が求める制御数列となり、ここで終了する。以上の過程をまとめると表2のようになる。
【0075】
【0076】
次に、この結果に基づいて、座標計算装置105の動作を説明する。説明を簡単にするため(X,Y)の初期値は(0,0)とする。一般には最初の描画点Pn(X0,Y0)である場合には初期値を(X0−1,Y0−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】
以上のとおり、制御数列が求まると、描画点の座標の計算には加算のみが必要であり、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の傾きをM1/M0(M1、M0は整数)とする。そしてM1、M0に対して、式(2−3)〜(2−6)が成立しているものとする。図21のように、直線Lを近似する描画点Piが同一水平格子線上に並ぶ個数をK1とすると
K1=Q1 (3−1)
または
K1=Q1+1 (3−2)
である。式(3−1)及び(3−2)の証明は後の<証明1>に述べる。図22のように、描画点が水平にQ1+1個並んだものをまとめてB1タイプのブロックとし、図23のように、描画点が水平にQ1個並んだものをまとめてA1タイプのブロックと呼ぶことにする。すると、直線Lを近似する描画点の集合は、図24のようにA1とB1の2種類のブロックを連結したものになる。このようにK1が1だけ異なる2つの値を取り得るのは、式(2−4)において、
M2≠0
の場合である。言い換えれば、M0がM1で割り切れれば、K1はQ1の値だけを取る。
【0083】
図24のように、B1タイプのブロックから数えて次のB1タイプのブロックが出現するまでのブロックの個数をK2とする。言い換えればA1タイプのブロックが連続する個数をK2−1とすると
K2=Q2 (3−3)
または
K2=Q2+1 (3−4)
である。式(3−3)及び(3−4)の証明は<証明2>に示す。
【0084】
従って、タイプB1のブロックの次にタイプA1のブロックがQ2個続く場合と、Q2−1個続く場合とが存在する。図25のように前者をブロックB2、後者をブロックA2と呼ぶことにする。更に、タイプB2のブロックから数えて次のタイプB2のブロックが出現するまでのブロック数をK3とすると、同様に
K3=Q3 (3−5)
または
K3=Q3+1 (3−6)
である。このことの証明は<証明3>に述べる。
【0085】
一般に図26のように、ブロックBmから次のブロックBmまでのブロック数をKm+1とすると、
Km+1=Qm+1 (3−7)
または
Km+1=Qm+1+1 (3−8)
である。このことを更に厳密に表現すると以下のようになる。即ち、一般に、ある直線Lに対して垂直格子線上で最も近い格子点列を次の条件を満たす2つの集合AmとBmとに分けることができる。そして、これらのAmとBmとは、式(2−4)の集合Qの要素である整数Qmに対して次の関係を持つ。
【0086】
Am=Bm−1&(Qm−1)*Am−1 (3−9)
Bm=Bm−1&Qm*Am−1 (3−10)
但し、X&Yは集合Xの右に集合Yを接続したものを意味し、α*Yは集合Yをα個接続したものを意味する。このことの証明は<証明4>に述べる。
【0087】
このようにKmが1だけ異なる2つの値を取るのは、式(2−4)のMm+1≠0であるからである。このようなプロセスをn=Nとなるまで続けることができる。n=Nとなると式(2−4)の余りはゼロ、即ち
MN+1=0
であるから以後、描画点はブロックANだけの繰り返しとなる。
【0088】
図26から分かるように、ブロックAnはブロックBn−1のうしろにQn−1個のブロックAn−1を接続したものであり、ブロックBnはこれにもう一つブロックAn−1を接続したものである。従って、ブロックAnとBnの制御数列をそれぞれCa,n,Cb,nとすると
Ca,n=Cb,n−1&(Qn−1)*Ca,n−1
Cb,n=Ca,n&Ca,n−1
即ち、式(2−11)、(2−12)を得ることができる。MNはM0とM1との最大公約数であるからn=Nの以後はANの繰り返しとなり、式(2−13)を得る。
【0089】
<証明1>
図21のように直線Lを近似する描画点Pi〜Pjが、同一水平線上に並ぶ個数をK1とする。直線の傾きは整数比M1/M0とする。簡単のため格子間隔は1とする。真の点、即ち、直線Lと垂直の格子線と交点をTi〜Tjとする。垂直方向でTiに最も近い点、即ち描画点をPiとする。真の点TiのY座標から描画点PiのY座標の値を引いたものをRiとし、これを点Piの残差と呼ぶことにする。点PiからPjまでが水平格子線H1の上にあり、点Pi−1はH0上に、点Pj+1はH2上にあるとする。真の点Tiと描画点Piとの位置の差Riは、
−1/2≦Ri<1/2 (4−1)
である。直線の傾きはM1/M0であるから、TiのY座標はTi−1のY座標よりM1/M0だけ大きい。Ti−1は一本下の水平格子線H0の方に近い。従ってPiのY座標はPi−1のY座標よりも1だけ大きい。このことから(4−1)より更に強い条件を導くことができる。即ち
Ri=Ri−1+(M1/M0)−1 (4−2)
であるから、(4−2)を(4−1)に代入して
1/2−M1/M0<Ri−1 (4−3)
となる。結局、右隣の描画点が一本上の格子線上に存在する描画点Pi−1について
1/2−M1/M0≦Ri−1<1/2 (4−4)
の関係が成立する。このことはPjについても成立するから
1/2−M1/M0≦Rj<1/2 (4−5)
またPi−1からPjまでの距離はK1であるから
Rj=Ri−1+K1(M1/M0)−1 (4−6)
であるから、式(4−4)、(4−5)、(4−6)よりRi−1、Rjを消去すると
M0/M1−1<K1<M0/M1+1 (4−7)
となる。ここでM0=Q1M1+M2であるから
Q1+(M2/M1)−1<K1<Q1+(M2/M1)+1 (4−8)
である。K1は整数であり、0<M2/M1<1であるから
K1=Q1
または
K1=Q1+1
である。証明終わり。
【0090】
<証明2>
図22のように、B1タイプのブロックの左端の描画点の更に左の描画点PB1Lの残差(以下、B1の左残差と呼ぶ)をRB1Lとする。また、B1の右端の描画点PB1Rの残差をRB1Rとする。PB1L、PB1Rの両方ともその右隣の描画点は一本上の水平格子線上に存在する。従って式(4−4)から
1/2−M1/M0≦RB1L<1/2 (5−1)
1/2−M1/M0≦RB1R<1/2 (5−2)
また、
△B1=RB1R−RB1L (5−3)
とすると、△B1はタイプB1のブロックが引き起こす残差の変化分である。タイプB1のブロックは、Q1+1個の水平描画点を持つから1点につきM1/M0だけ残差は増加する。また、PB1RはPB1Lより1本上の格子線上にあるから、残差は1だけ減じられる。従って
△B1=(Q1+1)M1/M0−1=(M1−M2)/M0 (5−4)
となる。
【0091】
また、同様に、A1タイプの左残差をRA1R、このブロックの右に隣接するブロックの左残差をRA1R、A1タイプのブロックが引き起こす残差の変化分を△A1とすると
1/2−M1/M0≦RA1L<1/2 (5−5)
1/2−M1/M0≦RA1R<1/2 (5−6)
△A1=RA1R−RA1L (5−7)
△A1=Q1M1/M0−1=−M2/M0 (5−8)
となる。式(5−1)、(5−2)、(5−3)、(5−4)からRB1R、△B1を消去すると
1/2−M1/M0≦RB1L<1/2−(M1−M2)/M0 (5−9)
また、式(5−5)、(5−6)、(5−7)、(5−8)からRA1R、△A1を消去すると
1/2−(M1−M2)/M0≦RA1L<1/2 (5−10)
となる。
【0092】
図24の第1番目のB1タイプのブロック241から、次のB1タイプのブロック244の直前までのブロック数をK2とする。ブロック241はB1タイプであるからその左残差は
1/2−M1/M0≦RB1L<1/2−(M1−M2)/M0 (5−11)
である。ブロック244もタイプB1であるから、このブロックの左残差をRB1Nとすると
1/2−M1/M0≦RB1N<1/2−(M1−M2)/M0」 (5−12)
である。A1タイプの並ぶ個数はK2−1個であるから
RB1N=RB1L+△B1+(K2−1)△A1 (5−13)
となる。式(5−4)、(5−8)、(5−13)より
RB1N=RB1L+(M1−M2)/M0−(K2−1)M2/M0 (5−14)
であるから、(5−11)、(5−12)、(5−14)より
(M1/M2)−1<K2<(M1/M2)+1 (5−15)
である。式(2−4)に従って
M1=Q2M2+M3
だから
Q2+(M3/M2)−1<K2<Q2+(M3/M2)+1 (5−16)
となる。ここで0<M3/M2<1でK2は整数だから
K2=Q2
または
K2=Q2+1
である。証明終り。
【0093】
<証明3>
図25の251及び254のように、B1タイプのブロックの次にA1タイプのブロックがQ2個連続するものをB2タイプのブロック、Q2−1個連続するものをA2タイプのブロックとする。任意のB2タイプのブロックからその右方に存在するB2タイプのブロックの直前までのブロック数をK3個とする。B2タイプのブロック251の左残差をRB2L、A2タイプのブロック252の左残差をRA2Lとする。これらはそれぞれ左端にB1タイプのブロックが在るからB1タイプの左残差を持ち、式(5−9)より
1/2−M1/M0≦RB2L<1/2−(M1−M2)/M0 (6−1)
1/2−M1/M0≦RA2L<1/2−(M1−M2)/M0 (6−2)
となる。ブロック251にはB1タイプのブロックが1個、A1タイプのブロックがQ2個並んでいるから
△B2=RA2L−RB2L=△B1+Q2△A1 (6−3)
となる。ブロック253の左残差をRA2Nとすると
△A2=RA2N−RA2L=△B1+(Q2−1)△A1 (6−4)
となる。式(6−3)、(6−4)の△A1、△B1に(5−4)、(5−8)を代入すると
△A2=M3/M0 (6−5)
△B2=−(M2−M3)/M0 (6−6)
となる。式(6−1)、(6−2)、(6−3)、(6−6)より
1/2−(M1−M2+M3)/M0≦RB2L<1/2−(M1−M2)/M0 (6−7)
を得る。ブロック254の左残差をRB2Nとすると、RB2Nも式(6−7)を満足しなければならないから
1/2−(M1−M2+M3)/M0≦RB2N<1/2−(M1−M2)/M0 (6−8)
となる。ブロック251から次のB2タイプのブロック254までには、A2タイプのブロックがK3−1個存在するから
RB2N=RB2L+△B2+(K3−1)△A2 (6−9)
であり、式(6−7)、(6−8)、(6−9)より
−M3/M0<△B2+(K3−1)△A2<M3/M0 (6−10)
を得る。△A2>0、△B2<0であることを考慮して、式(6−5)、(6−6)、(6−10)から△A2、△B2を消去すると
Q3+M4/M3−1<K3<Q3+M4/M3+1 (6−11)
0<M4/M3<1で、K3は整数だから
K3=Q3
または
K3=Q3+1
である。証明終り。
【0094】
<証明4>
一般式を数学的帰納法によって証明する。即ち、式(7−1)〜(7−6)が成立しているものとして、式(7−7)〜(7−12)を導出する。
【0095】
An=Bn−1&(Qn−1)*An−1 (7−1)
Bn=Bn−1&Qn*An−1 (7−2)
Wa,n−1<Ra,n−1<Ua,n−1 (7−3)
Wb,n−1<Rb,n−1<Ub,n−1 (7−4)
△An−1=(Sn−1−Sn)/M0 (7−5)
△Bn−1=(Sn−2−Sn)/M0 (7−6)
An+1=Bn&(Qn+1−1)*A (7−7)
Bn+1=Bn&Qn+1*An (7−8)
Wa,n<Ra,n<Ua,n (7−9)
Wb,n<Rb,n<Ub,n (7−10)
△An=(Sn−Sn+1)/M0 (7−11)
△Bn=(Sn−1−Sn+1)/M0 (7−12)
但し、Ua,n、Ub,n、Wa,n、Wb,nはnが奇数の場合と偶数の場合とで、それぞれ以下の値を取る。即ち、
nが奇数の場合
Ua,n=−1/2+Sn−1/M0 (7−13)
Ub,n=Wa,n=−1/2+Sn+1/M0 (7−14)
Wb,n=−1/2+Sn/M0 (7−15)
nが偶数の場合
Ua,n=Wb,n=−1/2+Sn+1/M0 (7−16)
Ub,n=−1/2+Sn/M0 (7−17)
Wa,n=−1/2+Sn−1/M0 (7−18)
である。また、
Sn=M0−M1+M2+…+(−1)nMn (7−19)
である。また、式(7−19)におけるM1,M2,‥,Mnは式(2−8)の除数列の要素である。
【0096】
式(7−3)におけるRa,n−1は図26のタイプAn−1のブロック2602の最左端の描画点の左残差である。また、式(7−4)におけるRb,n−1はタイプBn−1の最左端の描画点の左残差である。また、△An−1はタイプAn−1のブロックの残差の増分である。即ち、ブロック2603の最左端の描画点の左残差からブロック2602の最左端の描画点の左残差を差し引いた値である。△Bn−1はタイプBnの残差の増分である。即ち、ブロック2602の最左端の描画点の左残差Ra,n−1から、ブロック2601の最左端の描画点の左残差Rb,n−1を差し引いた値である。
【0097】
式(7−1)、(7−2)は、次のことを意味している。即ち、
(1)垂直方向で最も直線に近い描画点群は、図26のようにタイプAn−1とタイプBn−1の2種類の形状のブロックに分けることができる。
(2)これらのブロックの連鎖はタイプBn−1の右にQn−1個のタイプAn−1のブロックが接続する場合と、タイプBn−1の右にQn個のタイプAn−1のブロックが接続する場合とが存在する。また、この場合だけが存在する。前者をタイプAn、後者をタイプBnとする。
【0098】
上記(1)と(2)及び式(7−3)〜(7−6)を前提として、式(7−7)〜(7−12)を導出する。まず(1)、(2)より
△An=△Bn−1+(Qn−1)△An−1 (7−20)
△Bn=△Bn−1+Qn△An−1=△An+△An−1 (7−21)
である。これに(7−5)、(7−6)を代入すると
以上から(7−11)、(7−12)が導出された。
【0099】
図26において、ブロック2605の左残差をRb,n、ブロック2607のそれをRa,nとする。Rb,nはブロック2601の左残差の条件を満たさなければならないから、
Wb,n−1<Rb,n<Ub,n−1 (7−22)
更にRb,n+△Bnはブロック2606の左残差を満たさなければならないから、
Wb,n−1<Rb,n+△Bn<Ub,n−1 (7−23)
また、Ra,nはブロック2606の左残差を満たさねばならないから
Wb,n−1<Ra,n<Ub,n−1 (7−24)
また、Ra,n+△Anはブロック2611の左残差の条件を満たさねばならないから、
Wb,n−1<Ra,n+△An<Ub,n−1 (7−25)
である。
【0100】
以上をもとに(7−22)〜(7−25)より(7−9)〜(7−10)を導出するが、nが奇数の場合と偶数の場合に分けて導出する。まず、nが奇数の場合、(7−11)、(7−12)、(7−19)より
である。従って(2−4)から
△An<0
△Bn<0
である。従って(7−22)、(7−23)、(7−24)、(7−25)より
Wb,n−1<Rb,n<Ub,n−1−△Bn (7−26)
Wb,n−1−△An<Ra,n<Ub,n−1 (7−27)
を得る。nは奇数だから、n−1は偶数である、(7−16)、(7−17)、(7−18)より
従って
−1/2+Sn/M0<Rb,n<−1/2+Sn+1/M0 (7−28)
また、(7−16)、(7−17)より
Wb,n−1−△An=−1/2+Sn/M0−(Sn−Sn+1)/M0
=−1/2+Sn+1/M0
Ub,n−1=−1/2+Sn−1/M0
従って
−1/2+Sn+1/M0<Ra,n<−1/2+Sn−1/M0 (7−29)
以上から
Ub,n=−1/2+Sn+1/M0
Wb,n=−1/2+Sn/M0
Ua,n=−1/2+Sn−1/M0
Wa,n=−1/2+Sn+1/M0
よって(7−13)、(7−14)、(7−15)が導出された。
【0101】
次にnが偶数の場合は
である。nは偶数だから
△An>0
△Bn<0
である。従って(7−22)、(7−23)、(7−24)、(7−25)より
Wb,n−1−△Bn<Rb,n<Ub,n−1
Wb,n−1<Ra,n<Ub,n−1−△An
を得る。nは偶数だからn−1は奇数であり、(7−14)、(7−15)より
従って
−1/2+Sn+1/M0<Rb,n<−1/2+Sn/M0
または(7−13)、(7−14)より
従って
−1/2+Sn+1/M0<Ra,n<−1/2+Sn−1/M0
以上から
Ub,n=−1/2+Sn/M0
Wb,n=−1/2+Sn+1/M0
Ua,n=−1/2+Sn+1/M0
Wa,n=−1/2+Sn−1/M0
よって(7−16)、(7−17)、(7−18)が導出された。
【0102】
以上から、nが奇数の場合、偶数の場合とも式(7−9)、(7−10)が導出されたことになる。
【0103】
次に式(7−7)、(7−8)を導出する。図26のようにタイプAnのブロックとタイプBnのブロックとに描画点群は分けられると仮定して、2つのタイプBnのブロック2605と2610との間にKn+1−1個のタイプAnのブロックが存在したとする。ブロック2605と2610とは両方ともタイプBnであるから、
Wb,n<Rb,n<Ub,n (7−10)
Wb,n<Rb,n+△Bn+(Kn+1−1)△An<Ub,n (7−30)
を満たす。
【0104】
−Ub,n<−Rb,n<−Wb,n (7−31)
であるから、式(7−30)、(7−31)の両辺を加算しRb,nを消去すると
−(Ub,n−Wb,n)<△Bn+(Kn+1−1)△An<Ub,n−Wb,n (7−32)
を得る。(7−11)、(7−12)より
△Bn−△An=−(−1)nMn/M0 (7−33)
また、式(7−13)、(7−14)、(7−17)、(7−18)より、nが奇数の場合も偶数の場合も
Ub,n−Wb,n=Mn+1/M0 (7−34)
である。(7−32)、(7−33)、(7−34)より
−{Mn+1−(−1)nMn}/M0<Kn+1×△An<{Mn+1+(−1)nMn}/M0 (7−35)
nが奇数の場合も偶数の場合も
Mn/Mn+1−1<Kn+1<Mn/Mn+1+1 (7−36)
となる。(2−4)より
Qn+1+Mn+2/Mn+1−1<Kn+1<Qn+1+Mn+2/Mn+1+1
0<Mn+2/Mn+1<1でかつKn+1は整数だから
Kn+1=Qn+1
または
Kn+1=Qn+1+1
である。
【0105】
以上から、Bnの右にAnがQn+1−1個接続される場合と、Bnの右にAnがQn+1個接続される場合とが存在することが分かる。前者をAn+1、後者をBn+1とすれば、式(7−7)、(7−8)が導出されたことになる。従って、タイプAn−1のブロックとタイプBn−1のブロックとが接続されてできる連鎖は、次の2つのブロックの連鎖に分けることができる。即ち、
タイプAnのブロック:1個のタイプBn−1のブロックにQn−1個のタイプAn−1のブロックが接続されたブロック
タイプBnのブロック:1個のタイプBn−1のブロックにQn個のタイプAn−1のブロックが接続されたブロック
の2つである。n=1及びn=2の場合は、それぞれ<証明1>及び<証明2>によって成立している。従って、数学的帰納法により1からNまでのすべてのnについて、(7−7)〜(7−19)が成立する。証明終り。
【0106】
本発明の直線描画装置は、描画点の座標を高速に計算できる。直線の傾きを整数比、即ちM1/M0とすると、以下の作業で描画点の座標を計算できる。
【0107】
(ア)M1とM0とから商数列を計算する。
【0108】
(イ)商数列から制御数列を計算する。
【0109】
(ウ)制御数列をもとに一描画点あたり、2回の加算で座標を生成する。
【0110】
上記(ア)(イ)の演算操作は、描画点の数に比例しない。直線の傾きM1/M0だけから少数回の演算で実行できる。従って描画点の個数が多くなればなるほど効果がある。また、(ア)(イ)の演算操作は、描画の開始前に実行を済ませておくことができる。従って描画中には(ウ)の演算操作だけを行なえばよく、高速な描画が可能である。(ウ)の演算は“1”または“0”を加算する演算であるから、この部分を簡単なハードウエアで実現することも可能である。これに対して従来の方法、例えば図3のような例では描画と同時に座標計算のための数値演算と条件判定とを行なわなければならなかった。本発明はこのような欠点を克服するものである。
【0111】
更に(イ)で生成される制御数列は最小周期の情報であるから、描画点の数が多くても繰り返し利用することができる。加えて、Bresenhamのアルゴリズム同様、丸め誤差が積算することはなく、描画点数によらず正確な描画が出来る。即ち、本発明の装置によって生成される描画点はBresenhamのアルゴリズムによって生成されるものと同一になる。
【0112】
また、本装置の描画方法では、水平に並ぶ描画点の数を簡単な計算で予め算出することが出来る。従って、描画中に次に描画すべき点の座標を算出する必要はなく、描画以前にすべての点を算出するデータを得ることができる。もちろん描画と並列して描画点を算出することも可能である。描画中に判定操作も減算操作も不要である。従って、従来の方式に比べて大幅に描画時間を短縮できる。
【0113】
(実施の形態2)
第2の実施形態の直線描画装置は、図27に示すように、除算の代わりに減算を行なって制御数列を生成する統合計算装置271を備えており、座標計算装置272は、この統合計算装置271の生成した制御数列に基づいて直線を描画する。
【0114】
この装置の利点は
(1)除算器を必要としない。
(2)商数列記憶装置を必要としない。
の2点にある。
【0115】
この統合計算装置271は、28図に示すように、M1の値を保持するレジスタ102と、M0の値を保持するレジスタ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をQ1回実行した後、ルート2を1回実行する。この後、ルート3をQm回実行した後、ルート2を1回実行するということをm=2〜Nまで実行し、最後にルート4を1回実行する。
【0120】
<初期状態設定>
ステップ2901:まず、統合制御装置2804は、セレクタ2817に対して一番左の入力信号を選択するための信号2718を、また、セレクタ2808に対して一番右の入力信号を選択するための信号を出力し、また、減数レジスタ2806及び残余レジスタ2805に対して入力データの格納を指示する信号2815を出力する。これを受けて減数レジスタ2806はセレクタ2817から出力されたM1の値を格納し、また、残余レジスタ2805はセレクタ2808から出力されたM0の値を格納する。また、統合制御装置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】
このルートがQ1回実行される。なぜなら、M0からM1を減ずることを、結果が負になる直前まで実行するからである。このQ1は式(2−7)におけるQ1と同じである。Q1回実行後の制御数列記憶装置2801の内容は図12と同一となる(但し、Paはアドレス0を指している)。
【0124】
Q1回の上記減算の実行の後では、残余レジスタ2805の内容の方が減数レジスタ2806の内容より小さくなっている。従って、減算器2807の出力2810はONとなり減算結果が負になることが表示される。統合制御装置2804は、この信号を検出しステップ2903から分岐しルート2を辿る。
【0125】
<ルート2>
ステップ2910:減算器2807の出力2810がONとなると、セレクタ2808は中側の入力、即ち、減数レジスタ2806の内容を通過させる。従って、残余レジスタ2805には、それまで減数レジスタ2806に保持されていた内容M1が格納される。また、統合制御装置2804は、これ以上減算をすると結果が負になるという場合に、セレクタ2817に対して最も右の入力を選択するように指示し、その結果、減数レジスタ2806には、それまでの残余レジスタ2805の内容が格納される。従って減数レジスタ2806にはM0−Q1M1、即ち、M2が格納される。
【0126】
ステップ2911:信号2810がONになると、統合制御装置2804はPa2802及びPb2803の値を読み出し、Pb−Pa−1の演算を行ない、その結果をPa2802に格納する。これによりPa2802は図12の位置を指示する状態に移る。
【0127】
<ルート3>
ルート2を通過した後、ルート3を通過する。このルートでは、ステップ2902、ステップ2903、ステップ2904はルート1と同一であり、残余レジスタ2805の内容から減数レジスタ2806に保持された値M2が減算され、減算値が残余レジスタ2805に格納される。
【0128】
ステップ2905:Pa2802がゼロではないので、ステップ2908に移行し、
ステップ2908:統合制御装置2804は、制御数列記憶装置2801とデータの送受を行ないながら、制御数列記憶装置2801の0番地からPa2802の指示する番地までの内容を、Pb2803の指示する番地の次の番地から始まる領域にコピーする。
【0129】
ステップ2909:次いで、このコピー操作の格納最終番地をPb2803が指示するように設定する。
【0130】
この後、ステップ2902に戻り、同じ手順を繰り返す。この繰り返しをQ2回行ない、残余レジスタ2805の値が減数レジスタ2806の値M2より小さくなると、ルート2を通過し、減数レジスタ2806に保持されていた値M2を残余レジスタ2805に格納し、それまでの残余レジスタ2805の格納値M1−Q2・M2、即ちM3を減数レジスタ2806に格納する。その後、さらにルート3を繰り返す。
【0131】
第2回目以降のルート2の通過により、残余レジスタ2805にはMmが格納され、減数レジスタ2806にはMm+1が格納される。従って、その後のルート3は、残余レジスタ2805、減数レジスタ2806にそれぞれMm、Mm+1が格納されている状態で始まり、残余レジスタ2805の内容が減数レジスタ2806の値で減算され、減算値が負になる直前まで繰り返され、残余レジスタ2805にMm−Qm+1・Mm+1が、減数レジスタ2806にMm+1が格納された状態で終える。その後のルート2の通過により、残余レジスタ2805にMm+1が、減数レジスタ2806にMm−Qm+1・Mm+1、即ちMm+2が格納される。
【0132】
このルートをQm回繰り返して実行すると、ステップ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でないということは、MN≠1で且つMN+1=0であるということであるから、式(2−13)の計算を行なう。そのためには、ルート3をMN回通過すれば良い。そこで、残余レジスタ2805には減数レジスタ2806の内容、即ち、MNを、また、減数レジスタ2806には“1”を設定する。
【0136】
次いで、ルート3の通過を繰り返す。ルート3を1回通過するごとに、MNから1が減算され、MN回の通過が終了した時点で残余レジスタ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及び第2の整数をそれぞれ保持する第1及び第2の整数保持手段と、
前記第1及び第2の整数保持手段に保持された2つの整数による除算で商と余りとを求め、次に、先行する除算の除数を被除数とし、余りを除数とする除算を繰り返して各除算の商から成る商数列を計算する商数列計算手段と、
前記商数列から、隣接する描画点間の格子点上の差異を表す制御数列を計算する制御数列計算手段と、
前記制御数列から描画点の座標を計算する座標計算手段と
を備え、前記商数列計算手段は、前記商数列を求める際、除算の結果の余りが生じた場合、除算の余りが0になるまで計算を繰り返すことを特徴とする直線描画装置。 - 前記商数列計算手段が、被除数を保持する被除数保持手段と、除数を保持する除数保持手段と、前記被除数保持手段に保持された被除数を前記除数保持手段に保持された除数で除算する除算手段と、前記除算における商を保持する商数列保持手段と、前記除算における余りを保持する余り保持手段と、前記余り保持手段の内容がゼロであることを検出するゼロ検出手段とを具備し、前記被除数保持手段及び除数保持手段が最初にそれぞれ前記第1の整数及び第2の整数を保持し、前記除算手段の除算が行なわれた後、前記除数保持手段の内容を前記被除数保持手段に転送し、前記余り保持手段の内容を前記除数手段に転送して、前記除算手段の次の除算を行ない、これを前記余り保持手段の内容がゼロとなるまで繰り返すことを特徴とする請求項1に記載の直線描画装置。
- 前記制御数列計算手段が、生成された制御数列を記憶する制御数列記憶手段と、前記制御数列記憶手段の第1のアドレスを保持する第1のポインタと、前記制御数列記憶手段の第2のアドレスを保持する第2のポインタと、商数列を記憶する商数列記憶手段とを具備し、前記制御数列記憶手段の0番地から前記第1のポインタの指示する番地までの内容を複製の単位として、前記商数列記憶手段から読出した商数列要素の値の回数だけ複製して、前記制御数列記憶手段の前記第2のポインタが指示する番地の次の番地から始まる領域に格納し、前記第2のポインタの保持するアドレスを前記格納後の最終番地に変更し、前記第1のポインタの保持するアドレスを、次の複製の単位となる番地に変更し、この動作を、前記商数列記憶手段に記憶された商数列要素について1回ずつ繰り返すことを特徴とする請求項1に記載の直線描画装置。
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)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| KR100435258B1 (ko) * | 1997-09-03 | 2004-07-16 | 삼성전자주식회사 | 컴퓨터 그래픽의 3차원 직선 그리는 방법 |
-
1995
- 1995-12-07 JP JP34472595A patent/JP3552823B2/ja not_active Expired - Fee Related
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 |
