JP3548867B2 - 画像変形方法およびその装置 - Google Patents

画像変形方法およびその装置 Download PDF

Info

Publication number
JP3548867B2
JP3548867B2 JP34752793A JP34752793A JP3548867B2 JP 3548867 B2 JP3548867 B2 JP 3548867B2 JP 34752793 A JP34752793 A JP 34752793A JP 34752793 A JP34752793 A JP 34752793A JP 3548867 B2 JP3548867 B2 JP 3548867B2
Authority
JP
Japan
Prior art keywords
small
deformation
line
grid point
point
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
JP34752793A
Other languages
English (en)
Other versions
JPH07192121A (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.)
Casio Computer Co Ltd
Original Assignee
Casio Computer 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 Casio Computer Co Ltd filed Critical Casio Computer Co Ltd
Priority to JP34752793A priority Critical patent/JP3548867B2/ja
Publication of JPH07192121A publication Critical patent/JPH07192121A/ja
Application granted granted Critical
Publication of JP3548867B2 publication Critical patent/JP3548867B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Landscapes

  • Processing Or Creating Images (AREA)
  • Image Processing (AREA)
  • Image Generation (AREA)
  • Studio Circuits (AREA)
  • Controls And Circuits For Display Device (AREA)

Description

【0001】
【産業上の利用分野】
本発明は、画像変形方法およびその装置に係わり、詳しくはアニメーション、ゲーム等で用いられるキャラクター、背景データを始めとするドットで構成され、かつ各ドット毎に表示色番号あるいはパレット番号を持つようないわゆるビット配列形式の画像データの配列を変更することにより、画像を変形する画像変形方法およびその方法を実現する装置に関する。
【0002】
【従来の技術】
従来、アニメーション、ゲーム等ではビット配列形式の画像データを用いることが多く、この画像データによりキャラクターや背景データを表示している。そして、このビット配列形式の画像データはドットで構成され、かつ各ドット毎に表示色番号あるいはパレット番号を持つようになっている。
【0003】
【発明が解決しようとする課題】
ところで、従来の画像変形方法において、アニメーション、ゲーム等でキャラクター又は背景に動きを与えたり、その形を変えるときには、全く異なる画像データを予めメモリに持っておき、例えば動きを与えるときには一定時間毎に、あるいはその形を変えるときには何かのきっかけでメモリ上にある画像データそのものを表示し直していた。そのため、多くのメモリを消費するという欠点があった。
また、画像の拡大、縮小処理あるいはある形状の四角形から異なる形状の四角形への変形(例えば、正方形から台形への変形)等の単純な変形処理は、従来のゲーム中にも多く用いられているが、変形の度合いが限られ、滑らかな変形が困難であった。さらに、変形を使用する範囲が限定されてしまい(自由に変形できない)、予めメモリに多くのデータを持っておく方法を採らざるを得ず、この点でコスト高にもなっていた。
【0004】
そこで本発明は、少ないメモリ容量で、ビット配列形式の画像を自由にかつ滑らかに変形できる画像変形方法およびその装置を提供することを目的としている。
【0005】
【課題を解決するための手段】
上記目的達成のため、請求項1記載の発明による画像変形方法は、ビット配列形式の画像データを有する変形対象を、複数の小多角形に分割し、
この各小多角形を所定の変形処理に従って異なる小多角形に変形し、
変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って、変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データを作成するとともに、前記小多角形の変形処理では、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することを特徴とする。
請求項2記載の発明による画像変形方法は、前記小多角形の変形処理では、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記複数個の小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記複数個の小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することを特徴とする。
【0009】
請求項記載の画像変形装置は、ビット配列形式の画像データを有する変形対象を、複数の小多角形に分割する分割手段と、
変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して分割手段によって分割した各小多角形を異なる小多角形に変形する変形手段と、
変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って、変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データを作成する画像データ作成手段と、を備えたことを特徴とする。
請求項記載の画像変形装置は、前記変形手段は、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに任意の位置にそれぞれ移動させるように、分割した各小多角形を異なる小多角形に変形することを特徴とする。
【0014】
【作用】
本発明では、まずビット配列形式の画像データを有する変形対象を複数の小多角形に分割し、各小多角形を所定の変形処理(例えば、座標変換処理)に従って異なる小多角形にそれぞれ変形する。このとき、小多角形の変形処理では、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに変換対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を移動させ(例えば、変形対象全体が滑らかに変形されるように他の小多角形の頂点を移動させ)、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することが行われる。
次いで、変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データが作成される。
【0015】
したがって、変形対象の画像は各小多角形毎に変形処理が行われるから、従来のように全く異なる全体の画像データを予め持つ必要がなくなり、少ないメモリ容量で、ビット配列形式の画像データの配列を自由に変更できる。
また、変形対象を複数の小多角形に分割し、各小多角形毎に変形処理が行われるので、変形に自由度があり、予めメモリに多くのデータを持たなくても、画像を滑らかに変形できる。
特に、変形対象の内部の任意の範囲に含まれる小多角形の頂点を移動させる変形法を使用することにより、変形後のすべての小多角形の頂点の位置データ(例えば、座標)を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。さらに、この変形法を用いると、変形対象の外枠の形を変えずに、また変形対象の指定した範囲に含まれる小多角形は変形されずに、任意の場所に移動でき、その他の小多角形のみを変形できるので、画像の外形(例えば、大きさ)および画像データの一部分を変えずに、その場所を移動したいという場合に有効である。
【0016】
他の請求項記載の発明では、小多角形の変形処理で、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することが行われる。
したがって、特に、変形対象の内部の任意の範囲にある複数個の小多角形の頂点を移動させる変形法を使用することにより、同様に変形後のすべての小多角形の頂点の位置データ(例えば、座標)を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。
【0017】
【実施例】
以下、図面を参照して本発明の実施例について説明する。
本発明の原理説明
最初に、本発明の原理から説明する。図1は多角形分割変形方法の原理を示す図である。図1(a)は変形前の画像データを有する変形対象を示し、この変形対象の画像データはビット配列形式であり、「目」の画像(絵)Aを表している。この画像データを変形するために、まず変形対象全体を予め縦4分割、横6分割して合計で24個の小矩形(1)、(2)、(3)、・・・・・(24)を作成する。このとき、各小矩形(1)、(2)、(3)、・・・・・(24)の画像データは複数のドットによって構成され、かつ複数の各ドット毎に表示色番号あるいはパレット番号を持っている。そして、各小矩形(1)、(2)、(3)、・・・・・(24)毎の画像はそのドット全体によって表示される。
次いで、変形対象全体が滑らかに変形されるように、所定の変形処理(例えば、後述の座標変換処理)に従って各小矩形(1)、(2)、(3)、・・・・・(24)を図1(b)に示すような異なる四角形(1)’、(2)’、(3)’、・・・・・(24)’にそれぞれ変形する。例えば、図2に示すように小矩形(6)は四角形(6)’に変形され、小矩形(1)は四角形(1)’に変形される。
【0018】
この過程では、各小矩形(1)、(2)、(3)、・・・・・(24)の変形に伴って、それぞれの小矩形に含まれるビット配列形式の画像データの配列が所定のデータ変換処理(例えば、後述のいわゆるライン貼り付け処理)に従って変形する。すなわち、ドットの配列が変形の程度に応じて変わることになる。したがって、変形後の四角形(1)’、(2)’、(3)’、・・・・・(24)’を全体として合成すると、図1(b)に示すように、変形した「目」の画像(絵)Bが得られる。
この場合、変形対象の画像データの配列に対して各小矩形(1)、(2)、(3)、・・・・・(24)毎に変形処理が行われるから、従来のように全く異なる全体の画像データを予め持つ必要がなく、少ないメモリ容量でビット配列形式の画像を自由に変形できる。また、変形対象を複数の小矩形(1)、(2)、(3)、・・・・・(24)に分割し、各小矩形(1)、(2)、(3)、・・・・・(24)毎に変形処理が行われるので、変形に自由度があり、予めメモリに多くのデータを持たなくても、画像を滑らかに変形することが可能になる。
【0019】
特に、変形対象の内部の任意の範囲に含まれる小多角形(複数でもよい)の頂点を移動させる変形法を使用すれば、変形後のすべての四角形(1)’、(2)’、(3)’、・・・・・(24)’の位置データ(例えば、座標)を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。さらに、この変形法を用いると、変形対象の外枠の形を変えずに、また変形対象の指定した範囲に含まれる小多角形は変形されずに、任意の場所に移動でき、その他の小多角形のみを変形できるので、画像の外形(例えば、大きさ)および画像データの一部分を変えずに、その場所を移動したいという場合に有効である。
【0020】
次に、上記原理に基づく本発明の具体的な実施例について説明する。
画像変形装置の構成
図3は本発明に係る画像変形方法を実現する画像変形装置の第1実施例を示す構成図である。図3において、画像変形装置は大きく分けてCPU31、入力操作子32、記憶装置33、画像信号発生回路(Video Display Prosseser:以下VDPという)34、VRAM35およびTVディスプレイ36によって構成される。
CPU31は装置全体を制御するもので、入力操作子32から画像変形指令が入力されると、その指令情報に対応すべく内部のメモリに格納されている制御プログラムに基づいて記憶装置33に記憶されている変形対象としてのビット配列形式の画像データ41を読み出してVDP34に出力するとともに、この画像データ41に対して多角形分割変形処理を施した後、変形後のビット配列形式の画像データをVDP34に出力する。また、CPU31は内部レジスタ31aを有しており、内部レジスタ31aには後述の図4に示すような各小矩形の格子点座標等が格納されるようになっている。
【0021】
入力操作子(変形態様指定手段)32はオペレータによって操作されるもので、ビット配列形式の画像データの配列をどのように変形させるかを指定する(つまり、変形を行わせるきっかけを与えるための)第1の変形スイッチ51および第2の変形スイッチ52を有している。第1の変形スイッチ51は、例えば変形前の格子点座標42で表される原画像に対して、変形後の格子点座標43で表される第1の変形画像のような変形(変形データ1)を与える指令を出力する。第2の変形スイッチ52は、例えば変形前の格子点座標42で表される原画像に対して、変形後の格子点座標44で表される第2の変形画像のような変形(変形データ2)を与える指令を出力する。なお、各変形スイッチ51、52は単独操作のプッシュスイッチでもよいし、あるいは複数のスイッチからなるスイッチボード、キーボード等でもよい。また、入力操作子32としてスイッチボード等の他に、マウス、トラックボール等を用いてもよい。
【0022】
記憶装置(記憶手段)33は変形対象となるビット配列形式の画像データ41、変形対象(原画像)をどのように矩形分割するかを示す変形前の格子点座標(変形前の小多角形の頂点の座標)42、矩形分割された各小矩形をどのように変形するかを示す変形データ1に対応する変形後の格子点座標(変形後の異なる小多角形の頂点の座標)43および矩形分割された各小矩形をどのように変形するかを示す変形データ2に対応する変形後の格子点座標(変形後の異なる小多角形の頂点の座標)44を記憶している。例えば、格子点座標43は第1の変形画像に対応し、格子点座標44は第2の変形画像に対応しているとともに、これらの変形画像を処理する指令はそれぞれ第1の変形スイッチ51、第2の変形スイッチ52から出力される。
VDP34はCPU31から与えられた変形前のビット配列形式の画像データや変形後のビット配列形式の画像データをVRAM34に書き込む。VRAM34としては、例えば半導体メモリが用いられ、表示する画像を1画面単位で記憶する。VRAM34に書き込まれた画像データはTVディスプレイ(表示手段)36によって表示される。
上記CPU31は分割手段、変形手段、画像データ作成手段、座標変換手段、データ変換手段を構成するとともに、さらに画像変形制御手段を構成する。
【0023】
ここで、本実施例では変形前のビット配列形式の画像データを有する変形対象に対して図4に示すように、多数の小矩形に分割する処理が施される。この場合、矩形分割された各小矩形の頂点に当る部分を格子点と呼ぶことにする。図4の例では、変形対象を縦方向にm分割し、横方向にn分割している。したがって、変形対象は(m×n)個の小矩形に分割されることになり、各小矩形は左上端から右下端に行くに従って、小矩形(0、0)、小矩形(0、1)、小矩形(0、2)、・・・・・・・小矩形(m−1、n−1)としてそれぞれ表される。
また、変形対象の左上端の格子点を格子点(0、0)、その右隣の格子点を格子点(0、1)と呼び、以下同様に右に行くに従って格子点(0、2)、格子点(0、3)、と呼ぶことにする。したがって、右上端の格子点は格子点(0、n)になる。次いで、格子点(0、0)のすぐ下の格子点を格子点(1、0)と呼び、以下同様に下に行くに従って格子点(2、0)、格子点(3、0)と呼ぶことにする。したがって、左下端の格子点は格子点(m、0)になる。また、右下端の格子点は格子点(m、n)になる。
【0024】
CPU31の内部レジスタ31aには図4に示す各小矩形の格子点座標が記憶され、その様子は図5のように示される。図5において、内部レジスタ31aには各小矩形(0、0)、小矩形(0、1)、小矩形(0、2)、・・・・・・・小矩形(m−1、n−1)に対応する格子点の座標として、以下のように格納されている。なお、各格子点の座標はX軸(横方向)およびY軸(縦方向)を基準とする2つの数値で表される。
格子点(0、0)のX座標
格子点(0、0)のY座標
格子点(0、1)のX座標
格子点(0、1)のY座標


格子点(m、n)のX座標
格子点(m、n)のY座標
【0025】
一方、記憶装置33には変形対象(原画像データを有する)をどのように矩形分割するかを示す変形前の格子点座標42が格納されているが、この格子点座標42をCPU31の内部レジスタ31aに記憶されている各小矩形(0、0)、小矩形(0、1)、小矩形(0、2)、・・・・・・・小矩形(m−1、n−1)の格子点座標にそれぞれ対応させて示すと、例えば図5の右端に表すようになる。すなわち、両者は以下のような対応関係になる。
格子点(0、0)のX座標……100(変形前の格子点座標、以下同様)
格子点(0、0)のY座標……100
格子点(0、1)のX座標……110
格子点(0、1)のY座標……100


格子点(m、n)のX座標……160
格子点(m、n)のY座標……140
【0026】
また、記憶装置33には前述したように第1の変形スイッチ51からの指令に対応する第1の変形画像を矩形分割した場合の格子点座標43および第2の変形スイッチ52からの指令に対応する第2の変形画像を矩形分割した場合の格子点座標44が記憶されている。例えば、第1の変形スイッチ51が操作されると、このスイッチ51によって選択された変形番号に相当する変形後の格子点座標がCPU31の内部レジスタ31aに格納され、第2の変形スイッチ52が操作されると、このスイッチ52によって選択された変形番号に相当する変形後の格子点座標がCPU31の内部レジスタ31aに格納される。
【0027】
これらの格子点座標43、44をCPU31の内部レジスタ31aに記憶されている各小矩形(0、0)、小矩形(0、1)、小矩形(0、2)、・・・・・・・小矩形(m−1、n−1)の格子点座標にそれぞれ対応させて示すと、例えば図5の中央の図のように表される。
なお、変形1とは、第1の変形スイッチ51からの指令に対応する第1の画像変形処理のことであり、変形2とは、第2の変形スイッチ52からの指令に対応する第2の画像変形処理のことである。したがって、変形1の格子点座標とは、第1の変形スイッチ51からの指令に対応する第1の変形画像を矩形分割した場合の格子点座標のことである。同様に、変形2の格子点座標とは、第2の変形スイッチ52からの指令に対応する第2の変形画像を矩形分割した場合の格子点座標のことである。
【0028】
次に、作用を説明する。
メインプログラム
図6は画像変形処理のメインプログラムを示すフローチャートである。このプログラムがスタートすると、まずステップS10でキー情報取り込み処理を行う。これは、入力操作子32における第1の変形スイッチ51あるいは第2の変形スイッチ52の操作情報を入力するものである。次いで、ステップS12で変形スイッチが押されたか否かを判別し、何れのスイッチも押されていなければ、今回のルーチンを終了し、次回のルーチンで再びステップS10を実行する。このとき、例えばスイッチフラグが設けられ、何れのスイッチも押されていなければ、スイッチフラグが[0]のままである。一方、何れかのスイッチが押されると、スイッチフラグを[1]にセットするとともに、ステップS14で押された変形スイッチの番号を判別する。その後、ステップS16あるいはステップS18で押された変形スイッチの番号に応じた変形後の格子点座標をCPU31の内部レジスタ31aに格納し、次いで、ステップS20に進む。
【0029】
具体的には、第1の変形スイッチ51が押された場合には、ステップS16に進んで記憶装置33内の第1の変形画像を矩形分割した場合の格子点座標(つまり、変形データ1に対応する変形後の格子点座標)43をコピーしてCPU31の内部レジスタ31aに格子点毎に格納する。したがって、例えば図5に示されるような変形前の格子点座標が記憶されていたとすると、以下に示すように格子点座標43の値が内部レジスタ31aに順次格納されることになる。
格子点(0、0)のX座標……90(変形データ1の格子点座標、以下同様)
格子点(0、0)のY座標……100
格子点(0、1)のX座標……105
格子点(0、1)のY座標……95


格子点(m、n)のX座標……140
格子点(m、n)のY座標……130
【0030】
一方、第2の変形スイッチ52が押された場合には、ステップS18に進んで記憶装置33内の第2の変形画像を矩形分割した場合の格子点座標(つまり、変形データ2に対応する変形後の格子点座標)44をコピーしてCPU31の内部レジスタ31aに格子点毎に格納する。したがって、例えば図5に示されるような変形前の格子点座標が記憶されていたとすると、以下に示すように格子点座標44の値が内部レジスタ31aに順次格納されることになる。
格子点(0、0)のX座標……90(変形データ2の格子点座標、以下同様)
格子点(0、0)のY座標……100
格子点(0、1)のX座標……105
格子点(0、1)のY座標……100


格子点(m、n)のX座標……170
格子点(m、n)のY座標……140
【0031】
ステップS16あるいはステップS18を経ると、続くステップS20に進み、記憶装置33から変形対象となる画像データの中から、処理すべき小矩形(i、j)に含まれる画像データを読み込んで小矩形の変形処理を行う(詳細はサブルーチンで後述)。これにより、小矩形(i、j)についてビット配列形式の画像データの配列が変形し、変形後の画像が得られることになる。小矩形(i、j)とは、例えば図1(a)に示すように変形対象を複数に分割した場合の小矩形(1)、(2)、(3)、・・・・・(24)の何れかを表す一般的な指定状態を示すものである。なお、ステップS20の処理では、小矩形(i、j)で示される変形後の画像データをVDP34に順次転送することが行われ、これにより、最終的にすべての小矩形(i、j)に対応する変形した画像データが合成されて変形画像が得られることになる。
次いで、ステップS22ですべての小矩形(i、j)に対して画像の変形処理をしたか否かを判別し、NOであればステップS20に戻って同様の処理を繰り返す。そして、すべての小矩形(i、j)に対して画像の変形処理が終了すると、ステップS22からYESに抜けて本ルーチンを終了する。このようにして、ステップS20およびステップS22において各小矩形単位で画像の変形処理が行われる。
【0032】
小矩形変形処理のサブルーチン
次に、図7はメインプログラムの小矩形変形処理(ステップS20)のサブルーチンを示すフローチャートである。このサブルーチンに移行すると、ステップS30で小矩形(i、j)の周囲4点の変形前の座標を、記憶装置33内の変形前の格子点座標42より得る処理を行う。言換えれば、記憶装置33に記憶されている変形前の格子点座標42から、処理すべき小矩形の頂点に当る4つの座標を読み出す。例えば、小矩形(i、j)の場合、頂点は格子点(i、j)、(i、j+1)、格子点(i+1、j)、格子点(i+1、j+1)となり、これらが変形前の小矩形の座標である。
【0033】
次いで、ステップS32で小矩形(i、j)の周囲4点の変形後の座標を、CPU31における内部レジスタ31aの格子点座標より得る処理を行う。言換えれば、CPU31の内部レジスタ31aに格納されている変形後の格子点座標から、処理すべき小矩形の頂点に当る4つの座標を読み出す。例えば、同様に小矩形(i、j)の場合、頂点は格子点(i、j)、(i、j+1)、格子点(i+1、j)、格子点(i+1、j+1)となり、これらが変形後の四角形の座標である。
ステップS30、ステップS32により、変形対象の画像全体が滑らかに変形されるように、各小矩形を異なる四角形にそれぞれ変形する処理が行われる。この処理(変形処理に相当)は座標変換処理であり、この座標変換処理では、分割された各小矩形の頂点の座標を求め、次いで、変形対象全体が滑らかに変形されるような変形後の各小四角形の頂点の座標を算出し、この算出した座標に基づいて変形後の異なる小四角形の形状を決定することにより、分割された各小矩形を異なる小四角形に変形する。
【0034】
次いで、ステップS34でいわゆるライン貼り付け法(データ変換処理に相当)により各小矩形内の画像データの配列を変形する処理を行う。ライン貼り付け法とは、変形元である分割した各小多角形のビット配列形式の画像データの配列を複数のラインに分割し、分割した各ラインを変形先の各多角形の対応する位置に順次転送するとともに、転送に際して転送先の大きさに合うように拡大又は縮小させながらそれぞれラインとして貼り付けていくことにより、変形後の各小多角形の画像データの配列を作成することをいう。
具体的には、図8(a)に示すように変形元となるビット配列形式の画像データを有する小矩形Cの画像データの配列を複数のライン1〜ラインnに分割し、分割した各ライン1〜nを変形先の四角形Dの対応する位置に、転送先の大きさに合うように拡大又は縮小させながらそれぞれライン1’〜ラインn’として貼り付けていくものである。このように、小矩形Cの画像データの配列を複数のライン1〜ラインnに分けて変形させながら貼り付けることで、画像の変形処理を行うことにより、元画像を滑らかに変形させることが可能になる。
【0035】
これにより、各小矩形は四角形へと変形処理され、最終的にすべての小矩形(i、j)に対応する画像データの配列が変形し、変形画像が得られることになる。
次いで、ステップS36でVDP34に変形済みの画像データを逐次転送する。これにより、小矩形(i、j)で示される変形後の画像データがVDP34に転送され、最終的にすべての小矩形(i、j)に対応する変形した画像を合成することにより、TVディスプレイ36に変形後の画像が表示される。ステップS36の処理を経ると、メインプログラムにリターンする。
【0036】
本実施例の格子点算出処理
次に、本実施例の特徴部分である変形処理(つまり、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、少なくとも各頂点の相対位置が変らないように任意の位置に移動したとき、変形対象が滑らかに変形されるように他の各格子点を移動させ、移動後の各格子点の座標を算出する処理)について説明する。
まず、この変形処理の対象となる変形対象の例は図9(a)に示され、変形後の例は図9(b)に示される。図9(a)に示すように、変形対象を予め縦m分割(例えば、4分割)、横n分割(例えば、6分割)して合計でm×n個(例えば、24個)の小矩形に分割する。このとき、各小矩形の画像データはドットによって構成され、かつ各ドット毎に表示色番号あるいはパレット番号を持っている。そして、各小矩形毎の画像はそのドット全体によって表示される。
【0037】
さて、この例は、あたかも変形対象の内部にある指定された範囲内にある4つの小矩形をそっくりそのまま下方に平行移動して変形対象を変形させるようなケースに相当する。
ここで、本実施例では格子点の表し方と、格子点の座標とについて、次のような取り決めにしている。後述の実施例においても同様である。
例えば、格子点(p、q)という場合、最初の記号でy軸方向の位置を表示し、次の記号でx軸方向の位置を表示する。すなわち、格子点(p、q)=(y軸方向の位置、x軸方向の位置)となり、pはy軸方向の位置に相当し、qはx軸方向の位置に相当する。これに対して、座標の表示は数学上で一般的に用いられているものと同様に、最初の記号でx軸方向の位置を表示し、次の記号でy軸方向の位置を表示する。したがって、格子点(p、q)の座標が座標(xd、yd)という場合、xdがx軸方向の位置で、ydがy軸方向の位置となる。すなわち、(xd、yd)=(x軸方向の位置、y軸方向の位置)となる。このように、両者の表示方法が逆になっているので、後述のフローチャートでは間違えないように理解する必要がある。なお、適宜、説明の都合上、例えば格子点(座標:x2、yp)というようにして該当する格子点について、その座標のみを表示することも行う。
【0038】
変形データとして予め位置が判明しているために、位置データの保有が可能なものは、図9(a)に示す変形前においては変形対象の内部の指定した範囲に含まれる4つの小矩形の領域を指定するための格子点のデータであり、具体的には、4つの小矩形全体の左上の格子点(p1、q1)、右下の格子点(p2、q2)、指定した範囲内の小矩形のx軸方向の移動量dx、y軸方向の移動量dyである。また、変形後は図9(b)に示す同一の小矩形の頂点である。なお、外枠のうち少なくとも2つの頂点も予め位置が判明している。
なお、前者の変形前の小矩形の頂点は、移動の基準となるものであり、以下、移動基準格子点という。また、適宜、指定した範囲に含まれる移動前の4つの小多角形を以下、指定領域といい、それらの小多角形の頂点を指定格子点という。
【0039】
一方、変形後における図9(b)に示す同一の小矩形の頂点は、変形移動格子点といい、その位置を座標で表すと、図9(b)に示すように変形移動格子点となる。また、外枠の2つの頂点も予め位置が判明しているため、それらの位置データは(x1、y1)、(x2、y2)なる座標で表される。なお、各小矩形の頂点を、適宜、格子点という。さらに、図面の説明上、横方向をx座標、縦方向をy座標とし、x座標は図面上、左から右へ大きく、y座標は上から下へ大きくなるものとする。
記憶装置33には図10に示すように、上記各情報を格納する変形データエリアがある。
指定範囲左上の格子点……格子点(p1、q1)
指定範囲右下の格子点……格子点(p2、q2)
指定範囲のx方向の移動量……dx
指定範囲のy方向の移動量……dy
【0040】
図11〜図14は変形後の格子点座標算出処理のルーチンを示すフローチャートである。
このルーチンは、変形対象の内部の指定した範囲内の4つの小矩形をそっくりそのまま下方に平行移動したとき、変形対象全体が滑らかに変形されるように他の小多角形の頂点を移動させ、移動した他の小多角形の頂点を上記4つの小多角形の移動後の頂点(変形移動格子点(座標:xs、ys))に基づいて算出するものである。そして、その後、算出した各頂点に対応して変形後の各小多角形の形状が決定され、変形後の小多角形に対応するように元画像が順次変形処理されて変形後の全体画像が作成されることになる。
【0041】
まず、ステップS100で変形対象の外枠の4隅の頂点の座標(x1、y1)、(x2、y1)、(x1、y2)、(x2、y2)を算出する。この場合、外枠の2つの頂点(x1、y1)、(x2、y2)は予め位置が判明しているから、残りの2つの頂点位置は比例演算によって求められ、それらの位置データは変形対象が縦m分割、横n分割されるから、結局、(x1、y2)、(x1、y2)なる座標で表される。また、同じステップS100で変形対象の内部の指定した範囲に含まれる4つの小矩形の格子点(i、j)(ただし、p1≦i≦p2、q1≦i≦q2:図9(b)中×印で示す)の移動する前の座標を以下の(1)式および(2)式に従って算出する。
x=x1・(n−j)/n+x2・j/n……(1)
y=y1・(m−i)/m+y2・i/m……(2)
したがって、変形対象の内部の指定した範囲に含まれる移動前の4つの小多角形の頂点(移動基準格子点(i、j))は、移動すると、変形移動格子点として表され、その移動後の座標に基づいて他の小多角形の頂点を次のように算出する。
【0042】
すなわち、ステップS102でポインタjをq1にセットする。ポインタjは格子点をq1なる位置からx軸方向に沿って順次指定する。次いで、ステップS104でポインタiをp1にセットする。ポインタiは格子点をp1なる位置からy軸方向に沿って順次指定する。このように各ポインタj、iを初期位置にセットすることにより、移動基準格子点(i、j)(例えば、その1つの格子点は(p1、q1))がどれだけ移動したかを算出するための準備が整えられる。
次いで、ステップS106で以下に示す(3)式および(4)式に従って移動基準格子点(i、j)がx軸方向にdx、y軸方向にdyだけ移動した後の座標を(xs、ys)(図9(b)の状態)を算出する。
xs=x1・(n−j)/n+x2・j/n+dx……(3)
ys=y1・(m−i)/m+y2・i/m+dy……(4)
【0043】
次いで、ステップS108でポインタiをインクリメントし(1だけ進める)、続くステップS110でポインタiがp2+1に等しくなったか(下側の指定格子点p2を超えたか)否かを判別する。例えば、最初のルーチンでは上側の格子点(p1、q1)の移動後の座標を求めたから、まだ両者が等しくなく、NOに分岐してステップS106に戻ってループを繰り返す。したがって、次回のループではその下側にある格子点(p1+1、q1)の移動後の座標が算出される。そして、同様のループを繰り返すことにより、i=p2+1になると、下側の指定格子点p2を超える位置までポインタiが進んだと判断してステップS112に抜ける。
このようにして、指定された小矩形の左辺上にある格子点(つまりq1を含むy軸方向の線分上にある格子点)の移動後の座標(xs、ys)がすべて算出される。なお、本実施例では上記左辺上にある格子点は3つであるが、同様の処理によって、それ以上の格子点の移動後の座標も簡単に算出できる。
【0044】
次いで、ステップS112でポインタjをインクリメントし(1だけ進める)、続くステップS114でポインタjがq2+1に等しくなったか否かを判別する。例えば、最初のルーチンではq1を含むy軸方向の線分上にある格子点の移動後の座標を求めたのみであるから、まだ両者が等しくなく、NOに分岐してステップS104に戻ってループを繰り返す。したがって、次回のループでは(q1+1)を含むy軸方向の線分上にある格子点の移動後の座標が算出される。そして、同様のループを繰り返すことにより、j=q2+1になると、右側の指定格子点q2を超える位置までポインタjが進んだと判断してステップS116に抜ける。
このようにして、変形対象の内部の指定した範囲に含まれる移動前の4つの小多角形の頂点(移動基準格子点(i、j))が移動した後の座標がすべて算出される。
【0045】
次に、上記のようにして求めた移動後の格子点(×印)を、対応する外枠上の格子点と順次結んでいき、その線分上にある格子点(例えば、△印、▲印)の座標を算出する処理に移る。
最初に、外枠の各辺(上辺、下辺、右辺、左辺)にある格子点の座標を求めておく。すなわち、ステップS116でポインタjをj=1にセットし、初期位置におく。次いで、ステップS118で以下に示す(5)式および(6)式に従って外枠の上辺にある格子点(0、j)の座標(xt、yt)を算出する。
xt=x1・(n−j)/n+x2・j/n……(5)
yt=y1……(6)
次いで、ステップS120で以下に示す(7)式および(8)式に従って外枠の下辺にある格子点(m、j)の座標(xt、yt)を算出する。
xt=x1・(n−j)/n+x2・j/n……(7)
yt=y2……(8)
【0046】
次いで、ステップS122でポインタjをインクリメントし(1だけ進める)、続くステップS124でポインタjがnに等しくなったか(外枠上の右辺まで到達したか)なったか否かを判別する。例えば、最初のルーチンでは格子点(0、1)、格子点(m、1)の座標を求めたのみだから、まだ両者が等しくなく、NOに分岐してステップS118に戻ってループを繰り返す。したがって、次回のループでは格子点(0、2)、格子点(m、2)の座標が算出される。そして、同様のループを繰り返すことにより、j=nになると、格子点(0、n)、(m、n)の位置まで(外枠上の右辺まで)ポインタjが進んだと判断してステップS126に抜ける。
このようにして、外枠の上辺および下辺にある各格子点の座標が順次算出される。
【0047】
次いで、ステップS126でポインタiをi=1にセットし、初期位置におく。次いで、ステップS126で以下に示す(9)式および(10)式に従って外枠の左辺にある格子点(i、0)の座標(xt、yt)を算出する。
xt=x1……(9)
yt=y1・(m−i)/m+y2・i/m……(10)
次いで、ステップS130で以下に示す(11)式および(12)式に従って外枠の右辺にある格子点(i、n)の座標(xt、yt)を算出する。
xt=x2……(11)
yt=y1・(m−i)/m+y2・i/m……(12)
【0048】
次いで、ステップS132でポインタiをインクリメントし(1だけ進める)、続くステップS134でポインタiがmに等しくなったか(外枠上の下辺まで到達したか)否かを判別する。例えば、最初のルーチンでは格子点(1、0)、格子点(1、n)の座標を求めたのみだから、まだ両者が等しくなく、NOに分岐してステップS128に戻ってループを繰り返す。したがって、次回のループでは格子点(2、0)、格子点(2、n)の座標が算出される。そして、同様のループを繰り返すことにより、i=mになると、格子点(m、0)、(m、n)の位置まで(外枠上の下辺まで)ポインタiが進んだと判断してステップS136に抜ける。
このようにして、外枠の左辺および右辺にある各格子点の座標が順次算出される。
【0049】
外枠の各辺(上辺、下辺、右辺、左辺)にある格子点の座標が求められたので、続いて前述の処理で求めた移動後の格子点(×印)を、対応する外枠の各辺の格子点と順次結んでいき、その線分上にある格子点(例えば、△印、▲印)の座標を算出する。
(I)移動後の格子点(×印)を外枠の上辺の格子点とを結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップS136でポインタjをj=q1にセットし、初期位置におく。次いで、ステップS138で外枠の上辺にある格子点(0、j)の座標と、指定領域にある格子点(p1、j)の座標を読み出す。次いで、ステップS140でポインタiをi=1にセットし、初期位置におく。次いで、ステップS142で以下に示す(13)式および(14)式に従って外枠の上辺にある格子点(0、j)と、指定領域にある格子点(p1、j)とを結んだ線分上にある格子点の座標(i、j)を算出する。
x=xt・(p1−i)/p1+xs・i/p……(13)
y=yt・(p1−i)/p1+ys・i/p……(14)
【0050】
次いで、ステップS144でポインタiをインクリメントし(1だけ進める)、続くステップS146でポインタiがp1に等しくなったか(指定領域の上辺まで到達したか)否かを判別する。例えば、最初のルーチンでは外枠の上辺にある格子点(0、j)と、指定領域にある格子点(p1、j)とを結んだ線分上にある第1の格子点の座標(i、j)を算出したのみであるから、まだ両者が等しくなく、NOに分岐してステップS118に戻ってループを繰り返す。したがって、次回のループでは外枠の上辺にある格子点(0、j)と、指定領域にある格子点(p1、j)とを結んだ線分上にある第2の格子点の座標(i、j)が算出される。そして、同様のループを繰り返すことにより、i=p1になると、格子点(p1、q1)の位置まで(指定領域の上辺まで)ポインタiが進んだと判断してステップS148に抜ける。これにより、外枠の上辺にある格子点(0、j)と、指定領域にある格子点(p1、j)とを結んだ線分上にある格子点の座標(i、j)が順次すべて算出される。
【0051】
次いで、ステップS148でポインタjをインクリメントし(1だけ進める)、続くステップS150でポインタjがq2+1に等しくなったか(指定領域の右辺まで到達したか)否かを判別する。例えば、最初のルーチンでは格子点(0、q1)と格子点(p1、q1)を結ぶ線分上にある格子点の座標を求めたのみだから、まだ両者が等しくなく、NOに分岐してステップS138に戻ってループを繰り返す。したがって、次回のループでは格子点(0、q1+1)と格子点(p1、q1+1)を結ぶ線分上にある格子点の座標が算出される。すなわち、右側に1つだけずれた線分上にある格子点の座標が算出される。そして、同様のループを繰り返すことにより、j=q2+1になると、指定領域の右辺までポインタjが進んだと判断してステップS152に抜ける。
このようにして、移動後の格子点(×印)を外枠の上辺の格子点とを結んだ線分上にあるすべての格子点の座標が算出される。
【0052】
(II)移動後の格子点(×印)を外枠の下辺の格子点とを結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップS152でポインタjをj=q1にセットし、初期位置におく。次いで、ステップS154で外枠の下辺にある格子点(m、j)の座標と、指定領域にある格子点(p2、j)の座標を読み出す。次いで、ステップS156でポインタiをi=p2にセットし、初期位置におく。次いで、ステップS158で以下に示す(15)式および(16)式に従って外枠の下辺にある格子点(m、j)と、指定領域にある格子点(p2、j)とを結んだ線分上にある格子点の座標(i、j)を算出する。
x=xt・(q2−i)/(m−p2)
+xs・(i−m)/(m−p2)……(15)
y=yt・(q2−i)/(m−p2)
+ys・(i−m)/(m−p2)……(16)
【0053】
次いで、ステップS160でポインタiをインクリメントし(1だけ進める)、続くステップS162でポインタiがmに等しくなったか(外枠の下辺まで到達したか)否かを判別する。例えば、最初のルーチンでは外枠の下辺にある格子点(m、j)と、指定領域にある格子点(p2、j)とを結んだ線分上にある第1の格子点の座標(i、j)を算出したのみであるから、まだ両者が等しくなく、NOに分岐してステップS158に戻ってループを繰り返す。したがって、次回のループでは外枠の下辺にある格子点(m、j)と、指定領域にある格子点(p2、j)とを結んだ線分上にある第2の格子点の座標(i、j)が算出される。そして、同様のループを繰り返すことにより、i=mになると、格子点(m、q1)の位置まで(外枠の下辺まで)ポインタiが進んだと判断してステップS162に抜ける。これにより、外枠の下辺にある格子点(m、j)と、指定領域にある格子点(p2、j)とを結んだ線分上にある格子点の座標(i、j)が順次すべて算出される。
【0054】
次いで、ステップS164でポインタjをインクリメントし(1だけ進める)、続くステップS166でポインタjがq2+1に等しくなったか(指定領域の右辺まで到達したか)否かを判別する。例えば、最初のルーチンでは格子点(p2、q1)と格子点(m、q1)を結ぶ線分上にある格子点の座標を求めたのみだから、まだ両者が等しくなく、NOに分岐してステップS154に戻ってループを繰り返す。したがって、次回のループでは格子点(p2、q1+1)と格子点(m、q1+1)を結ぶ線分上にある格子点の座標が算出される。すなわち、右側に1つだけずれた線分上にある格子点の座標が算出される。そして、同様のループを繰り返すことにより、j=q2+1になると、指定領域の右辺までポインタjが進んだと判断してステップS168に抜ける。
このようにして、移動後の格子点(×印)を外枠の下辺の格子点とを結んだ線分上にあるすべての格子点の座標が算出される。
【0055】
(III)移動後の格子点(×印)を外枠の左辺の格子点とを結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップS168でポインタiをi=p1にセットし、初期位置におく。次いで、ステップS170で外枠の左辺にある格子点(i、0)の座標と、指定領域にある格子点(i、q1)の座標を読み出す。次いで、ステップS172でポインタjをj=1にセットし、初期位置におく。次いで、ステップS174で以下に示す(17)式および(18)式に従って外枠の左辺にある格子点(i、0)と、指定領域にある格子点(i、q1)とを結んだ線分上にある格子点の座標(i、j)を算出する。
x=xt・(q1−j)/q1+xs・j/q1……(17)
y=yt・(q1−j)/q1+ys・j/q1……(18)
【0056】
次いで、ステップS176でポインタjをインクリメントし(1だけ進める)、続くステップS178でポインタjがq1+1に等しくなったか(指定領域の左辺まで到達したか)否かを判別する。例えば、最初のルーチンでは外枠の左辺にある格子点(i、0)と、指定領域にある格子点(i、q1)とを結んだ線分上にある第1の格子点の座標(i、j)を算出したのみであるから、まだ両者が等しくなく、NOに分岐してステップS174に戻ってループを繰り返す。したがって、次回のループでは外枠の左辺にある格子点(i、0)と、指定領域にある格子点(i、q1)とを結んだ線分上にある第2の格子点の座標(i、j)が算出される。そして、同様のループを繰り返すことにより、j=q1+1になると、格子点(p1、q1)の位置まで(指定領域の左辺まで)ポインタjが進んだと判断してステップS180に抜ける。これにより、外枠の左辺にある格子点(i、0)と、指定領域にある格子点(i、q1)とを結んだ線分上にある格子点の座標(i、j)が順次すべて算出される。
【0057】
次いで、ステップS180でポインタiをインクリメントし(1だけ進める)、続くステップS182でポインタiがp2+1に等しくなったか(指定領域の下辺まで到達したか)否かを判別する。例えば、最初のルーチンでは外枠の左辺にある格子点(i、0)と、指定領域にある格子点(i、q1)とを結ぶ線分上にある格子点の座標を求めたのみだから、まだ両者が等しくなく、NOに分岐してステップS170に戻ってループを繰り返す。したがって、次回のループでは格子点(p1+1、0)と格子点(p1+1、q1)を結ぶ線分上にある格子点の座標が算出される。すなわち、下側に1つだけずれた線分上にある格子点の座標が算出される。そして、同様のループを繰り返すことにより、j=p2+1になると、指定領域の左辺までポインタiが進んだと判断してステップS184に抜ける。
このようにして、移動後の格子点(×印)を外枠の左辺の格子点とを結んだ線分上にあるすべての格子点の座標が算出される。
【0058】
(IV)移動後の格子点(×印)を外枠の右辺の格子点とを結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップS184でポインタiをi=p1にセットし、初期位置におく。次いで、ステップS186で外枠の右辺にある格子点(i、n)の座標と、指定領域にある格子点(i、q2)の座標を読み出す。次いで、ステップS188でポインタjをj=q2にセットし、初期位置におく。次いで、ステップS190で以下に示す(19)式および(20)式に従って外枠の右辺にある格子点(i、n)と、指定領域にある格子点(i、q2)とを結んだ線分上にある格子点の座標(i、j)を算出する。
x=xt・(q2−j)/(n−q2)
+xs・(j−n)/(n−q2)……(19)
y=yt・(q2−j)/(n−q2)
+ys・(j−n)/(n−q2)……(20)
【0059】
次いで、ステップS192でポインタjをインクリメントし(1だけ進める)、続くステップS194でポインタjがnに等しくなったか(外枠の右辺まで到達したか)否かを判別する。例えば、最初のルーチンでは外枠の右辺にある格子点(i、n)と、指定領域にある格子点(i、q2)とを結んだ線分上にある第1の格子点の座標(i、j)を算出したのみであるから、まだ両者が等しくなく、NOに分岐してステップS190に戻ってループを繰り返す。したがって、次回のループでは外枠の右辺にある格子点(i、1)と、指定領域にある格子点(i、q1+1)とを結んだ線分上にある第2の格子点の座標(i、j)が算出される。そして、同様のループを繰り返すことにより、j=nになると、格子点(p1、q2)の位置まで(外枠の右辺まで)ポインタjが進んだと判断してステップS196に抜ける。これにより、外枠の右辺にある格子点(i、1)と、指定領域にある格子点(i、q1+1)とを結んだ線分上にある格子点の座標(i、j)が順次すべて算出される。
【0060】
次いで、ステップS196でポインタiをインクリメントし(1だけ進める)、続くステップS198でポインタiがmに等しくなったか(外枠の下辺まで到達したか)否かを判別する。例えば、最初のルーチンでは外枠の右辺にある格子点(i、1)と、指定領域にある格子点(i、q1+1)とを結んだ線分上にある格子点の座標を求めたのみだから、まだ両者が等しくなく、NOに分岐してステップS186に戻ってループを繰り返す。したがって、次回のループでは格子点(p1+1、q2)と格子点(p1+1、n)を結ぶ線分上にある格子点の座標が算出される。すなわち、下側に1つだけずれた線分上にある格子点の座標が算出される。そして、同様のループを繰り返すことにより、i=mになると、外枠の下辺までポインタiが進んだと判断して図13のステップS200に抜ける。
このようにして、移動後の格子点(×印)を外枠の右辺の格子点とを結んだ線分上にあるすべての格子点の座標が算出される。
【0061】
さて、残りの格子点は上記処理で求めた格子点(△、▲印)を、それぞれ対応する外枠上の格子点と順次結んでいったときにできる交点(以下、適宜、交差格子点という)にある。したがって、以下のステップでは、残りの格子点の座標を算出する。
(V)移動後の中間格子点(△印)を外枠の上辺の格子点と結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップS200でポインタi、jを共に[1]にセットし、初期位置におく。次いで、ステップS202で格子点(i、q1)および格子点(i、0)の座標を読み出す。最初はi=1であるから、指定領域の左辺と同じx軸方向の位置にある格子点(1、q1)と外枠の左辺の格子点(1、0)の座標を読み出すことになる。次いで、ステップS204で各格子点を結ぶx軸方向の線分を以下の式に従って求める。
a・x+b・y+c=0
【0062】
次いで、求めたx軸方向の線分に交差するy軸方向の線分を算出する処理を行う。ステップS206で格子点(p1、j)および格子点(0、j)の座標を読み出す。最初はj=1であるから、指定領域の上辺と同じy軸方向の位置にある格子点(p1、1)と外枠の上辺の格子点(0、1)の座標を読み出すことになる。次いで、ステップS208で各格子点を結ぶy軸方向の線分を以下の式に従って求める。
a’・x+b’・y+c’=0
これにより、y軸方向の線分が求められたので、これら2直線の交点にある格子点を求める処理を行う。すなわち、ステップS210で2直線の交点の座標(x、y)を以下に示す(21)式および(22)式に従って算出する。
x=(b・c’−b’・c)/(a・b’−a’・b)……(21)
y=(a’・c−a・c’)/(a・b’−a’・b)……(22)
【0063】
次いで、ステップS212で(21)式、(22)式によって算出したx座標およびy座標を格子点(i、j)の座標としてストアする。次いで、ステップS214に進み、ポインタjをインクリメントし(1だけ進める)、続くステップS216でポインタjがq1に等しくなったか否かを判別する。例えば、最初は指定領域の左辺と同じx軸方向の位置にある格子点(1、q1)と外枠の左辺の格子点(1、0)とを結ぶx軸方向の第1の線分上にある格子点の座標を算出しているから、この線分上に複数の格子点が存在している場合には、まだ両者が等しくなく、NOに分岐してステップS206に戻ってループを繰り返す。したがって、次回のループでは指定領域の右辺と同じx軸方向の位置にある格子点(1、q1)と外枠の左辺の格子点(1、0)とを結ぶx軸方向の第1の線分上にある次の(右側の)格子点の座標が算出されてストアされる。
【0064】
そして、同様のループを繰り返すことにより、j=q1になると、指定領域の左辺の位置までポインタjが進んだと判断してステップS216からステップS218に抜ける。ステップS218ではポインタiをインクリメントし(1だけ進める)、続くステップS220でポインタiがp1に等しくなったか否かを判別する。例えば、いままでのルーチンでは指定領域の左辺と同じx軸方向の位置にある格子点(1、q1)と外枠の左辺の格子点(1、0)とを結ぶx軸方向の第1の線分上の格子点を外枠の左辺から指定領域の左同じx軸方向の位置まで(q1まで)求めたから、今度は下側に移動してx軸方向の第1の線分のすぐ下側にあるx軸方向の第2の線分の各格子点について上記同様の処理を行うことになる。
【0065】
そのため、ステップS220ではNOに分岐し、ステップS202に戻り、同様のループを繰り返す。これにより、x軸方向の第1の線分のすぐ下側にあるx軸方向の第2の線分の各格子点の座標が算出され、以下、同様にしてさらにその下側の線分の各格子点の座標が算出され、ステップS220でiがp1に等しくなると、指定領域の上辺の位置まで交差格子点が求められることになり、次いで、ステップS222に進む。このようにして、移動後の中間格子点(△印)を外枠の上辺の格子点と結んだ線分上にあるすべての格子点の座標が算出される。
【0066】
(VI)移動後の中間格子点(▲印)を外枠の上辺の格子点と結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップS222でポインタiをi=1にセットし、ポインタjをj=q2+1にセットして共に初期位置におく。次いで、ステップS224で格子点(i、q2)および格子点(i、n)の座標を読み出す。最初はi=1であるから、指定領域の右辺と同じx軸方向の位置にある格子点(1、q2)と外枠の右辺の格子点(1、n)の座標を読み出すことになる。次いで、ステップS226で各格子点を結ぶx軸方向の線分を以下の式に従って求める。
a・x+b・y+c=0
【0067】
次いで、求めたx軸方向の線分に交差するy軸方向の線分を算出する処理を行う。ステップS228で格子点(p1、j)および格子点(0、j)の座標を読み出す。最初はj=1であるから、指定領域の上辺と同じy軸方向の位置にある格子点(p1、1)と外枠の上辺の格子点(0、1)の座標を読み出すことになる。次いで、ステップS2230で各格子点を結ぶy軸方向の線分を以下の式に従って求める。
a’・x+b’・y+c’=0
これにより、y軸方向の線分が求められたので、これら2直線の交点にある格子点を求める処理を行う。すなわち、ステップS232で2直線の交点の座標(x、y)を前述した(21)式および(22)式に従って算出する。
【0068】
次いで、ステップS236で(21)式、(22)式によって算出したx座標およびy座標を格子点(i、j)の座標としてストアする。次いで、ステップS238に進み、ポインタjをインクリメントし(1だけ進める)、続くステップS240でポインタjがnに等しくなったか否かを判別する。例えば、最初は指定領域の右辺と同じx軸方向の位置にある格子点(1、q2)と外枠の右辺の格子点(1、n)とを結ぶx軸方向の第1の線分上にある格子点の座標を算出しているから、この線分上に複数の格子点が存在している場合には、まだ両者が等しくなく、NOに分岐してステップS228に戻ってループを繰り返す。したがって、次回のループでは指定領域の右辺と同じx軸方向の位置にある格子点(1、q2)と外枠の右辺の格子点(1、n)とを結ぶx軸方向の第1の線分上にある次の(右側の)格子点の座標が算出されてストアされる。
【0069】
そして、同様のループを繰り返すことにより、j=nになると、外枠の右辺の位置までポインタjが進んだと判断してステップS2238からステップS240に抜ける。ステップS240ではポインタiをインクリメントし(1だけ進める)、続くステップS242でポインタiがp1に等しくなったか否かを判別する。例えば、いままでのルーチンでは指定領域の右辺と同じx軸方向の位置にある格子点(1、q2)と外枠の右辺の格子点(1、n)とを結ぶx軸方向の第1の線分上の格子点を指定領域の右辺と同じx軸方向の位置から外枠の右辺まで(nまで)求めたから、今度は下側に移動してx軸方向の第1の線分のすぐ下側にあるx軸方向の第2の線分の各格子点について上記同様の処理を行うことになる。
【0070】
そのため、ステップS242ではNOに分岐し、ステップS224に戻り、同様のループを繰り返す。これにより、x軸方向の第1の線分のすぐ下側にあるx軸方向の第2の線分の各格子点の座標が算出され、以下、同様にしてさらにその下側の線分の各格子点の座標が算出され、ステップS242でiがp1に等しくなると、指定領域の上辺の位置まで交差格子点が求められることになり、次いで、ステップS244に進む。このようにして、移動後の中間格子点(▲印)を外枠の上辺の格子点と結んだ線分上にあるすべての格子点の座標が算出される。
【0071】
(VII)移動後の中間格子点(△印)を外枠の下辺の格子点と結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップS244でポインタiをi=p2+1にセットし、ポインタjをj=1にセットして共に初期位置におく。次いで、ステップS246で格子点(i、q1)および格子点(i、0)の座標を読み出す。最初はi=1であるから、指定領域の左辺と同じx軸方向の位置にある格子点(p2+1、q1)と外枠の左辺の格子点(p2+1、0)の座標を読み出すことになる。次いで、ステップS248で各格子点を結ぶx軸方向の線分を以下の式に従って求める。
a・x+b・y+c=0
【0072】
次いで、求めたx軸方向の線分に交差するy軸方向の線分を算出する処理を行う。ステップS250で格子点(p2、j)および格子点(m、j)の座標を読み出す。最初はj=1であるから、指定領域の下辺と同じy軸方向の位置にある格子点(p2、1)と外枠の下辺の格子点(m、1)の座標を読み出すことになる。次いで、ステップS252で各格子点を結ぶy軸方向の線分を以下の式に従って求める。
a’・x+b’・y+c’=0
これにより、y軸方向の線分が求められたので、これら2直線の交点にある格子点を求める処理を行う。すなわち、ステップS254で2直線の交点の座標(x、y)を前述した(21)式および(22)式に従って算出する。
【0073】
次いで、ステップS256で(21)式、(22)式によって算出したx座標およびy座標を格子点(i、j)の座標としてストアする。次いで、ステップS258に進み、ポインタjをインクリメントし(1だけ進める)、続くステップS260でポインタjがq1に等しくなったか否かを判別する。例えば、最初は指定領域の左辺と同じx軸方向の位置にある格子点(p2+1、q1)と外枠の左辺の格子点(p2+1、0)とを結ぶx軸方向の第1の線分上にある格子点の座標を算出しているから、この線分上に複数の格子点が存在している場合には、まだ両者が等しくなく、NOに分岐してステップS250に戻ってループを繰り返す。したがって、次回のループでは指定領域の左辺と同じx軸方向の位置にある格子点(p2+1、q1)と外枠の左辺の格子点(p2+1、0)とを結ぶx軸方向の第1の線分上にある次の(右側の)格子点の座標が算出されてストアされる。
【0074】
そして、同様のループを繰り返すことにより、j=q1になると、指定領域の左辺の位置までポインタjが進んだと判断してステップS260からステップS262に抜ける。ステップS262ではポインタiをインクリメントし(1だけ進める)、続くステップS264でポインタiがmに等しくなったか否かを判別する。例えば、いままでのルーチンでは指定領域の左辺と同じx軸方向の位置にある格子点(p2+1、q1)と外枠の左辺の格子点(p2+1、0)とを結ぶx軸方向の第1の線分上の格子点を外枠の左辺から指定領域の左同じx軸方向の位置まで(q1まで)求めたから、今度は下側に移動してx軸方向の第1の線分のすぐ下側にあるx軸方向の第2の線分の各格子点について上記同様の処理を行うことになる。
【0075】
そのため、ステップS264ではNOに分岐し、ステップS246に戻り、同様のループを繰り返す。これにより、x軸方向の第1の線分のすぐ下側にあるx軸方向の第2の線分の各格子点の座標が算出され、以下、同様にしてさらにその下側の線分の各格子点の座標が算出され、ステップS264でiがmに等しくなると、外枠の下辺の位置まで交差格子点が求められることになり、次いで、図14のステップS266に進む。このようにして、移動後の中間格子点(△印)を外枠の下辺の格子点と結んだ線分上にあるすべての格子点の座標が算出される。
【0076】
(VIII)移動後の中間格子点(▲印)を外枠の下辺の格子点と結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
図14に移り、ステップS266でポインタiをi=p2+1にセットし、ポインタjをj=q2+1にセットして共に初期位置におく。次いで、ステップS268で格子点(i、n)および格子点(i、q2)の座標を読み出す。最初はi=p2+1であるから、指定領域の右辺と同じx軸方向の位置にある格子点(p2+1、q2)と外枠の右辺の格子点(p2+1、n)の座標を読み出すことになる。次いで、ステップS270で各格子点を結ぶx軸方向の線分を以下の式に従って求める。
a・x+b・y+c=0
【0077】
次いで、求めたx軸方向の線分に交差するy軸方向の線分を算出する処理を行う。ステップS272で格子点(p2、j)および格子点(m、j)の座標を読み出す。最初はj=q2+1であるから、指定領域の下辺と同じy軸方向の位置にある格子点(p2、q2+1)と外枠の下辺の格子点(m、q2+1)の座標を読み出すことになる。次いで、ステップS274で各格子点を結ぶy軸方向の線分を以下の式に従って求める。
a’・x+b’・y+c’=0
これにより、y軸方向の線分が求められたので、これら2直線の交点にある格子点を求める処理を行う。すなわち、ステップS276で2直線の交点の座標(x、y)を前述した(21)式および(22)式に従って算出する。
【0078】
次いで、ステップS278で(21)式、(22)式によって算出したx座標およびy座標を格子点(i、j)の座標としてストアする。次いで、ステップS280に進み、ポインタjをインクリメントし(1だけ進める)、続くステップS282でポインタjがnに等しくなったか否かを判別する。例えば、最初は指定領域の右辺と同じx軸方向の位置にある格子点(p2+1、q2)と外枠の右辺の格子点(p2+1、n)とを結ぶx軸方向の第1の線分上にある格子点の座標を算出しているから、この線分上に複数の格子点が存在している場合には、まだ両者が等しくなく、NOに分岐してステップS272に戻ってループを繰り返す。したがって、次回のループでは指定領域の右辺と同じx軸方向の位置にある格子点(p2+1、q2)と外枠の右辺の格子点(p2+1、n)とを結ぶx軸方向の第1の線分上にある次の(右側の)格子点の座標が算出されてストアされる。
【0079】
そして、同様のループを繰り返すことにより、j=nになると、外枠の右辺の位置までポインタjが進んだと判断してステップS282からステップS284に抜ける。ステップS284ではポインタiをインクリメントし(1だけ進める)、続くステップS286でポインタiがmに等しくなったか否かを判別する。例えば、いままでのルーチンでは指定領域の右辺と同じx軸方向の位置にある格子点(p2+1、q2)と外枠の右辺の格子点(p2+1、n)とを結ぶx軸方向の第1の線分上の格子点を指定領域の右辺と同じx軸方向の位置から外枠の右辺まで(nまで)求めたから、今度は下側に移動してx軸方向の第1の線分のすぐ下側にあるx軸方向の第2の線分の各格子点について上記同様の処理を行うことになる。
【0080】
そのため、ステップS286ではNOに分岐し、ステップS268に戻り、同様のループを繰り返す。これにより、x軸方向の第1の線分のすぐ下側にあるx軸方向の第2の線分の各格子点の座標が算出され、以下、同様にしてさらにその下側の線分の各格子点の座標が算出され、ステップS286でiがmに等しくなると、外枠の下辺の位置まで交差格子点が求められることになり、本ルーチンを終了する。このようにして、移動後の中間格子点(▲印)を外枠の下辺の格子点と結んだ線分上にあるすべての格子点の座標が算出される。
以上のルーチンを実行することにより、変形対象の内部の指定した範囲内の4つの小矩形をそっくりそのままx軸方向にdxなる量だけ、y軸方向にdyなる量だけ平行移動したときに、変形後のその他の各小矩形の頂点の座標が算出される。
【0081】
次に、前述したいわゆるライン貼り付け法の処理内容について、以下に具体的に詳述する。
ライン貼り付け処理のサブルーチン
図7に示したステップS34におけるライン貼り付け法(矩形から任意の四角形への変形方法)の具体的な内容は以下の通りである。
図15はライン貼り付け法の処理を示すサブルーチンのフローチャートであり、このサブルーチンの処理の対象となる画像データの例は図16(a)、(b)のように示される。すなわち、図16(a)は変形前の元画像データを示し、詳しくは変形元となるビット配列形式の画像データを分割した場合のある1つの小矩形の画像データ(つまり、変形前の小矩形画像データ)に対応する。ここで説明するライン貼り付け法は、図16(a)に示すように変形前の小矩形画像データとして縦(Y)方向が12ピクセル、横(X)方向が16ピクセルで構成される元画像データ(矩形ABCDで表される)を、図16(b)に示すような四角形A’B’C’D’に変形する内容である。その変形処理では、まず元画像データを12本の水平ライン(ライン0〜ライン11)に分割する。そして、分割した各ラインを画像変形態様に応じて変形後の四角形に順番に貼り付けていく処理が行われ、変形画像が得られる。
【0082】
サブルーチンのステップを進めながら、上記処理について説明する。
このサブルーチンに移行すると、まずステップS1100で辺A’B’についてラインの端点処理を行う。これは、変形後の四角形のラインの端点A’B’を求めるものである。なお、ステップS1100の処理(辺A’B’の位置を求める方法)については、後述のサブルーチンで詳述する。
すなわち、図16(a)(b)に示すように、分割した各ラインを画像変形態様に応じて変形後の四角形に順番に貼り付けていく処理では、以下のような状態に着目する必要がある。辺AB上にあった各ラインの一方の端点は辺A’B’上に、また、辺DC上にあった他方の端点は辺D’C’上に移動する。このとき、辺ABと辺A’B’および辺DCと辺D’C’では、それらの長さが異なるので、辺A’B’、辺D’C’上でラインの端点が重なったりすることがある。これは、図16(b)の☆印で示す部分であり、辺A’B’上のライン5およびライン6が重なっている。また、同一のラインを2回以上貼り付けなければならないこともある。これは、図16(b)の★印で示す2つの部分であり、辺D’C’上のライン3およびライン8が2回繰り返され、それぞれライン3、3’およびライン8、8’となっている。
【0083】
図17にラインを2回貼り付ける様子を示す。図17(a)は変形前の元画像データであり、詳しくは変形元となるビット配列形式の画像データを分割した場合のある1つの小矩形の画像データに対応する。図17(b)は変形後の1つの四角形の画像データである。変形前の画像データのライン3が、変形後は途中のドットから右側6ドットだけライン3、3’として2ライン分貼り付けられる。また、変形前の画像データのライン5とライン6が、変形後は最初のドットから7ドットまで(つまり左側7ドット分)については同じドットに貼り付けられ、以後の右側7ドットについてはライン5、ライン6として別個に貼り付けられる。なお、図17〜図25はライン貼り付け法を実行する場合の、複数の実行過程における変形前の小矩形および変形後の四角形を示すものであり、各過程の具体例は後述のサブルーチンを説明するときに述べる。
【0084】
次いで、ステップS1102で辺D’C’についてラインの端点処理を行う。これは、変形後の四角形のラインの端点D’C’を求めるものである。なお、ステップS1102の処理(辺D’C’の位置を求める方法)については、同様に後述のサブルーチンで詳述する。
このようにして、各ラインの端点が移動する辺A’B’と辺D’C’の位置が求められると、これらのラインの端点位置は図32に示すように、CPU31の内部レジスタ31aにある端点バッファにデータを格納する。この場合、内部レジスタ31aには辺A’B’上の端点バッファと、辺D’C’上の端点バッファという2つの格納エリアがある。そして、これらの各端点バッファではラインの端点の座標と、そのライン番号を対応付けて格納する。2つの端点バッファは端点の位置を読み出すときや、ラインの描画位置を決めるときに使用される。
【0085】
次いで、ステップS1104〜ステップS1110でラインを描画する処理を行う。まず、ステップS1104では2つの端点バッファからライン番号の同じデータを読み出す。次いで、ステップS1106で同じライン番号のラインが複数あるときには描画回数が最小になるように組み合せる。これは、図27に示すように、例えば辺A’B’上で同じライン番号のラインが3本あり、一方、辺D’C’上で同じライン番号のラインが2本ある場合、上側の各端点同士を1本のラインで引き、辺A’B’上の2つの端点と辺D’C’上の1つの端点とを2本のラインで引くような処理を行うものである。
次いで、ステップS1108で描画処理(詳細はサブルーチンで後述)を行う。次いで、ステップS1110ですべてのラインについて処理したか否かを判別し、NOのときはステップS1104に戻って同様の処理を繰り返す。そして、すべてのラインについてステップS1104〜ステップS1108の処理が終了すると、ステップS1110からYESに抜けてルーチンを終了する。このようにして、各小矩形が異なる四角形にそれぞれ変形され、変形対象の画像全体が滑らかに変形することになる。
【0086】
ライン端点処理のサブルーチン
次に、上記ステップS1100およびステップS1102におけるラインの端点処理のサブルーチンについて説明する。
図28はラインの端点処理(ステップS1110の処理)を示すサブルーチンのフローチャートである。まず、貼り付けるラインの一方の端点となる辺A’B’の位置を求める方法から説明する。なお、貼り付けるラインの他方の端点となる辺D’C’の位置を求める方法も同様である。
ステップS1200で座標決定用誤差e1、ライン選択用誤差e2、現在ライン番号をすべて[0]に初期設定する。座標決定用誤差e1とは、端点の位置を決めるとき又はラインの描画位置を決めるときに用いる座標決定用誤差のことである。ライン選択用誤差e2とは、端点に割り当てるラインを選択するときに用いるライン選択用誤差のことである。これにより、最初は各誤差が[0]になる。
【0087】
次いで、ステップS1202で処理を開始する点(A’又はD’)の座標をCPU31の内部レジスタ31aにある現在座標というエリアに格納する。例えば、貼り付けるラインの一方の端点となる辺A’B’の位置を求める処理では、A’の座標を格納する。一方、貼り付けるラインの他方の端点となる辺D’C’の位置を求める処理では、D’の座標を格納する。CPU31の内部レジスタ31aには図26に示すように、端点バッファの他に、以下のような格納エリアがある。
座標決定用誤差e1のエリア
座標決定用誤差増分Δe1のエリア
現在座標のエリア
ライン選択用誤差e2のエリア
ライン選択誤差増分Δe2のエリア
現在ライン番号
また、ドット選択用の格納エリアとしては、以下のようなものがある。
ドット選択用誤差e3のエリア
ドット選択用誤差増分Δe3のエリア
現在ドット番号のエリア
【0088】
次いで、ステップS1204でY方向のピクセル数がX方向のピクセル数より多いか否かを判別する。いま、貼り付けるラインの一方の端点となる辺A’B’の位置を求める場合の具体例は図18に示される。図18(a)に示す変形前のラインの一方の端点となる辺ABを示し、図18(b)は貼り付けるラインの一方の端点となる辺A’B’の様子を示し、さらに図18(c)にX方向およびY方向のピクセル数の変化を示している。この例に対応させて考えると、辺A’B’はY方向に11ピクセル、X方向に4ピクセルに渡って描画されるので、ステップS1204の判別結果はYESとなり、このケースではステップS1206に進む。一方、逆のケースではNOに分岐して図29に示すステップS1238に進む。
また、この場合、図18に示すケースでは点A’から点B’に向ってY座標を1ずつ変えていったときにX座標の変化する位置を求めると、そのとき変化した座標が辺A’B’の位置となる。したがって、無条件に位置の決る始点(点A’)を除く10個のドットを打つときには、X座標の変化する位置としてX座標が変化する3箇所を求めることになる。
【0089】
ステップS1206に進むと、座標決定用誤差増分Δe1を(Xピクセル数−1)/(Yピクセル数−1)に初期設定するとともに、ライン選択誤差増分Δe2を(元ライン数−1)/(Yピクセル数−1)に初期設定する。ステップS1200〜ステップS1206の処理により必要な初期設定が完了する。次いで、ステップS1208で現在のライン番号と現在座標を端点バッファ(図26参照)に格納する。次いで、ステップS1210で現在座標のY座標を変更する。次いで、ステップS1212で座標決定用誤差e1についての判別を以下のようにして行う。すなわち、選択誤差(初期値=0)eを決め、選択誤差eに誤差増分Δeを加える(e=e+Δe)。Δeは(X方向のピクセル数−1)/(Y方向のピクセル数−1)である。
【0090】
なお、ここでは、座標決定用であるからeをe1とし、ΔeをΔe1として処理をする。そうすると、e1=e1+Δe1となる。この値が1/2より大きくなったか否かを判別する。そして、誤差増分Δe1を加えた結果e1がe1≧(1/2)であれば、ステップS1214に進んで次に打つ点の座標(次の現在座標に相当)のX座標を変更する。これは、選択誤差に誤差増分を加え、その結果が1/2より大きいか小さいかによって処理を選択するもので、選択誤差が1/2以上のときに誤差を補正する。
【0091】
このようにすると、点A’から点B’に向ってY座標を1ずつ変えていったときに、少なくとも誤差増分Δe1が1の半分より大きい場合に、次の座標を変更するので、X座標の変化する位置が滑らかにつながることになる。なお、この方法はいわゆるBresenhamのアルゴリズムとして用いられるものである。
次いで、ステップS1216で誤差補正を行い、e1=e1−1とする。これは、選択誤差が1/2以上になって次の座標を変更したので、1を減算することにより、再び次の現在座標から誤差増分Δeを加えて同様の判別を始めるためである。その後、ステップS1218に進む。
一方、誤差増分Δe1を加えた結果e1がe1<(1/2)であれば、ステップS1214、ステップS1216をジャンプしてステップS1218に進む。このときは、次に打つ点のX座標は元のままにする。また、この場合は選択誤差e1は補正しない。以上のステップS1210〜ステップS1216を実行することにより、貼り付けるラインの一方の端点となる辺A’B’の位置が決定される。
【0092】
ここで、図18の場合(貼り付けるラインの一方の端点となる辺A’B’の位置を決定する場合)の具体例について説明する。
まず、最初の端点A’は無条件に決まる。この時点で、選択誤差eは[0]に初期設定されている。また、端点A’から端点B’に対してはY方向に11ピクセル、X方向に4ピクセルに渡って描画されるので、誤差増分Δeは
Δe=(4−1)/(11−1)
=0.30である。次いで、選択誤差eはe=0に初期設定されているからそのままとし、誤差増分ΔeとしてΔe=0.30を加えると、
e=0+0.30=0.30<(1/2)となる。したがって、このときは次に打つ点▲1▼のX座標は変更しない(図18(c)参照)。また、選択誤差eは1/2より小さいので、選択誤差eの補正は行わない。次いで、ここまでの選択誤差e=0.30に誤差増分ΔeとしてΔe=0.30を加えると、
e=0.30+0.30=0.60≧(1/2)となるので、今度は次に打つ点▲2▼のX座標を変更する(図18(c)参照)。以上の処理を繰り返すことにより、点▲5▼、▲9▼の位置でX座標の変更が行われ、最終的に図18(c)に示すように、端点B’の位置が決定される。
【0093】
一方、上記ステップS1204でY方向のピクセル数がX方向のピクセル数より小さいときは図29のステップS1238に進み、今度はY座標の方を変更する処理を行う。すなわち、ステップS1238で座標決定用誤差増分Δe1を(Yピクセル数−1)/(Xピクセル数−1)に初期設定するとともに、ライン選択誤差増分Δe2を(元ライン数−1)/(Xピクセル数−1)に初期設定する。次いで、ステップS1240で現在のライン番号と現在座標を端点バッファ(図26参照)に格納する。次いで、ステップS1242で現在座標のX座標を変更する。次いで、ステップS1244で座標決定用誤差e1についての判別を以下のようにして行う。すなわち、選択誤差(初期値=0)eを決め、選択誤差eに誤差増分Δeを加える(e=e+Δe)。Δeは(Y方向のピクセル数−1)/(X方向のピクセル数−1)である。なお、ここでは、同様に座標決定用であるからeをe1とし、ΔeをΔe1として処理をする。そうすると、e1=e1+Δe1となる。この値が1/2より大きくなったか否かを判別する。そして、誤差増分Δe1を加えた結果e1がe1≧(1/2)であれば、ステップS1246に進んで次に打つ点の座標(次の現在座標に相当)のY座標を変更する。これは、選択誤差に誤差増分を加え、その結果が1/2より大きいか小さいかによって処理を選択するもので、選択誤差が1/2以上のときに誤差を補正する。
【0094】
このようにすると、点D’から点C’に向ってX座標を1ずつ変えていったときに、少なくとも誤差増分Δe1が1の半分より大きい場合に、次の座標を変更するので、Y座標の変化する位置が滑らかにつながることになる。次いで、ステップS1248で誤差補正を行い、e1=e1−1とする。これは、選択誤差が1/2以上になって次の現在座標のY座標を変更したので、1を減算することにより、再び次の現在座標から誤差増分Δeを加えて同様の判別を始めるためである。その後、ステップS1250に進む。
一方、誤差増分Δe1を加えた結果e1がe1<(1/2)であれば、ステップS1246、ステップS1248をジャンプしてステップS1250に進む。このときは、次に打つ点のY座標は元のままにする。また、この場合は選択誤差e1は補正しない。以上のステップS1242〜ステップS1248を実行することにより、貼り付けるラインの一方の端点となる辺D’C’の位置が決定される。
【0095】
ここで、図19の場合(貼り付けるラインの他方の端点となる辺D’C’の位置を決定する場合)の具体例について説明する。
図19(a)は変形前のラインの他方の端点となる辺DCを示し、図19(b)は貼り付けるラインの他方の端点となる辺D’C’の様子を示し、さらに図19(c)は辺D’C’におけるX方向およびY方向のピクセル数の変化を示している。この例に対応させて考えると、辺D’C’はY方向に14ピクセル、X方向に5ピクセルに渡って描画されるので、点D’から点C’に向ってY座標を1ずつ変えていったときにX座標の変化する位置を求めると、そのとき変化した座標が辺D’C’の位置となる。したがって、無条件に位置の決る始点(点D’)を除く13個のドットを打つときには、X座標の変化する位置としてX座標が変化する4箇所を求めることになる。
【0096】
まず、最初の端点D’は無条件に決まる。この時点で、選択誤差eは[0]に初期設定されている。また、端点D’から端点C’に対してはY方向に14ピクセル、X方向に5ピクセルに渡って描画されるので、誤差増分Δeは
Δe=(5−1)/(14−1)
=0.30である。次いで、選択誤差eはe=0に初期設定されているからそのままとし、誤差増分ΔeとしてΔe=0.30を加えると、
e=0+0.30=0.30<(1/2)となる。したがって、このときは次に打つ点▲1▼のX座標は変更しない(図19(c)参照)。また、選択誤差eは1/2より小さいので、選択誤差eの補正は行わない。次いで、ここまでの選択誤差e=0.30に誤差増分ΔeとしてΔe=0.30を加えると、
e=0.30+0.30=0.60≧(1/2)となるので、今度は次に打つ点▲2▼のX座標を変更する(図19c)参照)。以上の処理を繰り返すことにより、点▲5▼、▲9▼、(12)(なお、10以降の○付き数字は表示が困難につき、かっこ付きの半角数字で表す)の位置でX座標の変更が行われ、最終的に図19(c)に示すように、端点C’の位置が決定される。
【0097】
さて、再び図29のフローチャートに戻り、端点位置の決定が行われると、ステップS1218に進む。ステップS1218〜ステップS1236およびステップS1250〜ステップS1266では、辺A’B’、辺D’C’に分割された水平ラインのうち、どのラインの端点を割り当てるかを求める処理を行う。
まず、図20(b)に示す辺A’B’のように図20(a)に示す元となる辺ABよりも短い辺に、貼り付けるラインの端点を割り当てる処理内容について説明する。元画像データの水平ライン数は12本、辺A’B’に貼り付けることのできるライン数は11本なので、元画像データの12本のラインのうち、2本のラインの端点が辺A’B’上で重なる。重なるラインの選択の処理は、次のようになる。
【0098】
ステップS1218で選択誤差(初期値=0)eを決め、選択誤差eに誤差増分Δeを加える(e=e+Δe)。Δeは(元画像のライン数−1)/(辺A’B’のピクセル数−1)である。なお、ここでは、ライン選択用であるからeをe2とし、ΔeをΔe2として処理をする。そうすると、e2=e2+Δe2となる。次いで、この値が1/2より大きくなったか否かをステップS1220で判別する。そして、誤差増分Δe2を加えた結果e2がe2≧(1/2)であれば、ステップS1224に進んで現在のライン番号を[1]だけインクリメントする(つまり、次のライン番号に進める)。これは、選択誤差に誤差増分を加え、その結果が1/2より大きいか小さいかによって処理を選択するもので、選択誤差が1/2以上のときに誤差を補正する。現在のライン番号を1進めることにより、辺A’B’上の次の点には次のラインの端点が割り当てられる。
【0099】
このようにすると、点A’から点B’に向ってX座標を1ずつ変えていったときに、少なくとも誤差増分Δe2が1の半分より大きい場合に、次のライン番号に変更するので、ライン端点の変化する位置が滑らかにつながることになる。
また、ステップS1220でe2が1/2未満のときはステップS1236にジャンプする。ステップS1236ではすべての端点について処理したか否かを判別し、すべての端点について処理が終了していなければ、ステップS1208に戻って同様の処理を繰り返す。したがって、誤差増分Δe2が1の半分より大きくなった時点でステップS1236へジャンプせず、ステップS1224の方に進むことになる。
【0100】
ステップS1224を経ると、続くステップS1224で誤差補正を行い、e2=e2−1とする。これは、選択誤差が1/2以上になって次のライン番号に変更したので、1を減算することにより、再び次のライン番号から誤差増分Δeを加えて同様の判別を始めるためである。次いで、ステップS1228で再び選択誤差e2が1/2以上であるか否かを判別する。これは、誤差補正を行った結果について、再度選択誤差e2の大ささを判断するものである。そして、誤差補正を行った結果、選択誤差e2が依然として1/2以上であれば、ステップS1230に進み、現在のライン番号と現在座標をCPU31の内部レジスタ31a内の端点バッファに格納する。次いで、ステップS1232でライン番号を[1]だけインクリメントする(つまり、次のライン番号に進める)。これにより、辺A’B’上の同じ点に、次のラインの端点も割り当てられる。そして、選択誤差e2が1/2未満になるまで、同じ点に次のラインの端点が順次割り当てられていく。
【0101】
次いで、ステップS1234で誤差補正を行い、e2=e2−1とする。これは、上記同様に選択誤差が1/2以上になって次のライン番号に変更したので、1を減算することにより、再び次のライン番号から誤差増分Δeを加えて同様の判別を始めるためである。その後、ステップS1228に戻って同様の処理を繰り返す。したがって、誤差を補正した結果(選択誤差)e2が未だ1/2より大きければ、ライン番号を更に1進めて辺A’B’上の同じ点に、次のラインの端点が割り当てられ、選択誤差e2が1/2未満になるまで、同じ点に次のラインの端点が割り当てられることになる。
【0102】
一方、ステップS1228で誤差増分Δe2を加えた結果e2がe2<(1/2)であれば、ステップS1236にジャンプする。このときは、次のライン番号に変更されず、ライン番号は元のままである。また、この場合は選択誤差e2は補正しない。ステップS1236ではすべての端点について処理したか否かを判別する。すべての端点について処理が終了していなければ、ステップS1208に戻って処理を繰り返す。これにより、点A’から点B’に向ってX座標を1ずつ変えていったときに、誤差増分Δe2の大きさに応じて上記のような処理が繰り返される。誤差増分Δe2が1/2より大きい場合に、次のライン番号に変更されていく。以上のステップS1218〜ステップS1236を実行することにより、辺A’B’のように元となる辺ABよりも短い辺に、貼り付けるラインの端点を割り当てる場合の各ライン端点の位置が決定される。
【0103】
ここで、図20の場合(辺A’B’のように元となる辺ABよりも短い辺に、ラインの一方の端点を割り当てる場合)の具体例について説明する。
図20(a)は変形前のラインの一方の端点となる辺ABを示し、図20(b)は貼り付けるラインの一方の端点となる辺A’B’の様子を示し、さらに図20(c)は辺A’B’におけるX方向およびY方向のピクセル数の変化を示している。まず、ライン0の端点が頂点A’上に決まる。この時点でライン番号は0、選択誤差eは[0]に初期設定されている。また、誤差増分Δeは
Δe=(12−1)/(11−1)
=1.10である。次いで、選択誤差eはe=0に初期設定されているからそのまとし、誤差増分ΔeとしてΔe=1.10を加えると、
e=0+1.10=1.10≧(1/2)となる。これにより、ライン番号を1進める(ライン1になる:図20(c)参照)。したがって、辺A’B’上の点▲1▼にはライン1の端点が割り当てられる(図20(b)参照)。このとき、選択誤差eを次のように補正する。
e=1.10−1=0.10<1/2
【0104】
ここまでの選択誤差e=0.10に、再び誤差増分Δe=1.10を加えると、
e=0.10+1.10=1.20≧(1/2)となる。これにより、ライン番号を1進める(今度はライン2になる:図20(c)参照)。したがって、辺A’B’上の点▲2▼にはライン2の端点が割り当てられる(図20(b)参照)。このとき、選択誤差eを次のように補正する。
e=1.20−1=0.20<1/2
以下、同様の処理を行い、辺A’B’上の点▲3▼にはライン3の端点が、点▲4▼にはライン4の端点が、点▲5▼にはライン5の端点がそれぞれ割り当てられる(図20(b)参照)。このとき、ライン5を割り当てて選択誤差eを補正した時点で選択誤差eは0.50になる。選択誤差eを補正した時点で未だe≧1/2なので、ライン番号を更に1進めて(ライン6になる)、点▲5▼にライン6の端点も割り当てる。次いで、さらに選択誤差eを以下のように補正する。
e=0.50−1=−0.50<1/2
以上の処理を繰り返すことにより、辺A’B’に分割された元の水平ライン内のどのラインの端点を割り当てるかが決まる。
【0105】
さて、再び図29のフローチャートに戻って説明する。
上述の説明は辺A’B’のように元となる辺ABよりも短い辺に、貼り付けるラインの端点を割り当てる処理内容であったが、今度は、図21(b)に示す辺D’C’のように図21(a)に示す元となる辺DCよりも長い辺に、貼り付けるラインの端点を割り当てる処理内容について説明する。この場合には図29に示すステップS1250以降の処理が実行される。これは、先のステップS1204の判別結果がNOである場合に相当し、この判別結果がNOということは元となる辺DCよりも長い辺D’C’の処理に進むケースである。
ステップS1204の判別結果がNOであるときは図29のステップS1238に分岐し、端点の位置決定を行った後、ステップS1250以降の各ステップを実行する。
まず、元画像データの水平ライン数は12本、辺D’C’に貼り付けることのできるライン数は14本なので、元画像データの12本のラインのうち、2本のラインの端点が辺D’C’上で2回貼り付けられることになる。貼り付けられるラインの選択の処理は、次のようになる。
【0106】
ステップS1250で選択誤差(初期値=0)eを決め、選択誤差eに誤差増分Δeを加える(e=e+Δe)。Δeは(元画像のライン数−1)/(辺D’C’のピクセル数−1)である。なお、ここでは、ライン選択用であるからeをe2とし、ΔeをΔe2として処理をする。そうすると、e2=e2+Δe2となる。次いで、この値が1/2より大きくなったか否かをステップS1252で判別する。そして、誤差増分Δe2を加えた結果e2がe2≧(1/2)であれば、ステップS1254に進んで現在のライン番号を[1]だけインクリメントする(つまり、次のライン番号に進める)。これは、選択誤差に誤差増分を加え、その結果が1/2より大きいか小さいかによって処理を選択するもので、選択誤差が1/2以上のときに誤差を補正する。現在のライン番号を1進めることにより、辺D’C’上の次の点には次のラインの端点が割り当てられる。
【0107】
このようにすると、点D’から点C’に向ってX座標を1ずつ変えていったときに、少なくとも誤差増分Δe2が1の半分より大きい場合に、次のライン番号に変更するので、ライン端点の変化する位置が滑らかにつながることになる。
また、ステップS252でe2が1/2未満のときはステップS266にジャンプする。ステップS1266ではすべての端点について処理したか否かを判別し、すべての端点について処理が終了していなければ、ステップS1240に戻って同様の処理を繰り返す。したがって、誤差増分Δe2が1の半分より大きくなった時点でステップS1266へジャンプせず、ステップS1254の方に進むことになる。
【0108】
ステップS1254を経ると、続くステップS1256で誤差補正を行い、e2=e2−1とする。これは、選択誤差が1/2以上になって次のライン番号に変更したので、1を減算することにより、再び次のライン番号から誤差増分Δeを加えて同様の判別を始めるためである。次いで、ステップS1258で再び選択誤差e2が1/2以上であるか否かを判別する。これは、誤差補正を行った結果について、再度選択誤差e2の大きさを判断するものである。そして、誤差補正を行った結果、選択誤差e2が依然として1/2以上であれば、ステップS1260に進み、現在のライン番号と現在座標をCPU31の内部レジスタ31a内の端点バッファに格納する。次いで、ステップS1262でライン番号を[1]だけインクリメントする(つまり、次のライン番号に進める)。これにより、辺D’C’上の同じ点に、次のラインの端点も割り当てられる。そして、選択誤差e2が1/2未満になるまで、同じ点に次のラインの端点が順次割り当てられていく。
【0109】
次いで、ステップS1264で誤差補正を行い、e2=e2−1とする。これは、上記同様に選択誤差が1/2以上になって次のライン番号に変更したので、1を減算することにより、再び次のライン番号から誤差増分Δeを加えて同様の判別を始めるためである。その後、再びステップS1258に戻って同様の処理を繰り返す。したがって、誤差を補正した結果(選択誤差)e2が未だ1/2より大きければ、ライン番号を更に1進めて辺D’C’上の同じ点に、次のラインの端点が割り当てられることになる。そして、選択誤差e2が1/2未満になるまで、同じ点に次のラインの端点が割り当てられていく。
【0110】
一方、ステップS258で誤差増分Δe2を加えた結果e2がe2<(1/2)であれば、ステップS1266にジャンプする。このときは、次のライン番号に変更されず、ライン番号は元のままである。また、この場合は選択誤差e2は補正しない。ステップS1266ではすべての端点について処理したか否かを判別する。すべての端点について処理が終了していなければ、ステップS1240に戻って処理を繰り返す。これにより、点D’から点C’に向ってX座標を1ずつ変えていったときに、誤差増分Δe2の大きさに応じて上記のような処理が繰り返される。誤差増分Δe2が1/2より大きい場合に、次のライン番号に変更されていく。以上のステップS1250〜ステップS1266を実行することにより、辺D’C’のように元となる辺DCよりも長い辺に、貼り付けるラインの端点を割り当てる場合の各ライン端点の位置が決定される。
【0111】
ここで、図21の場合(辺D’C’のように元となる辺ABよりも長い辺に、ラインの一方の端点を割り当てる場合)の具体例について説明する。
図21(a)は変形前のラインの一方の端点となる辺DCを示し、図21(b)は貼り付けるラインの一方の端点となる辺D’C’の様子を示し、さらに図21(c)は辺D’C’におけるX方向およびY方向のピクセル数の変化を示している。まず、ライン0の端点が頂点てD’上に決まる。この時点でライン番号は0、選択誤差eは[0]に初期設定されている。また、誤差増分Δeは
Δe=(12−1)/(14−1)
=0.84である。次いで、選択誤差eはe=0に初期設定されているからそのままとし、誤差増分ΔeとしてΔe=0.84を加えると、
e=0+0.84=0.84≧(1/2)となる。これにより、ライン番号を1進める(ライン1になる:図21(c)参照)。したがって、辺D’C’上の点▲1▼にはライン1の端点が割り当てられる(図21(b)参照)。このとき、選択誤差eを次のように補正する。
e=0.84−1=−0.16<1/2
【0112】
同様に、辺D’C’上の点▲2▼にはライン2の端点が、点▲3▼にはライン3の端点が割り当てられる(図21(b)参照)。
ライン3を割り当てて選択誤差eを補正して時点で、選択誤差eは−0.48になっている。ここまでの選択誤差e=−0.48に再び誤差増分Δe=0.84を加えると、
e=−0.48+0.84=0.36<(1/2)になるので、ライン3を点▲4▼にもう一度貼り付ける(図21(c)参照)。このとき、選択誤差eは補正しない。
以上の処理を繰り返すことにより、辺D’C’に分割された元の水平ライン内のどのラインの端点を割り当てるかが決まる。ライン端点処理が終わった時点における端点バッファへの格納データは図32に示すようになる。図32では、辺A’B’上のライン0〜ライン11の12個の端点位置が座標によって端点バッファに記憶される。また、辺D’C’上のライン0〜ライン11(そのうちライン3とライン8は2つある)の14個の端点位置が座標によって端点バッファに記憶される。
【0113】
ライン描画処理のサブルーチン
さて、その後はこのようにして求めた辺A’B’上に一方のラインの端点を持ち、辺D’C’上に他方の端点を持つような複数のラインに元画像データ(矩形ABCD)の対応するラインを順番に貼り付けていけば画像変形が行える。ただし、このとき転送先と転送元ではラインの長さ(ピクセル数)が異なるので、ライン毎に拡大あるいは縮小をしながら貼り付けていくことになる。
そこで、続いて前述の図15に示したステップS1108のラインの描画処理のサブルーチンについて説明する。
図30はラインの描画処理を示すサブルーチンのフローチャートである。まず、貼り付けるラインの位置を求める処理から説明する。具体例としては、後にライン0の貼り付け位置を求める方法を説明をする。他のラインの貼り付け位置についても同様である。
まず、ステップS1300で座標決定用誤差e1、ドット選択用誤差e3、現在ドット番号をすべて[0]に初期設定する。座標決定用誤差e1とは、ここではラインの描画位置を決めるときに用いる座標決定用誤差のことである。ドット選択用誤差e3とは、ラインに割り当てるドットを選択するときに用いるドット選択用誤差のことである。これにより、最初は各誤差が[0]になる。
【0114】
次いで、ステップS1302で辺A’B’上の端点の座標をCPU31の内部レジスタ31aにある現在座標というエリアに格納する(図26参照)。なお、ドット選択処理の過程で使用される関連の格納エリアとしては、ドット選択用誤差e3のエリア、ドット選択用誤差増分Δe3のエリア、現在ドット番号のエリアが用いられる。
次いで、ステップS1304でY方向のピクセル数がX方向のピクセル数より多いか否かを判別する。いま、ライン0を貼り付けるため各ドットの位置を求める場合の具体例は図22に示される。図22(a)は変形前のラインADを示し、図22(b)は変形後のライン辺A’D’の様子を示し、さらに図22(c)は辺A’D’におけるX方向およびY方向のピクセル数の変化を示している。この例に対応させて考えると、辺A’D’はY方向に10ピクセル、X方向に2ピクセルに渡って描画されるので、ステップS1304の判別結果はYESとなり、このケースではステップS1306に進む。一方、逆のケースではNOに分岐して図29に示すステップS1338に進む。
また、この場合、図22に示すケースでは点A’から点D’に向ってX座標を1ずつ変えていったときにY座標の変化する位置を求めると、そのとき変化した座標がラインA’D’を貼り付けする位置となる。したがって、無条件に位置の決る始点(点A’)を除く9個のドットを打つときには、X座標の変化する位置としてX座標が変化する1箇所を求めることになる。
【0115】
ステップS1306に進むと、座標決定用誤差増分Δe1を(Xピクセル数−1)/(Yピクセル数−1)に初期設定するとともに、ドット選択誤差増分Δe3を(転送元ドット数−1)/(転送先ドット数−1)に初期設定する。ステップS1300〜ステップS1306の処理により必要な初期設定が完了する。次いで、ステップS1308で現在座標に描画されていなければ、現在ドット番号のドットを描画する。これにより、該当するラインの最初の点▲1▼がドットで描画される。次いで、ステップS1310で現在座標のY座標を変更する。次いで、ステップS1312で座標決定用誤差e1についての判別を以下のようにして行う。すなわち、選択誤差(初期値=0)eを決め、選択誤差eに誤差増分Δeを加える(e=e+Δe)。Δeは(Y方向のピクセル数−1)/(X方向のピクセル数−1)である。なお、ここでは、座標決定用であるからeをe1とし、ΔeをΔe1として処理をする。そうすると、e1=e1+Δe1となる。この値が1/2より大きくなったか否かを判別する。そして、誤差増分Δe1を加えた結果e1がe1≧(1/2)であれば、ステップS1314に進んで次に打つ点の座標(次の現在座標に相当)のX座標を変更する。これは、選択誤差に誤差増分を加え、その結果が1/2より大きいか小さいかによって処理を選択するもので、選択誤差が1/2以上のときに誤差を補正する。
【0116】
このようにすると、点A’から点D’に向ってX座標を1ずつ変えていったときに、少なくとも誤差増分Δe1が1の半分より大きい場合に、次の座標を変更するので、Y座標の変化する位置が滑らかにつながることになる。次いで、ステップS1316で誤差補正を行い、e1=e1−1とする。これは、選択誤差が1/2以上になって次の座標を変更したので、1を減算することにより、再び次の現在座標から誤差増分Δeを加えて同様の判別を始めるためである。その後、ステップS1318に進む。
また、誤差増分Δe1を加えた結果e1がe1<(1/2)であれば、ステップS1314、ステップS1316をジャンプしてステップS1318に進む。このときは、次に打つ点のX座標は元のままにする。また、この場合は選択誤差e1は補正しない。以上のステップS1310〜ステップS1316を実行することにより、Y方向のピクセル数がX方向のピクセル数より多い場合における該当するラインの貼り付け位置が決定される。
【0117】
一方、上記ステップS1304でY方向のピクセル数がX方向のピクセル数より小さいときは図31のステップS1328に進み、今度はX座標の方を変更する処理を行う。すなわち、ステップS1328で座標決定用誤差増分Δe1を(Yピクセル数−1)/(Xピクセル数−1)に初期設定するとともに、ドット選択誤差増分Δe3を(転送元ドット数−1)/(転送先ドット数−1)に初期設定する。次いで、ステップS1330で現在座標に描画されていなければ、現在ドット番号のドットを描画する。これにより、該当するラインの最初の点▲1▼がドットで描画される。次いで、ステップS1332で現在座標のX座標を変更する。次いで、ステップS1334で座標決定用誤差e1についての判別を以下のようにして行う。
【0118】
すなわち、選択誤差(初期値=0)eを決め、選択誤差eに誤差増分Δeを加える(e=e+Δe)。Δeは(Y方向のピクセル数−1)/(X方向のピクセル数−1)である。なお、ここでは、座標決定用であるからeをe1とし、ΔeをΔe1として処理をする。そうすると、e1=e1+Δe1となる。この値が1/2より大きくなったか否かを判別する。そして、誤差増分Δe1を加えた結果e1がe1≧(1/2)であれば、ステップS1336に進んで次に打つ点の座標(次の現在座標に相当)のY座標を変更する。これは、選択誤差に誤差増分を加え、その結果が1/2より大きいか小さいかによって処理を選択するもので、選択誤差が1/2以上のときに誤差を補正する。
【0119】
このようにすると、点A’から点D’に向ってX座標を1ずつ変えていったときに、少なくとも誤差増分Δe1が1の半分より大きい場合に、次の座標を変更するので、Y座標の変化する位置が滑らかにつながることになる。次いで、ステップS1340で誤差補正を行い、e1=e1−1とする。これは、選択誤差が1/2以上になって次の座標を変更したので、1を減算することにより、再び次の現在座標から誤差増分Δeを加えて同様の判別を始めるためである。その後、ステップS1342に進む。
また、誤差増分Δe1を加えた結果e1がe1<(1/2)であれば、ステップS1338、ステップS1340をジャンプしてステップS1342に進む。このときは、次に打つ点のX座標は元のままにする。また、この場合は選択誤差e1は補正しない。以上のステップS1332〜ステップS1340を実行することにより、Y方向のピクセル数がX方向のピクセル数より小さい場合における該当するラインの貼り付け位置が決定される。
【0120】
なお、上記処理は前述した図28に示すステップS1210〜ステップS1216と同様の処理内容であるが、図28のルーチンに比べてXとYが逆になっている部分がある。これは、X方向とY方向のピクセル数の多い方を基準として考えているからである。図28のルーチンではピクセル数の多いY座標を基準として考え、Y座標を1つずつ変えていったときに、X座標がどう変化するかを決定したのに対して、図30のルーチンではピクセル数の多いX座標を基準として考え、X座標を1つずつ変えていったときに、Y座標がどう変化するかを決定している。
他のラインの貼り付け位置についても、同様の方法で求める処理が行われる。
【0121】
以上で、各ラインの貼り付け位置が求まったので、次に、元となる水平ドットラインのドット内のうち、どのドットを割り当てる(つまり、ドットを選択する)かを求める処理内容を説明する。
まず、ドット選択の処理として示されるステップS1318以降の処理で、転送先ラインのピクセル数が転送元ラインのピクセル数より少ないとき、つまりラインを縮小する方法を説明する。この方法は、ドット選択の処理であるステップS1318〜ステップS1326で示される。
転送元ラインの最初のドット(ドット0)を無条件に選択するものとすると、その他のドットの選択の方法は以下のようになる。すなわち、まずステップS1318で選択誤差(初期値=0)eを決め、選択誤差eに誤差増分Δeを加える(e=e+Δe)。Δeは(転送元のドット数−1)/(転送先のドット数−1)である。なお、ここでは、ドット選択用であるからeをe3とし、ΔeをΔe3として処理をする。そうすると、e3=e3+Δe3となる。
【0122】
次いで、この値が1/2より大きくなったか否かをステップS1320で判別する。そして、誤差増分Δe3を加えた結果e3がe3≧(1/2)であれば、ステップS1322に進んで現在ドット番号(転送元ラインのドット番号)を[1]だけインクリメントする(つまり、次のドット番号に進める)。これは、選択誤差に誤差増分を加え、その結果が1/2より大きいか小さいかによって処理を選択するもので、選択誤差が1/2以上のときに誤差を補正する。転送元ラインのドット番号を1進めることにより、辺AD上で次に選択すべき転送元ラインのドット番号が割り当てられる。
【0123】
このようにすると、点Aから点Dに向ってX座標を1ずつ変えていったときに、少なくとも誤差増分Δe3が1の半分より大きい場合に、次のドット番号に変更するので、ドットの変化する位置が滑らかにつながることになる。次いで、ステップS1324で誤差補正を行い、e3=e3−1とする。これは、選択誤差が1/2以上になって次のドット番号を変更したので、1を減算することにより、再び次の現在ドット番号から誤差増分Δeを加えて同様の判別を始めるためである。その後、ステップS1344に戻ってステップS1344〜ステップS1348のループを繰り返す。そして、ステップS1320でe3が1/2未満になると、ステップS1350に分岐する。
【0124】
一方、ステップS1320でe3が当初から1/2未満のときはステップS1326にジャンプする。ステップS1326ではすべてのドットについて処理したか否かを判別し、すべてのドットについて処理が終了していなければ、ステップS1330に戻って同様の処理を繰り返す。したがって、誤差増分Δe3が1の半分より大きくなった時点ではステップS1350へジャンプせず、ステップS1346の方へ進むことになる。
このように、誤差増分Δe3を加えた結果(選択誤差)e3がe3<(1/2)であれば、転送先ラインの次のドットには1つ前のドットと同じデータが再び転送される。このとき、水平ドット番号と選択誤差e3の変更は行われない。
【0125】
ここで、ドット選択の具体例について図24を参照して説明する。
図24(a)は変形前の転送元ラインのドットの様子を示し、図24(b)は変形後の転送先ラインのドットの様子を示し、さらに図24(c)は転送ラインにおけるX方向およびY方向のピクセル数の変化を示している。この例は、転送先ラインのピクセル数が転送元ラインのピクセル数より多いとき、つまりラインを拡大する処理に相当するものである。
この例に対応させて考えると、転送元ラインのドット数は16個、転送先ラインのドット数は17個なので、転送先の17個のドットのうち1個は1つ前のドットと同じデータを転送することになる。転送元ラインの最初のドット(ドット0)を無条件に転送するものとすると、その他のドットの転送の処理は次のようにして行われる。
【0126】
まず、最初にドット0を転送する。この時点で、選択誤差eは[0]に初期設定され、ドット番号は0になっている。また、転送元ラインのドット数は16個、転送先ラインのドット数は17個であるから、誤差増分Δeは
Δe=(16−1)/(17−1)
=0.93である。次いで、選択誤差eはe=0に初期設定されているからそのままとし、誤差増分ΔeとしてΔe=0.93を加えると、
e=0+0.93=0.93≧(1/2)となる。したがって、このときはドット番号を1進める(ドット1になる)。同時に、選択誤差eを以下のように補正する。
e=0.93−1=−0.07<(1/2)
この時点で選択誤差eが1/2より小さくなるので、点▲1▼にはドット1が転送される(図24(b)、図24(c)参照)。
【0127】
次いで、同様にここまでの選択誤差e=−0.07に誤差増分ΔeとしてΔe=0.93を加えると、
e=−0.07+0.93=0.86≧(1/2)になるので、ドット番号を1進める(ドット2になる)とともに、選択誤差eを以下のように補正する。
e=0.86−1=−0.14<(1/2)
この時点で選択誤差eが1/2より小さくなり、点▲2▼に表示すべきドットとして、ドット2が転送される(図24(b)、図24(c)参照)。
【0128】
以後、同様の処理を行うと、点▲3▼にはドット3が、点▲4▼にはドット4が、点▲5▼にはドット5が、点▲6▼にはドット6が、点▲7▼にはドット7がそれぞれ割り当てられる。ドット7を割り当てた時点で選択誤差eは−0.49になる。ここまでの選択誤差e=−0.49に誤差増分Δe=0.93を加えると、
e=−0.49+0.93=0.44<(1/2)になるので、今度はドット番号は7のままで、選択誤差eも変更しない。したがって、点▲8▼にはドット7が再び転送される(図24(b)、図24(c)参照)。
以上の処理を繰り返すことにより、転送先ラインの16個のドットから1個のドット(ドット7)が2回転送されて、転送先ラインの17個のドットが決定される。このようにして、転送先ラインのピクセル数が転送元ラインのピクセル数より多い場合に、ラインを拡大する処理が行われる。
【0129】
上述した各プログラムを実行することにより、変形前の画像データのラインを変形後の画像データとして貼り付ける処理が行われるが、このときラインの貼り付けは辺A’B’と辺D’C’のうち、長い方の辺が有するピクセル数分だけ行われる。例えば、図16の例では辺A’B’と辺D’C’の各ピクセル数を比較すると、辺A’B’のピクセル数が11、辺D’C’のピクセル数が14であるから、辺D’C’のピクセル数分(=14)だけ行われる。具体的には、図16(b)に示すように辺D’C’のピクセル数に対応して、ライン0、ライン0、ライン1、ライン2、ライン3、ライン3’、ライン4、ライン5、ライン6、ライン7、ライン8、ライン8’、ライン9、ライン10、ライン11の14回ラインの貼り付けるが行われる。そして、各ラインを貼り付けた最終的な状態は図25(b)のように示される。なお、図25(a)は変形前の画像データのラインである。
なお、図17(a)、(b)に示すように貼り付けた2つのラインが重なる部分が生じるが、本実施例では先に書かれたものを優先するようにしている。また、この他に、後に書かれたものを優先する方法、あるいは重なった部分では2つのドットデータの色コードを合成する毎に、その値を加えて1/2する等の処理方法もある。ドットデータの色コードを合成する場合には、例えばR(赤成分)、G(緑成分)、B(青成分)というように色コードを分ける。
【0130】
このように本実施例では、ビット配列形式の画像データを有する変形対象を複数の小矩形に分割し、変形対象全体が滑らかに変形されるように、各小矩形を座標変換処理に従って異なる小四角形にそれぞれ変形することが行われる。このとき、小矩形の変形処理では、変形対象の内部の指定範囲に含まれる4つの小多角形の頂点を少なくとも各頂点の相対位置が変らないように下方に平行移動したとき、変形対象全体が滑らかに変形されるように他の小矩形の頂点を移動させ、移動した他の小矩形の頂点を基準となる小矩形の頂点に基づいて算出し、この算出した頂点に対応して各小矩形を四角形に変形することが行われる。その後、変形前の小矩形に含まれるビット配列形式の画像データの配列が各小四角毎にライン貼り付け法に従って変形後の小四角形のデータに対応するように順次変形されて変形後の全体画像が作成される。
その結果、例えば、図1(a)に示すようなビット配列形式の「目」の画像を図1(b)に示すような「目」の画像に滑らかに変形させることができる。
【0131】
したがって、変形対象の画像データの配列に対して各小矩形毎に変形処理が行われるので、従来のように全く異なる全体の画像データを予め持つ必要がなく、少ないメモリ容量で、ビット配列形式のデータを有する画像を自由に変形することができる。
また、変形対象を複数の小矩形に分割し、各小矩形毎に変形処理が行われるので、変形に自由度があり、予めメモリに多くのデータを持たなくても、画像を滑らかに変形することができる。
特に、変形対象の内部の指定範囲に含まれる小多角形をそのまま平行移動させる変形法を使用することにより、変形後のすべての小四角形の頂点の位置データ(例えば、座標)を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。さらに、この変形法を用いると、変形対象の外枠の形を変えずに、また変形対象の指定した範囲に含まれる小多角形を変形せずに任意の場所に移動でき、その他の小多角形のみを変形することができる。よって、画像の外形(例えば、大きさ)および画像データの一部分を変えずに、その場所を移動したいという場合に有効である。
例えば、図1(a)に示すようなビット配列形式の「目」の画像を変形する場合、「目」の形を変えずに、瞳にうつる影の位置を変えたいようなときに有効に活用することができる。
【0132】
具体的な波及効果としては、本発明の適用により、例えばアニメーション、ゲーム等のキャラクター又は背景データ等のようにドットで構成され、かつ各ドット毎に表示色番号あるいはパレット番号を持つようなビット配列形式の画像を、自由にかつ滑らかに変形することができる。その結果、1つの元画像データから元画像データの一部又は全部が滑らかに変形した複数の画像データを作成することができる。
また、アニメーションに適用した場合、従来のように少しずつその形の異なる複数の画像データを予めメモリに持っておかなくても、一定時間毎に元画像データを本発明の変形法を用いて変形すれば、少ないメモリ容量で従来と同等のアニメーションを行うことができる。
ゲーム等に複数のキャラクターを登場させる場合にも、1つのキャラクターの画像データから全く別の複数のキャラクターを作ることができる。
ゲーム等に登場するキャラクターの一部分(例えば、目、鼻、手、足等のパーツ)の形を変える場合にも、元となる1つの画像データだけを持っていればよいという効果がある。
ゲーム等の背景等に特殊効果を付加する場合にも、従来のような拡大、縮小、四角形から四角形への変形等に比べてはるかに自由かつ滑らかな変形を行うことができ、従来にない特殊効果(例えば、背景を歪ませて異次元の世界を表現する等)を付加することができる。
なお、変形対象の内部の指定した範囲に含まれる複数の小多角形は上記実施例のような4つに限るものではなく、その他の数の小多角形を指定範囲に含めてもよい。
【0133】
上記各実施例ではビット配列形式の画像データを有する変形対象を小矩形に分割し、任意な四角形に変形しているが、これに限らず、例えば変形対象を複数の小六角形に分割し、各六角形を例えば所定の変形処理手順に従って異なる小六角形にそれぞれ変形することにより、変形後の画像データを作成するようにしてもよい。
また、ビット配列形式の画像データを有する変形対象を分割する形状は上記の2種類に限るものではなく、本発明の目的の範囲内が各種の変形が可能である。さらに、本発明の適用はアニメーション、ゲーム等のキャラクター又は背景データ等に限るものではなく、他の分野、他の画像データにも適用できる。
【0134】
【発明の効果】
本発明によれば、変形対象を複数の小多角形に分割し、各小多角形を所定の変形処理に従って異なる小多角形にそれぞれ変形し、このとき小多角形の変形処理では、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形し、さらに変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って変形後の小多角形のデータに対応するように順次変更して変更後の全体画像を作成しているので、以下の効果を得ることができる。
(1)変形対象の有する画像データの配列は、各小多角形毎に変更処理が行われるので、従来のように全く異なる全体の画像データを予め持つ必要がなく、少ないメモリ容量で、ビット配列形式の画像を自由に変形することができる。
(2)変形対象を複数の小多角形に分割し、各小多角形毎に変形処理が行われるので、変形に自由度があり、予めメモリに多くのデータを持たなくても、画像を滑らかに変形することができる。
(3)特に、変形対象の内部の指定範囲に含まれる小多角形をそのまま平行移動させる変形法を使用した場合、変形後のすべての小多角形の頂点の位置データ(例えば、座標)を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。
(4)さらに、この変形法を用いると、変形対象の外枠の形を変えずに、また変形対象の指定した範囲に含まれる小多角形を変形せずに任意の場所に移動でき、その他の小多角形のみを変形することができる。よって、画像の外形(例えば、大きさ)および画像データの一部分を変えずに、その場所を移動したいという場合に有効である。
【0135】
他の請求項記載の発明によれば、小多角形の変形処理において、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置変えずに変形対象内の任意の位置に移動したときであっても、他の小多角形の頂点を複数個の小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形しているので、同様に変形後のすべての小多角形の頂点の位置データ(例えば、座標)を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。また、この変形法を用いると、変形対象の外枠の形を変えずに、かつ変形対象の指定した範囲に含まれる小多角形を変形せずに任意の場所に移動でき、その他の小多角形のみを変形することができる。
【図面の簡単な説明】
【図1】本発明による多角形分割変形方法の原理を説明する図である。
【図2】本発明による多角形分割変形方法の小矩形から任意の四角形への変形例を示す図である。
【図3】本発明に係る画像変形装置の第1実施例の構成図である。
【図4】同実施例の変形対象となる画像データを多数の小矩形に分割する例を示す図である。
【図5】同実施例のCPUの内部レジスタへのデータの格納例を示す図である。
【図6】同実施例の画像変形処理のメインプログラムを示すフローチャートである。
【図7】同実施例の小矩形変形処理のサブルーチンを示すフローチャートである。
【図8】同実施例のライン貼り付け法を説明する図である。
【図9】同実施例の変形対象の変形処理を説明する図である。
【図10】同実施例のデータの格納例を示す図である。
【図11】同実施例の格子点座標算出処理のルーチンを示すフローチャートである。
【図12】同実施例の格子点座標算出処理のルーチンを示すフローチャートである。
【図13】同実施例の格子点座標算出処理のルーチンを示すフローチャートである。
【図14】同実施例の格子点座標算出処理のルーチンを示すフローチャートである。
【図15】同実施例のライン貼り付け処理のサブルーチンを示すフローチャートである。
【図16】同実施例の画像データの変形例を示す図である。
【図17】同実施例の画像データの変形例を示す図である。
【図18】同実施例の画像データの変形例を示す図である。
【図19】同実施例の画像データの変形例を示す図である。
【図20】同実施例の画像データの変形例を示す図である。
【図21】同画像データの変形例を示す図である。
【図22】同実施例の画像データの変形例を示す図である。
【図23】同実施例の画像データの変形例を示す図である。
【図24】同実施例の画像データの変形例を示す図である。
【図25】同実施例の画像データの変形例を示す図である。
【図26】同実施例のCPUの内部レジスタへのデータの格納例を示す図である。
【図27】同実施例のライン描画の一例を説明する図である。
【図28】同実施例のライン端点処理のサブルーチンの一部を示すフローチャートである。
【図29】同実施例のライン端点処理のサブルーチンの一部を示すフローチャートである。
【図30】同ライン描画処理のサブルーチンの一部を示すフローチャートである。
【図31】同実施例のライン描画処理のサブルーチンの一部を示すフローチャートである。
【図32】同実施例の端点バッファへのデータの格納例を示す図である。
【符号の説明】
31 CPU(分割手段、変形手段、画像データ作成手段、座標変換手段、データ変換手段、画像変形制御手段)
32 入力操作子(変形態様指定手段)
33 記憶装置(記憶手段)
34 VDP
35 VRAM
36 TVディスプレイ(表示手段)
41 ビット配列形式の画像データ
42 変形前の格子点座標
43、44 変形後の格子点座標
51 第1の変形スイッチ
52 第2の変形スイッチ

Claims (4)

  1. ビット配列形式の画像データを有する変形対象を、複数の小多角形に分割し、
    この各小多角形を所定の変形処理に従って異なる小多角形に変形し、
    変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って、変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データを作成するとともに、
    前記小多角形の変形処理では、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することを特徴とする画像変形方法。
  2. 前記小多角形の変形処理では、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記複数個の小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記複数個の小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することを特徴とする請求項1記載の画像変形方法。
  3. ビット配列形式の画像データを有する変形対象を、複数の小多角形に分割する分割手段と、
    変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して分割手段によって分割した各小多角形を異なる小多角形に変形する変形手段と、
    変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って、変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データを作成する画像データ作成手段と、
    を備えたことを特徴とする画像変形装置。
  4. 前記変形手段は、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置にそれぞれ移動させるように、分割した各小多角形を異なる小多角形に変形することを特徴とする請求項3記載の画像変形装置。
JP34752793A 1993-12-24 1993-12-24 画像変形方法およびその装置 Expired - Fee Related JP3548867B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP34752793A JP3548867B2 (ja) 1993-12-24 1993-12-24 画像変形方法およびその装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP34752793A JP3548867B2 (ja) 1993-12-24 1993-12-24 画像変形方法およびその装置

Publications (2)

Publication Number Publication Date
JPH07192121A JPH07192121A (ja) 1995-07-28
JP3548867B2 true JP3548867B2 (ja) 2004-07-28

Family

ID=18390834

Family Applications (1)

Application Number Title Priority Date Filing Date
JP34752793A Expired - Fee Related JP3548867B2 (ja) 1993-12-24 1993-12-24 画像変形方法およびその装置

Country Status (1)

Country Link
JP (1) JP3548867B2 (ja)

Also Published As

Publication number Publication date
JPH07192121A (ja) 1995-07-28

Similar Documents

Publication Publication Date Title
JP2919428B2 (ja) 画像変形装置
JPH04503883A (ja) 入出力システム
JPS6324419A (ja) 複合文書処理装置
JP3548867B2 (ja) 画像変形方法およびその装置
US7142224B2 (en) Polygon drawing apparatus and method, and storage medium for implementing the same method
EP0356262B1 (en) Image processing apparatus
JP3463125B2 (ja) 画像変形方法およびその装置
JP3603593B2 (ja) 画像処理方法および装置
JP3548806B2 (ja) 画像変形方法およびその装置
JPH07200800A (ja) 画像変形方法およびその装置
JP3479282B2 (ja) 文字図形変形処理装置
JPH07182500A (ja) 画像変形方法およびその装置
JP2782904B2 (ja) 多角形塗りつぶし方式
JP2642374B2 (ja) 図形クリツピング方法
JPH07192122A (ja) 画像変形方法およびその装置
JPH1115994A (ja) 曲面作成方法
JP4514943B2 (ja) 画像作成方法および装置
JP2611599B2 (ja) コンピュータグラフイックスのデータ処理方法及び装置
JPH06110442A (ja) 文字図形処理装置、及び文字または図形の変形処理方法
JPH07182497A (ja) 画像変形方法およびその装置
JP3463124B2 (ja) 画像変形方法およびその装置
JPH0414190A (ja) 塗りつぶし回路
JPH0350686A (ja) 図形処理方式
JPS61272880A (ja) 図形編集装置
JP2829079B2 (ja) 情報処理装置及び情報処理方法

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20031218

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20040106

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040219

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: 20040323

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20040405

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees