(57)【特許請求の範囲】
【請求項１】
ビット配列形式の画像データを有する変形対象を、複数の小多角形に分割し、
この各小多角形を所定の変形処理に従って異なる小多角形に変形し、
変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って、変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データを作成するとともに、
前記小多角形の変形処理では、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することを特徴とする画像変形方法。
【請求項２】
前記小多角形の変形処理では、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記複数個の小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記複数個の小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することを特徴とする請求項１記載の画像変形方法。
【請求項３】
ビット配列形式の画像データを有する変形対象を、複数の小多角形に分割する分割手段と、
変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して分割手段によって分割した各小多角形を異なる小多角形に変形する変形手段と、
変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って、変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データを作成する画像データ作成手段と、
を備えたことを特徴とする画像変形装置。
【請求項４】
前記変形手段は、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置にそれぞれ移動させるように、分割した各小多角形を異なる小多角形に変形することを特徴とする請求項３記載の画像変形装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、画像変形方法およびその装置に係わり、詳しくはアニメーション、ゲーム等で用いられるキャラクター、背景データを始めとするドットで構成され、かつ各ドット毎に表示色番号あるいはパレット番号を持つようないわゆるビット配列形式の画像データの配列を変更することにより、画像を変形する画像変形方法およびその方法を実現する装置に関する。
【０００２】
【従来の技術】
従来、アニメーション、ゲーム等ではビット配列形式の画像データを用いることが多く、この画像データによりキャラクターや背景データを表示している。そして、このビット配列形式の画像データはドットで構成され、かつ各ドット毎に表示色番号あるいはパレット番号を持つようになっている。
【０００３】
【発明が解決しようとする課題】
ところで、従来の画像変形方法において、アニメーション、ゲーム等でキャラクター又は背景に動きを与えたり、その形を変えるときには、全く異なる画像データを予めメモリに持っておき、例えば動きを与えるときには一定時間毎に、あるいはその形を変えるときには何かのきっかけでメモリ上にある画像データそのものを表示し直していた。そのため、多くのメモリを消費するという欠点があった。
また、画像の拡大、縮小処理あるいはある形状の四角形から異なる形状の四角形への変形（例えば、正方形から台形への変形）等の単純な変形処理は、従来のゲーム中にも多く用いられているが、変形の度合いが限られ、滑らかな変形が困難であった。さらに、変形を使用する範囲が限定されてしまい（自由に変形できない）、予めメモリに多くのデータを持っておく方法を採らざるを得ず、この点でコスト高にもなっていた。
【０００４】
そこで本発明は、少ないメモリ容量で、ビット配列形式の画像を自由にかつ滑らかに変形できる画像変形方法およびその装置を提供することを目的としている。
【０００５】
【課題を解決するための手段】
上記目的達成のため、請求項１記載の発明による画像変形方法は、ビット配列形式の画像データを有する変形対象を、複数の小多角形に分割し、
この各小多角形を所定の変形処理に従って異なる小多角形に変形し、
変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って、変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データを作成するとともに、前記小多角形の変形処理では、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することを特徴とする。
請求項２記載の発明による画像変形方法は、前記小多角形の変形処理では、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記複数個の小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記複数個の小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することを特徴とする。
【０００９】
請求項３記載の画像変形装置は、ビット配列形式の画像データを有する変形対象を、複数の小多角形に分割する分割手段と、
変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して分割手段によって分割した各小多角形を異なる小多角形に変形する変形手段と、
変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って、変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データを作成する画像データ作成手段と、を備えたことを特徴とする。
請求項４記載の画像変形装置は、前記変形手段は、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに任意の位置にそれぞれ移動させるように、分割した各小多角形を異なる小多角形に変形することを特徴とする。
【００１４】
【作用】
本発明では、まずビット配列形式の画像データを有する変形対象を複数の小多角形に分割し、各小多角形を所定の変形処理（例えば、座標変換処理）に従って異なる小多角形にそれぞれ変形する。このとき、小多角形の変形処理では、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに変換対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を移動させ（例えば、変形対象全体が滑らかに変形されるように他の小多角形の頂点を移動させ）、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することが行われる。
次いで、変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って変形後の小多角形のデータに対応するように順次変更して変更後の全体画像データが作成される。
【００１５】
したがって、変形対象の画像は各小多角形毎に変形処理が行われるから、従来のように全く異なる全体の画像データを予め持つ必要がなくなり、少ないメモリ容量で、ビット配列形式の画像データの配列を自由に変更できる。
また、変形対象を複数の小多角形に分割し、各小多角形毎に変形処理が行われるので、変形に自由度があり、予めメモリに多くのデータを持たなくても、画像を滑らかに変形できる。
特に、変形対象の内部の任意の範囲に含まれる小多角形の頂点を移動させる変形法を使用することにより、変形後のすべての小多角形の頂点の位置データ（例えば、座標）を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。さらに、この変形法を用いると、変形対象の外枠の形を変えずに、また変形対象の指定した範囲に含まれる小多角形は変形されずに、任意の場所に移動でき、その他の小多角形のみを変形できるので、画像の外形（例えば、大きさ）および画像データの一部分を変えずに、その場所を移動したいという場合に有効である。
【００１６】
他の請求項記載の発明では、小多角形の変形処理で、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形することが行われる。
したがって、特に、変形対象の内部の任意の範囲にある複数個の小多角形の頂点を移動させる変形法を使用することにより、同様に変形後のすべての小多角形の頂点の位置データ（例えば、座標）を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。
【００１７】
【実施例】
以下、図面を参照して本発明の実施例について説明する。
本発明の原理説明
最初に、本発明の原理から説明する。図１は多角形分割変形方法の原理を示す図である。図１（ａ）は変形前の画像データを有する変形対象を示し、この変形対象の画像データはビット配列形式であり、「目」の画像（絵）Ａを表している。この画像データを変形するために、まず変形対象全体を予め縦４分割、横６分割して合計で２４個の小矩形（１）、（２）、（３）、・・・・・（２４）を作成する。このとき、各小矩形（１）、（２）、（３）、・・・・・（２４）の画像データは複数のドットによって構成され、かつ複数の各ドット毎に表示色番号あるいはパレット番号を持っている。そして、各小矩形（１）、（２）、（３）、・・・・・（２４）毎の画像はそのドット全体によって表示される。
次いで、変形対象全体が滑らかに変形されるように、所定の変形処理（例えば、後述の座標変換処理）に従って各小矩形（１）、（２）、（３）、・・・・・（２４）を図１（ｂ）に示すような異なる四角形（１）’、（２）’、（３）’、・・・・・（２４）’にそれぞれ変形する。例えば、図２に示すように小矩形（６）は四角形（６）’に変形され、小矩形（１）は四角形（１）’に変形される。
【００１８】
この過程では、各小矩形（１）、（２）、（３）、・・・・・（２４）の変形に伴って、それぞれの小矩形に含まれるビット配列形式の画像データの配列が所定のデータ変換処理（例えば、後述のいわゆるライン貼り付け処理）に従って変形する。すなわち、ドットの配列が変形の程度に応じて変わることになる。したがって、変形後の四角形（１）’、（２）’、（３）’、・・・・・（２４）’を全体として合成すると、図１（ｂ）に示すように、変形した「目」の画像（絵）Ｂが得られる。
この場合、変形対象の画像データの配列に対して各小矩形（１）、（２）、（３）、・・・・・（２４）毎に変形処理が行われるから、従来のように全く異なる全体の画像データを予め持つ必要がなく、少ないメモリ容量でビット配列形式の画像を自由に変形できる。また、変形対象を複数の小矩形（１）、（２）、（３）、・・・・・（２４）に分割し、各小矩形（１）、（２）、（３）、・・・・・（２４）毎に変形処理が行われるので、変形に自由度があり、予めメモリに多くのデータを持たなくても、画像を滑らかに変形することが可能になる。
【００１９】
特に、変形対象の内部の任意の範囲に含まれる小多角形（複数でもよい）の頂点を移動させる変形法を使用すれば、変形後のすべての四角形（１）’、（２）’、（３）’、・・・・・（２４）’の位置データ（例えば、座標）を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。さらに、この変形法を用いると、変形対象の外枠の形を変えずに、また変形対象の指定した範囲に含まれる小多角形は変形されずに、任意の場所に移動でき、その他の小多角形のみを変形できるので、画像の外形（例えば、大きさ）および画像データの一部分を変えずに、その場所を移動したいという場合に有効である。
【００２０】
次に、上記原理に基づく本発明の具体的な実施例について説明する。
画像変形装置の構成
図３は本発明に係る画像変形方法を実現する画像変形装置の第１実施例を示す構成図である。図３において、画像変形装置は大きく分けてＣＰＵ３１、入力操作子３２、記憶装置３３、画像信号発生回路（Ｖｉｄｅｏ  Ｄｉｓｐｌａｙ  Ｐｒｏｓｓｅｓｅｒ：以下ＶＤＰという）３４、ＶＲＡＭ３５およびＴＶディスプレイ３６によって構成される。
ＣＰＵ３１は装置全体を制御するもので、入力操作子３２から画像変形指令が入力されると、その指令情報に対応すべく内部のメモリに格納されている制御プログラムに基づいて記憶装置３３に記憶されている変形対象としてのビット配列形式の画像データ４１を読み出してＶＤＰ３４に出力するとともに、この画像データ４１に対して多角形分割変形処理を施した後、変形後のビット配列形式の画像データをＶＤＰ３４に出力する。また、ＣＰＵ３１は内部レジスタ３１ａを有しており、内部レジスタ３１ａには後述の図４に示すような各小矩形の格子点座標等が格納されるようになっている。
【００２１】
入力操作子（変形態様指定手段）３２はオペレータによって操作されるもので、ビット配列形式の画像データの配列をどのように変形させるかを指定する（つまり、変形を行わせるきっかけを与えるための）第１の変形スイッチ５１および第２の変形スイッチ５２を有している。第１の変形スイッチ５１は、例えば変形前の格子点座標４２で表される原画像に対して、変形後の格子点座標４３で表される第１の変形画像のような変形（変形データ１）を与える指令を出力する。第２の変形スイッチ５２は、例えば変形前の格子点座標４２で表される原画像に対して、変形後の格子点座標４４で表される第２の変形画像のような変形（変形データ２）を与える指令を出力する。なお、各変形スイッチ５１、５２は単独操作のプッシュスイッチでもよいし、あるいは複数のスイッチからなるスイッチボード、キーボード等でもよい。また、入力操作子３２としてスイッチボード等の他に、マウス、トラックボール等を用いてもよい。
【００２２】
記憶装置（記憶手段）３３は変形対象となるビット配列形式の画像データ４１、変形対象（原画像）をどのように矩形分割するかを示す変形前の格子点座標（変形前の小多角形の頂点の座標）４２、矩形分割された各小矩形をどのように変形するかを示す変形データ１に対応する変形後の格子点座標（変形後の異なる小多角形の頂点の座標）４３および矩形分割された各小矩形をどのように変形するかを示す変形データ２に対応する変形後の格子点座標（変形後の異なる小多角形の頂点の座標）４４を記憶している。例えば、格子点座標４３は第１の変形画像に対応し、格子点座標４４は第２の変形画像に対応しているとともに、これらの変形画像を処理する指令はそれぞれ第１の変形スイッチ５１、第２の変形スイッチ５２から出力される。
ＶＤＰ３４はＣＰＵ３１から与えられた変形前のビット配列形式の画像データや変形後のビット配列形式の画像データをＶＲＡＭ３４に書き込む。ＶＲＡＭ３４としては、例えば半導体メモリが用いられ、表示する画像を１画面単位で記憶する。ＶＲＡＭ３４に書き込まれた画像データはＴＶディスプレイ（表示手段）３６によって表示される。
上記ＣＰＵ３１は分割手段、変形手段、画像データ作成手段、座標変換手段、データ変換手段を構成するとともに、さらに画像変形制御手段を構成する。
【００２３】
ここで、本実施例では変形前のビット配列形式の画像データを有する変形対象に対して図４に示すように、多数の小矩形に分割する処理が施される。この場合、矩形分割された各小矩形の頂点に当る部分を格子点と呼ぶことにする。図４の例では、変形対象を縦方向にｍ分割し、横方向にｎ分割している。したがって、変形対象は（ｍ×ｎ）個の小矩形に分割されることになり、各小矩形は左上端から右下端に行くに従って、小矩形（０、０）、小矩形（０、１）、小矩形（０、２）、・・・・・・・小矩形（ｍ−１、ｎ−１）としてそれぞれ表される。
また、変形対象の左上端の格子点を格子点（０、０）、その右隣の格子点を格子点（０、１）と呼び、以下同様に右に行くに従って格子点（０、２）、格子点（０、３）、と呼ぶことにする。したがって、右上端の格子点は格子点（０、ｎ）になる。次いで、格子点（０、０）のすぐ下の格子点を格子点（１、０）と呼び、以下同様に下に行くに従って格子点（２、０）、格子点（３、０）と呼ぶことにする。したがって、左下端の格子点は格子点（ｍ、０）になる。また、右下端の格子点は格子点（ｍ、ｎ）になる。
【００２４】
ＣＰＵ３１の内部レジスタ３１ａには図４に示す各小矩形の格子点座標が記憶され、その様子は図５のように示される。図５において、内部レジスタ３１ａには各小矩形（０、０）、小矩形（０、１）、小矩形（０、２）、・・・・・・・小矩形（ｍ−１、ｎ−１）に対応する格子点の座標として、以下のように格納されている。なお、各格子点の座標はＸ軸（横方向）およびＹ軸（縦方向）を基準とする２つの数値で表される。
格子点（０、０）のＸ座標
格子点（０、０）のＹ座標
格子点（０、１）のＸ座標
格子点（０、１）のＹ座標
・
・
格子点（ｍ、ｎ）のＸ座標
格子点（ｍ、ｎ）のＹ座標
【００２５】
一方、記憶装置３３には変形対象（原画像データを有する）をどのように矩形分割するかを示す変形前の格子点座標４２が格納されているが、この格子点座標４２をＣＰＵ３１の内部レジスタ３１ａに記憶されている各小矩形（０、０）、小矩形（０、１）、小矩形（０、２）、・・・・・・・小矩形（ｍ−１、ｎ−１）の格子点座標にそれぞれ対応させて示すと、例えば図５の右端に表すようになる。すなわち、両者は以下のような対応関係になる。
格子点（０、０）のＸ座標……１００（変形前の格子点座標、以下同様）
格子点（０、０）のＹ座標……１００
格子点（０、１）のＸ座標……１１０
格子点（０、１）のＹ座標……１００
・
・
格子点（ｍ、ｎ）のＸ座標……１６０
格子点（ｍ、ｎ）のＹ座標……１４０
【００２６】
また、記憶装置３３には前述したように第１の変形スイッチ５１からの指令に対応する第１の変形画像を矩形分割した場合の格子点座標４３および第２の変形スイッチ５２からの指令に対応する第２の変形画像を矩形分割した場合の格子点座標４４が記憶されている。例えば、第１の変形スイッチ５１が操作されると、このスイッチ５１によって選択された変形番号に相当する変形後の格子点座標がＣＰＵ３１の内部レジスタ３１ａに格納され、第２の変形スイッチ５２が操作されると、このスイッチ５２によって選択された変形番号に相当する変形後の格子点座標がＣＰＵ３１の内部レジスタ３１ａに格納される。
【００２７】
これらの格子点座標４３、４４をＣＰＵ３１の内部レジスタ３１ａに記憶されている各小矩形（０、０）、小矩形（０、１）、小矩形（０、２）、・・・・・・・小矩形（ｍ−１、ｎ−１）の格子点座標にそれぞれ対応させて示すと、例えば図５の中央の図のように表される。
なお、変形１とは、第１の変形スイッチ５１からの指令に対応する第１の画像変形処理のことであり、変形２とは、第２の変形スイッチ５２からの指令に対応する第２の画像変形処理のことである。したがって、変形１の格子点座標とは、第１の変形スイッチ５１からの指令に対応する第１の変形画像を矩形分割した場合の格子点座標のことである。同様に、変形２の格子点座標とは、第２の変形スイッチ５２からの指令に対応する第２の変形画像を矩形分割した場合の格子点座標のことである。
【００２８】
次に、作用を説明する。
メインプログラム
図６は画像変形処理のメインプログラムを示すフローチャートである。このプログラムがスタートすると、まずステップＳ１０でキー情報取り込み処理を行う。これは、入力操作子３２における第１の変形スイッチ５１あるいは第２の変形スイッチ５２の操作情報を入力するものである。次いで、ステップＳ１２で変形スイッチが押されたか否かを判別し、何れのスイッチも押されていなければ、今回のルーチンを終了し、次回のルーチンで再びステップＳ１０を実行する。このとき、例えばスイッチフラグが設けられ、何れのスイッチも押されていなければ、スイッチフラグが［０］のままである。一方、何れかのスイッチが押されると、スイッチフラグを［１］にセットするとともに、ステップＳ１４で押された変形スイッチの番号を判別する。その後、ステップＳ１６あるいはステップＳ１８で押された変形スイッチの番号に応じた変形後の格子点座標をＣＰＵ３１の内部レジスタ３１ａに格納し、次いで、ステップＳ２０に進む。
【００２９】
具体的には、第１の変形スイッチ５１が押された場合には、ステップＳ１６に進んで記憶装置３３内の第１の変形画像を矩形分割した場合の格子点座標（つまり、変形データ１に対応する変形後の格子点座標）４３をコピーしてＣＰＵ３１の内部レジスタ３１ａに格子点毎に格納する。したがって、例えば図５に示されるような変形前の格子点座標が記憶されていたとすると、以下に示すように格子点座標４３の値が内部レジスタ３１ａに順次格納されることになる。
格子点（０、０）のＸ座標……９０（変形データ１の格子点座標、以下同様）
格子点（０、０）のＹ座標……１００
格子点（０、１）のＸ座標……１０５
格子点（０、１）のＹ座標……９５
・
・
格子点（ｍ、ｎ）のＸ座標……１４０
格子点（ｍ、ｎ）のＹ座標……１３０
【００３０】
一方、第２の変形スイッチ５２が押された場合には、ステップＳ１８に進んで記憶装置３３内の第２の変形画像を矩形分割した場合の格子点座標（つまり、変形データ２に対応する変形後の格子点座標）４４をコピーしてＣＰＵ３１の内部レジスタ３１ａに格子点毎に格納する。したがって、例えば図５に示されるような変形前の格子点座標が記憶されていたとすると、以下に示すように格子点座標４４の値が内部レジスタ３１ａに順次格納されることになる。
格子点（０、０）のＸ座標……９０（変形データ２の格子点座標、以下同様）
格子点（０、０）のＹ座標……１００
格子点（０、１）のＸ座標……１０５
格子点（０、１）のＹ座標……１００
・
・
格子点（ｍ、ｎ）のＸ座標……１７０
格子点（ｍ、ｎ）のＹ座標……１４０
【００３１】
ステップＳ１６あるいはステップＳ１８を経ると、続くステップＳ２０に進み、記憶装置３３から変形対象となる画像データの中から、処理すべき小矩形（ｉ、ｊ）に含まれる画像データを読み込んで小矩形の変形処理を行う（詳細はサブルーチンで後述）。これにより、小矩形（ｉ、ｊ）についてビット配列形式の画像データの配列が変形し、変形後の画像が得られることになる。小矩形（ｉ、ｊ）とは、例えば図１（ａ）に示すように変形対象を複数に分割した場合の小矩形（１）、（２）、（３）、・・・・・（２４）の何れかを表す一般的な指定状態を示すものである。なお、ステップＳ２０の処理では、小矩形（ｉ、ｊ）で示される変形後の画像データをＶＤＰ３４に順次転送することが行われ、これにより、最終的にすべての小矩形（ｉ、ｊ）に対応する変形した画像データが合成されて変形画像が得られることになる。
次いで、ステップＳ２２ですべての小矩形（ｉ、ｊ）に対して画像の変形処理をしたか否かを判別し、ＮＯであればステップＳ２０に戻って同様の処理を繰り返す。そして、すべての小矩形（ｉ、ｊ）に対して画像の変形処理が終了すると、ステップＳ２２からＹＥＳに抜けて本ルーチンを終了する。このようにして、ステップＳ２０およびステップＳ２２において各小矩形単位で画像の変形処理が行われる。
【００３２】
小矩形変形処理のサブルーチン
次に、図７はメインプログラムの小矩形変形処理（ステップＳ２０）のサブルーチンを示すフローチャートである。このサブルーチンに移行すると、ステップＳ３０で小矩形（ｉ、ｊ）の周囲４点の変形前の座標を、記憶装置３３内の変形前の格子点座標４２より得る処理を行う。言換えれば、記憶装置３３に記憶されている変形前の格子点座標４２から、処理すべき小矩形の頂点に当る４つの座標を読み出す。例えば、小矩形（ｉ、ｊ）の場合、頂点は格子点（ｉ、ｊ）、（ｉ、ｊ＋１）、格子点（ｉ＋１、ｊ）、格子点（ｉ＋１、ｊ＋１）となり、これらが変形前の小矩形の座標である。
【００３３】
次いで、ステップＳ３２で小矩形（ｉ、ｊ）の周囲４点の変形後の座標を、ＣＰＵ３１における内部レジスタ３１ａの格子点座標より得る処理を行う。言換えれば、ＣＰＵ３１の内部レジスタ３１ａに格納されている変形後の格子点座標から、処理すべき小矩形の頂点に当る４つの座標を読み出す。例えば、同様に小矩形（ｉ、ｊ）の場合、頂点は格子点（ｉ、ｊ）、（ｉ、ｊ＋１）、格子点（ｉ＋１、ｊ）、格子点（ｉ＋１、ｊ＋１）となり、これらが変形後の四角形の座標である。
ステップＳ３０、ステップＳ３２により、変形対象の画像全体が滑らかに変形されるように、各小矩形を異なる四角形にそれぞれ変形する処理が行われる。この処理（変形処理に相当）は座標変換処理であり、この座標変換処理では、分割された各小矩形の頂点の座標を求め、次いで、変形対象全体が滑らかに変形されるような変形後の各小四角形の頂点の座標を算出し、この算出した座標に基づいて変形後の異なる小四角形の形状を決定することにより、分割された各小矩形を異なる小四角形に変形する。
【００３４】
次いで、ステップＳ３４でいわゆるライン貼り付け法（データ変換処理に相当）により各小矩形内の画像データの配列を変形する処理を行う。ライン貼り付け法とは、変形元である分割した各小多角形のビット配列形式の画像データの配列を複数のラインに分割し、分割した各ラインを変形先の各多角形の対応する位置に順次転送するとともに、転送に際して転送先の大きさに合うように拡大又は縮小させながらそれぞれラインとして貼り付けていくことにより、変形後の各小多角形の画像データの配列を作成することをいう。
具体的には、図８（ａ）に示すように変形元となるビット配列形式の画像データを有する小矩形Ｃの画像データの配列を複数のライン１〜ラインｎに分割し、分割した各ライン１〜ｎを変形先の四角形Ｄの対応する位置に、転送先の大きさに合うように拡大又は縮小させながらそれぞれライン１’〜ラインｎ’として貼り付けていくものである。このように、小矩形Ｃの画像データの配列を複数のライン１〜ラインｎに分けて変形させながら貼り付けることで、画像の変形処理を行うことにより、元画像を滑らかに変形させることが可能になる。
【００３５】
これにより、各小矩形は四角形へと変形処理され、最終的にすべての小矩形（ｉ、ｊ）に対応する画像データの配列が変形し、変形画像が得られることになる。
次いで、ステップＳ３６でＶＤＰ３４に変形済みの画像データを逐次転送する。これにより、小矩形（ｉ、ｊ）で示される変形後の画像データがＶＤＰ３４に転送され、最終的にすべての小矩形（ｉ、ｊ）に対応する変形した画像を合成することにより、ＴＶディスプレイ３６に変形後の画像が表示される。ステップＳ３６の処理を経ると、メインプログラムにリターンする。
【００３６】
本実施例の格子点算出処理
次に、本実施例の特徴部分である変形処理（つまり、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、少なくとも各頂点の相対位置が変らないように任意の位置に移動したとき、変形対象が滑らかに変形されるように他の各格子点を移動させ、移動後の各格子点の座標を算出する処理）について説明する。
まず、この変形処理の対象となる変形対象の例は図９（ａ）に示され、変形後の例は図９（ｂ）に示される。図９（ａ）に示すように、変形対象を予め縦ｍ分割（例えば、４分割）、横ｎ分割（例えば、６分割）して合計でｍ×ｎ個（例えば、２４個）の小矩形に分割する。このとき、各小矩形の画像データはドットによって構成され、かつ各ドット毎に表示色番号あるいはパレット番号を持っている。そして、各小矩形毎の画像はそのドット全体によって表示される。
【００３７】
さて、この例は、あたかも変形対象の内部にある指定された範囲内にある４つの小矩形をそっくりそのまま下方に平行移動して変形対象を変形させるようなケースに相当する。
ここで、本実施例では格子点の表し方と、格子点の座標とについて、次のような取り決めにしている。後述の実施例においても同様である。
例えば、格子点（ｐ、ｑ）という場合、最初の記号でｙ軸方向の位置を表示し、次の記号でｘ軸方向の位置を表示する。すなわち、格子点（ｐ、ｑ）＝（ｙ軸方向の位置、ｘ軸方向の位置）となり、ｐはｙ軸方向の位置に相当し、ｑはｘ軸方向の位置に相当する。これに対して、座標の表示は数学上で一般的に用いられているものと同様に、最初の記号でｘ軸方向の位置を表示し、次の記号でｙ軸方向の位置を表示する。したがって、格子点（ｐ、ｑ）の座標が座標（ｘｄ、ｙｄ）という場合、ｘｄがｘ軸方向の位置で、ｙｄがｙ軸方向の位置となる。すなわち、（ｘｄ、ｙｄ）＝（ｘ軸方向の位置、ｙ軸方向の位置）となる。このように、両者の表示方法が逆になっているので、後述のフローチャートでは間違えないように理解する必要がある。なお、適宜、説明の都合上、例えば格子点（座標：ｘ２、ｙｐ）というようにして該当する格子点について、その座標のみを表示することも行う。
【００３８】
変形データとして予め位置が判明しているために、位置データの保有が可能なものは、図９（ａ）に示す変形前においては変形対象の内部の指定した範囲に含まれる４つの小矩形の領域を指定するための格子点のデータであり、具体的には、４つの小矩形全体の左上の格子点（ｐ１、ｑ１）、右下の格子点（ｐ２、ｑ２）、指定した範囲内の小矩形のｘ軸方向の移動量ｄｘ、ｙ軸方向の移動量ｄｙである。また、変形後は図９（ｂ）に示す同一の小矩形の頂点である。なお、外枠のうち少なくとも２つの頂点も予め位置が判明している。
なお、前者の変形前の小矩形の頂点は、移動の基準となるものであり、以下、移動基準格子点という。また、適宜、指定した範囲に含まれる移動前の４つの小多角形を以下、指定領域といい、それらの小多角形の頂点を指定格子点という。
【００３９】
一方、変形後における図９（ｂ）に示す同一の小矩形の頂点は、変形移動格子点といい、その位置を座標で表すと、図９（ｂ）に示すように変形移動格子点となる。また、外枠の２つの頂点も予め位置が判明しているため、それらの位置データは（ｘ１、ｙ１）、（ｘ２、ｙ２）なる座標で表される。なお、各小矩形の頂点を、適宜、格子点という。さらに、図面の説明上、横方向をｘ座標、縦方向をｙ座標とし、ｘ座標は図面上、左から右へ大きく、ｙ座標は上から下へ大きくなるものとする。
記憶装置３３には図１０に示すように、上記各情報を格納する変形データエリアがある。
指定範囲左上の格子点……格子点（ｐ１、ｑ１）
指定範囲右下の格子点……格子点（ｐ２、ｑ２）
指定範囲のｘ方向の移動量……ｄｘ
指定範囲のｙ方向の移動量……ｄｙ
【００４０】
図１１〜図１４は変形後の格子点座標算出処理のルーチンを示すフローチャートである。
このルーチンは、変形対象の内部の指定した範囲内の４つの小矩形をそっくりそのまま下方に平行移動したとき、変形対象全体が滑らかに変形されるように他の小多角形の頂点を移動させ、移動した他の小多角形の頂点を上記４つの小多角形の移動後の頂点（変形移動格子点（座標：ｘｓ、ｙｓ））に基づいて算出するものである。そして、その後、算出した各頂点に対応して変形後の各小多角形の形状が決定され、変形後の小多角形に対応するように元画像が順次変形処理されて変形後の全体画像が作成されることになる。
【００４１】
まず、ステップＳ１００で変形対象の外枠の４隅の頂点の座標（ｘ１、ｙ１）、（ｘ２、ｙ１）、（ｘ１、ｙ２）、（ｘ２、ｙ２）を算出する。この場合、外枠の２つの頂点（ｘ１、ｙ１）、（ｘ２、ｙ２）は予め位置が判明しているから、残りの２つの頂点位置は比例演算によって求められ、それらの位置データは変形対象が縦ｍ分割、横ｎ分割されるから、結局、（ｘ１、ｙ２）、（ｘ１、ｙ２）なる座標で表される。また、同じステップＳ１００で変形対象の内部の指定した範囲に含まれる４つの小矩形の格子点（ｉ、ｊ）（ただし、ｐ１≦ｉ≦ｐ２、ｑ１≦ｉ≦ｑ２：図９（ｂ）中×印で示す）の移動する前の座標を以下の（１）式および（２）式に従って算出する。
ｘ＝ｘ１・（ｎ−ｊ）／ｎ＋ｘ２・ｊ／ｎ……（１）
ｙ＝ｙ１・（ｍ−ｉ）／ｍ＋ｙ２・ｉ／ｍ……（２）
したがって、変形対象の内部の指定した範囲に含まれる移動前の４つの小多角形の頂点（移動基準格子点（ｉ、ｊ））は、移動すると、変形移動格子点として表され、その移動後の座標に基づいて他の小多角形の頂点を次のように算出する。
【００４２】
すなわち、ステップＳ１０２でポインタｊをｑ１にセットする。ポインタｊは格子点をｑ１なる位置からｘ軸方向に沿って順次指定する。次いで、ステップＳ１０４でポインタｉをｐ１にセットする。ポインタｉは格子点をｐ１なる位置からｙ軸方向に沿って順次指定する。このように各ポインタｊ、ｉを初期位置にセットすることにより、移動基準格子点（ｉ、ｊ）（例えば、その１つの格子点は（ｐ１、ｑ１））がどれだけ移動したかを算出するための準備が整えられる。
次いで、ステップＳ１０６で以下に示す（３）式および（４）式に従って移動基準格子点（ｉ、ｊ）がｘ軸方向にｄｘ、ｙ軸方向にｄｙだけ移動した後の座標を（ｘｓ、ｙｓ）（図９（ｂ）の状態）を算出する。
ｘｓ＝ｘ１・（ｎ−ｊ）／ｎ＋ｘ２・ｊ／ｎ＋ｄｘ……（３）
ｙｓ＝ｙ１・（ｍ−ｉ）／ｍ＋ｙ２・ｉ／ｍ＋ｄｙ……（４）
【００４３】
次いで、ステップＳ１０８でポインタｉをインクリメントし（１だけ進める）、続くステップＳ１１０でポインタｉがｐ２＋１に等しくなったか（下側の指定格子点ｐ２を超えたか）否かを判別する。例えば、最初のルーチンでは上側の格子点（ｐ１、ｑ１）の移動後の座標を求めたから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１０６に戻ってループを繰り返す。したがって、次回のループではその下側にある格子点（ｐ１＋１、ｑ１）の移動後の座標が算出される。そして、同様のループを繰り返すことにより、ｉ＝ｐ２＋１になると、下側の指定格子点ｐ２を超える位置までポインタｉが進んだと判断してステップＳ１１２に抜ける。
このようにして、指定された小矩形の左辺上にある格子点（つまりｑ１を含むｙ軸方向の線分上にある格子点）の移動後の座標（ｘｓ、ｙｓ）がすべて算出される。なお、本実施例では上記左辺上にある格子点は３つであるが、同様の処理によって、それ以上の格子点の移動後の座標も簡単に算出できる。
【００４４】
次いで、ステップＳ１１２でポインタｊをインクリメントし（１だけ進める）、続くステップＳ１１４でポインタｊがｑ２＋１に等しくなったか否かを判別する。例えば、最初のルーチンではｑ１を含むｙ軸方向の線分上にある格子点の移動後の座標を求めたのみであるから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１０４に戻ってループを繰り返す。したがって、次回のループでは（ｑ１＋１）を含むｙ軸方向の線分上にある格子点の移動後の座標が算出される。そして、同様のループを繰り返すことにより、ｊ＝ｑ２＋１になると、右側の指定格子点ｑ２を超える位置までポインタｊが進んだと判断してステップＳ１１６に抜ける。
このようにして、変形対象の内部の指定した範囲に含まれる移動前の４つの小多角形の頂点（移動基準格子点（ｉ、ｊ））が移動した後の座標がすべて算出される。
【００４５】
次に、上記のようにして求めた移動後の格子点（×印）を、対応する外枠上の格子点と順次結んでいき、その線分上にある格子点（例えば、△印、▲印）の座標を算出する処理に移る。
最初に、外枠の各辺（上辺、下辺、右辺、左辺）にある格子点の座標を求めておく。すなわち、ステップＳ１１６でポインタｊをｊ＝１にセットし、初期位置におく。次いで、ステップＳ１１８で以下に示す（５）式および（６）式に従って外枠の上辺にある格子点（０、ｊ）の座標（ｘｔ、ｙｔ）を算出する。
ｘｔ＝ｘ１・（ｎ−ｊ）／ｎ＋ｘ２・ｊ／ｎ……（５）
ｙｔ＝ｙ１……（６）
次いで、ステップＳ１２０で以下に示す（７）式および（８）式に従って外枠の下辺にある格子点（ｍ、ｊ）の座標（ｘｔ、ｙｔ）を算出する。
ｘｔ＝ｘ１・（ｎ−ｊ）／ｎ＋ｘ２・ｊ／ｎ……（７）
ｙｔ＝ｙ２……（８）
【００４６】
次いで、ステップＳ１２２でポインタｊをインクリメントし（１だけ進める）、続くステップＳ１２４でポインタｊがｎに等しくなったか（外枠上の右辺まで到達したか）なったか否かを判別する。例えば、最初のルーチンでは格子点（０、１）、格子点（ｍ、１）の座標を求めたのみだから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１１８に戻ってループを繰り返す。したがって、次回のループでは格子点（０、２）、格子点（ｍ、２）の座標が算出される。そして、同様のループを繰り返すことにより、ｊ＝ｎになると、格子点（０、ｎ）、（ｍ、ｎ）の位置まで（外枠上の右辺まで）ポインタｊが進んだと判断してステップＳ１２６に抜ける。
このようにして、外枠の上辺および下辺にある各格子点の座標が順次算出される。
【００４７】
次いで、ステップＳ１２６でポインタｉをｉ＝１にセットし、初期位置におく。次いで、ステップＳ１２６で以下に示す（９）式および（１０）式に従って外枠の左辺にある格子点（ｉ、０）の座標（ｘｔ、ｙｔ）を算出する。
ｘｔ＝ｘ１……（９）
ｙｔ＝ｙ１・（ｍ−ｉ）／ｍ＋ｙ２・ｉ／ｍ……（１０）
次いで、ステップＳ１３０で以下に示す（１１）式および（１２）式に従って外枠の右辺にある格子点（ｉ、ｎ）の座標（ｘｔ、ｙｔ）を算出する。
ｘｔ＝ｘ２……（１１）
ｙｔ＝ｙ１・（ｍ−ｉ）／ｍ＋ｙ２・ｉ／ｍ……（１２）
【００４８】
次いで、ステップＳ１３２でポインタｉをインクリメントし（１だけ進める）、続くステップＳ１３４でポインタｉがｍに等しくなったか（外枠上の下辺まで到達したか）否かを判別する。例えば、最初のルーチンでは格子点（１、０）、格子点（１、ｎ）の座標を求めたのみだから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１２８に戻ってループを繰り返す。したがって、次回のループでは格子点（２、０）、格子点（２、ｎ）の座標が算出される。そして、同様のループを繰り返すことにより、ｉ＝ｍになると、格子点（ｍ、０）、（ｍ、ｎ）の位置まで（外枠上の下辺まで）ポインタｉが進んだと判断してステップＳ１３６に抜ける。
このようにして、外枠の左辺および右辺にある各格子点の座標が順次算出される。
【００４９】
外枠の各辺（上辺、下辺、右辺、左辺）にある格子点の座標が求められたので、続いて前述の処理で求めた移動後の格子点（×印）を、対応する外枠の各辺の格子点と順次結んでいき、その線分上にある格子点（例えば、△印、▲印）の座標を算出する。
（Ｉ）移動後の格子点（×印）を外枠の上辺の格子点とを結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップＳ１３６でポインタｊをｊ＝ｑ１にセットし、初期位置におく。次いで、ステップＳ１３８で外枠の上辺にある格子点（０、ｊ）の座標と、指定領域にある格子点（ｐ１、ｊ）の座標を読み出す。次いで、ステップＳ１４０でポインタｉをｉ＝１にセットし、初期位置におく。次いで、ステップＳ１４２で以下に示す（１３）式および（１４）式に従って外枠の上辺にある格子点（０、ｊ）と、指定領域にある格子点（ｐ１、ｊ）とを結んだ線分上にある格子点の座標（ｉ、ｊ）を算出する。
ｘ＝ｘｔ・（ｐ１−ｉ）／ｐ１＋ｘｓ・ｉ／ｐ……（１３）
ｙ＝ｙｔ・（ｐ１−ｉ）／ｐ１＋ｙｓ・ｉ／ｐ……（１４）
【００５０】
次いで、ステップＳ１４４でポインタｉをインクリメントし（１だけ進める）、続くステップＳ１４６でポインタｉがｐ１に等しくなったか（指定領域の上辺まで到達したか）否かを判別する。例えば、最初のルーチンでは外枠の上辺にある格子点（０、ｊ）と、指定領域にある格子点（ｐ１、ｊ）とを結んだ線分上にある第１の格子点の座標（ｉ、ｊ）を算出したのみであるから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１１８に戻ってループを繰り返す。したがって、次回のループでは外枠の上辺にある格子点（０、ｊ）と、指定領域にある格子点（ｐ１、ｊ）とを結んだ線分上にある第２の格子点の座標（ｉ、ｊ）が算出される。そして、同様のループを繰り返すことにより、ｉ＝ｐ１になると、格子点（ｐ１、ｑ１）の位置まで（指定領域の上辺まで）ポインタｉが進んだと判断してステップＳ１４８に抜ける。これにより、外枠の上辺にある格子点（０、ｊ）と、指定領域にある格子点（ｐ１、ｊ）とを結んだ線分上にある格子点の座標（ｉ、ｊ）が順次すべて算出される。
【００５１】
次いで、ステップＳ１４８でポインタｊをインクリメントし（１だけ進める）、続くステップＳ１５０でポインタｊがｑ２＋１に等しくなったか（指定領域の右辺まで到達したか）否かを判別する。例えば、最初のルーチンでは格子点（０、ｑ１）と格子点（ｐ１、ｑ１）を結ぶ線分上にある格子点の座標を求めたのみだから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１３８に戻ってループを繰り返す。したがって、次回のループでは格子点（０、ｑ１＋１）と格子点（ｐ１、ｑ１＋１）を結ぶ線分上にある格子点の座標が算出される。すなわち、右側に１つだけずれた線分上にある格子点の座標が算出される。そして、同様のループを繰り返すことにより、ｊ＝ｑ２＋１になると、指定領域の右辺までポインタｊが進んだと判断してステップＳ１５２に抜ける。
このようにして、移動後の格子点（×印）を外枠の上辺の格子点とを結んだ線分上にあるすべての格子点の座標が算出される。
【００５２】
（ＩＩ）移動後の格子点（×印）を外枠の下辺の格子点とを結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップＳ１５２でポインタｊをｊ＝ｑ１にセットし、初期位置におく。次いで、ステップＳ１５４で外枠の下辺にある格子点（ｍ、ｊ）の座標と、指定領域にある格子点（ｐ２、ｊ）の座標を読み出す。次いで、ステップＳ１５６でポインタｉをｉ＝ｐ２にセットし、初期位置におく。次いで、ステップＳ１５８で以下に示す（１５）式および（１６）式に従って外枠の下辺にある格子点（ｍ、ｊ）と、指定領域にある格子点（ｐ２、ｊ）とを結んだ線分上にある格子点の座標（ｉ、ｊ）を算出する。
ｘ＝ｘｔ・（ｑ２−ｉ）／（ｍ−ｐ２）
＋ｘｓ・（ｉ−ｍ）／（ｍ−ｐ２）……（１５）
ｙ＝ｙｔ・（ｑ２−ｉ）／（ｍ−ｐ２）
＋ｙｓ・（ｉ−ｍ）／（ｍ−ｐ２）……（１６）
【００５３】
次いで、ステップＳ１６０でポインタｉをインクリメントし（１だけ進める）、続くステップＳ１６２でポインタｉがｍに等しくなったか（外枠の下辺まで到達したか）否かを判別する。例えば、最初のルーチンでは外枠の下辺にある格子点（ｍ、ｊ）と、指定領域にある格子点（ｐ２、ｊ）とを結んだ線分上にある第１の格子点の座標（ｉ、ｊ）を算出したのみであるから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１５８に戻ってループを繰り返す。したがって、次回のループでは外枠の下辺にある格子点（ｍ、ｊ）と、指定領域にある格子点（ｐ２、ｊ）とを結んだ線分上にある第２の格子点の座標（ｉ、ｊ）が算出される。そして、同様のループを繰り返すことにより、ｉ＝ｍになると、格子点（ｍ、ｑ１）の位置まで（外枠の下辺まで）ポインタｉが進んだと判断してステップＳ１６２に抜ける。これにより、外枠の下辺にある格子点（ｍ、ｊ）と、指定領域にある格子点（ｐ２、ｊ）とを結んだ線分上にある格子点の座標（ｉ、ｊ）が順次すべて算出される。
【００５４】
次いで、ステップＳ１６４でポインタｊをインクリメントし（１だけ進める）、続くステップＳ１６６でポインタｊがｑ２＋１に等しくなったか（指定領域の右辺まで到達したか）否かを判別する。例えば、最初のルーチンでは格子点（ｐ２、ｑ１）と格子点（ｍ、ｑ１）を結ぶ線分上にある格子点の座標を求めたのみだから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１５４に戻ってループを繰り返す。したがって、次回のループでは格子点（ｐ２、ｑ１＋１）と格子点（ｍ、ｑ１＋１）を結ぶ線分上にある格子点の座標が算出される。すなわち、右側に１つだけずれた線分上にある格子点の座標が算出される。そして、同様のループを繰り返すことにより、ｊ＝ｑ２＋１になると、指定領域の右辺までポインタｊが進んだと判断してステップＳ１６８に抜ける。
このようにして、移動後の格子点（×印）を外枠の下辺の格子点とを結んだ線分上にあるすべての格子点の座標が算出される。
【００５５】
（ＩＩＩ）移動後の格子点（×印）を外枠の左辺の格子点とを結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップＳ１６８でポインタｉをｉ＝ｐ１にセットし、初期位置におく。次いで、ステップＳ１７０で外枠の左辺にある格子点（ｉ、０）の座標と、指定領域にある格子点（ｉ、ｑ１）の座標を読み出す。次いで、ステップＳ１７２でポインタｊをｊ＝１にセットし、初期位置におく。次いで、ステップＳ１７４で以下に示す（１７）式および（１８）式に従って外枠の左辺にある格子点（ｉ、０）と、指定領域にある格子点（ｉ、ｑ１）とを結んだ線分上にある格子点の座標（ｉ、ｊ）を算出する。
ｘ＝ｘｔ・（ｑ１−ｊ）／ｑ１＋ｘｓ・ｊ／ｑ１……（１７）
ｙ＝ｙｔ・（ｑ１−ｊ）／ｑ１＋ｙｓ・ｊ／ｑ１……（１８）
【００５６】
次いで、ステップＳ１７６でポインタｊをインクリメントし（１だけ進める）、続くステップＳ１７８でポインタｊがｑ１＋１に等しくなったか（指定領域の左辺まで到達したか）否かを判別する。例えば、最初のルーチンでは外枠の左辺にある格子点（ｉ、０）と、指定領域にある格子点（ｉ、ｑ１）とを結んだ線分上にある第１の格子点の座標（ｉ、ｊ）を算出したのみであるから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１７４に戻ってループを繰り返す。したがって、次回のループでは外枠の左辺にある格子点（ｉ、０）と、指定領域にある格子点（ｉ、ｑ１）とを結んだ線分上にある第２の格子点の座標（ｉ、ｊ）が算出される。そして、同様のループを繰り返すことにより、ｊ＝ｑ１＋１になると、格子点（ｐ１、ｑ１）の位置まで（指定領域の左辺まで）ポインタｊが進んだと判断してステップＳ１８０に抜ける。これにより、外枠の左辺にある格子点（ｉ、０）と、指定領域にある格子点（ｉ、ｑ１）とを結んだ線分上にある格子点の座標（ｉ、ｊ）が順次すべて算出される。
【００５７】
次いで、ステップＳ１８０でポインタｉをインクリメントし（１だけ進める）、続くステップＳ１８２でポインタｉがｐ２＋１に等しくなったか（指定領域の下辺まで到達したか）否かを判別する。例えば、最初のルーチンでは外枠の左辺にある格子点（ｉ、０）と、指定領域にある格子点（ｉ、ｑ１）とを結ぶ線分上にある格子点の座標を求めたのみだから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１７０に戻ってループを繰り返す。したがって、次回のループでは格子点（ｐ１＋１、０）と格子点（ｐ１＋１、ｑ１）を結ぶ線分上にある格子点の座標が算出される。すなわち、下側に１つだけずれた線分上にある格子点の座標が算出される。そして、同様のループを繰り返すことにより、ｊ＝ｐ２＋１になると、指定領域の左辺までポインタｉが進んだと判断してステップＳ１８４に抜ける。
このようにして、移動後の格子点（×印）を外枠の左辺の格子点とを結んだ線分上にあるすべての格子点の座標が算出される。
【００５８】
（ＩＶ）移動後の格子点（×印）を外枠の右辺の格子点とを結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップＳ１８４でポインタｉをｉ＝ｐ１にセットし、初期位置におく。次いで、ステップＳ１８６で外枠の右辺にある格子点（ｉ、ｎ）の座標と、指定領域にある格子点（ｉ、ｑ２）の座標を読み出す。次いで、ステップＳ１８８でポインタｊをｊ＝ｑ２にセットし、初期位置におく。次いで、ステップＳ１９０で以下に示す（１９）式および（２０）式に従って外枠の右辺にある格子点（ｉ、ｎ）と、指定領域にある格子点（ｉ、ｑ２）とを結んだ線分上にある格子点の座標（ｉ、ｊ）を算出する。
ｘ＝ｘｔ・（ｑ２−ｊ）／（ｎ−ｑ２）
＋ｘｓ・（ｊ−ｎ）／（ｎ−ｑ２）……（１９）
ｙ＝ｙｔ・（ｑ２−ｊ）／（ｎ−ｑ２）
＋ｙｓ・（ｊ−ｎ）／（ｎ−ｑ２）……（２０）
【００５９】
次いで、ステップＳ１９２でポインタｊをインクリメントし（１だけ進める）、続くステップＳ１９４でポインタｊがｎに等しくなったか（外枠の右辺まで到達したか）否かを判別する。例えば、最初のルーチンでは外枠の右辺にある格子点（ｉ、ｎ）と、指定領域にある格子点（ｉ、ｑ２）とを結んだ線分上にある第１の格子点の座標（ｉ、ｊ）を算出したのみであるから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１９０に戻ってループを繰り返す。したがって、次回のループでは外枠の右辺にある格子点（ｉ、１）と、指定領域にある格子点（ｉ、ｑ１＋１）とを結んだ線分上にある第２の格子点の座標（ｉ、ｊ）が算出される。そして、同様のループを繰り返すことにより、ｊ＝ｎになると、格子点（ｐ１、ｑ２）の位置まで（外枠の右辺まで）ポインタｊが進んだと判断してステップＳ１９６に抜ける。これにより、外枠の右辺にある格子点（ｉ、１）と、指定領域にある格子点（ｉ、ｑ１＋１）とを結んだ線分上にある格子点の座標（ｉ、ｊ）が順次すべて算出される。
【００６０】
次いで、ステップＳ１９６でポインタｉをインクリメントし（１だけ進める）、続くステップＳ１９８でポインタｉがｍに等しくなったか（外枠の下辺まで到達したか）否かを判別する。例えば、最初のルーチンでは外枠の右辺にある格子点（ｉ、１）と、指定領域にある格子点（ｉ、ｑ１＋１）とを結んだ線分上にある格子点の座標を求めたのみだから、まだ両者が等しくなく、ＮＯに分岐してステップＳ１８６に戻ってループを繰り返す。したがって、次回のループでは格子点（ｐ１＋１、ｑ２）と格子点（ｐ１＋１、ｎ）を結ぶ線分上にある格子点の座標が算出される。すなわち、下側に１つだけずれた線分上にある格子点の座標が算出される。そして、同様のループを繰り返すことにより、ｉ＝ｍになると、外枠の下辺までポインタｉが進んだと判断して図１３のステップＳ２００に抜ける。
このようにして、移動後の格子点（×印）を外枠の右辺の格子点とを結んだ線分上にあるすべての格子点の座標が算出される。
【００６１】
さて、残りの格子点は上記処理で求めた格子点（△、▲印）を、それぞれ対応する外枠上の格子点と順次結んでいったときにできる交点（以下、適宜、交差格子点という）にある。したがって、以下のステップでは、残りの格子点の座標を算出する。
（Ｖ）移動後の中間格子点（△印）を外枠の上辺の格子点と結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップＳ２００でポインタｉ、ｊを共に［１］にセットし、初期位置におく。次いで、ステップＳ２０２で格子点（ｉ、ｑ１）および格子点（ｉ、０）の座標を読み出す。最初はｉ＝１であるから、指定領域の左辺と同じｘ軸方向の位置にある格子点（１、ｑ１）と外枠の左辺の格子点（１、０）の座標を読み出すことになる。次いで、ステップＳ２０４で各格子点を結ぶｘ軸方向の線分を以下の式に従って求める。
ａ・ｘ＋ｂ・ｙ＋ｃ＝０
【００６２】
次いで、求めたｘ軸方向の線分に交差するｙ軸方向の線分を算出する処理を行う。ステップＳ２０６で格子点（ｐ１、ｊ）および格子点（０、ｊ）の座標を読み出す。最初はｊ＝１であるから、指定領域の上辺と同じｙ軸方向の位置にある格子点（ｐ１、１）と外枠の上辺の格子点（０、１）の座標を読み出すことになる。次いで、ステップＳ２０８で各格子点を結ぶｙ軸方向の線分を以下の式に従って求める。
ａ’・ｘ＋ｂ’・ｙ＋ｃ’＝０
これにより、ｙ軸方向の線分が求められたので、これら２直線の交点にある格子点を求める処理を行う。すなわち、ステップＳ２１０で２直線の交点の座標（ｘ、ｙ）を以下に示す（２１）式および（２２）式に従って算出する。
ｘ＝（ｂ・ｃ’−ｂ’・ｃ）／（ａ・ｂ’−ａ’・ｂ）……（２１）
ｙ＝（ａ’・ｃ−ａ・ｃ’）／（ａ・ｂ’−ａ’・ｂ）……（２２）
【００６３】
次いで、ステップＳ２１２で（２１）式、（２２）式によって算出したｘ座標およびｙ座標を格子点（ｉ、ｊ）の座標としてストアする。次いで、ステップＳ２１４に進み、ポインタｊをインクリメントし（１だけ進める）、続くステップＳ２１６でポインタｊがｑ１に等しくなったか否かを判別する。例えば、最初は指定領域の左辺と同じｘ軸方向の位置にある格子点（１、ｑ１）と外枠の左辺の格子点（１、０）とを結ぶｘ軸方向の第１の線分上にある格子点の座標を算出しているから、この線分上に複数の格子点が存在している場合には、まだ両者が等しくなく、ＮＯに分岐してステップＳ２０６に戻ってループを繰り返す。したがって、次回のループでは指定領域の右辺と同じｘ軸方向の位置にある格子点（１、ｑ１）と外枠の左辺の格子点（１、０）とを結ぶｘ軸方向の第１の線分上にある次の（右側の）格子点の座標が算出されてストアされる。
【００６４】
そして、同様のループを繰り返すことにより、ｊ＝ｑ１になると、指定領域の左辺の位置までポインタｊが進んだと判断してステップＳ２１６からステップＳ２１８に抜ける。ステップＳ２１８ではポインタｉをインクリメントし（１だけ進める）、続くステップＳ２２０でポインタｉがｐ１に等しくなったか否かを判別する。例えば、いままでのルーチンでは指定領域の左辺と同じｘ軸方向の位置にある格子点（１、ｑ１）と外枠の左辺の格子点（１、０）とを結ぶｘ軸方向の第１の線分上の格子点を外枠の左辺から指定領域の左同じｘ軸方向の位置まで（ｑ１まで）求めたから、今度は下側に移動してｘ軸方向の第１の線分のすぐ下側にあるｘ軸方向の第２の線分の各格子点について上記同様の処理を行うことになる。
【００６５】
そのため、ステップＳ２２０ではＮＯに分岐し、ステップＳ２０２に戻り、同様のループを繰り返す。これにより、ｘ軸方向の第１の線分のすぐ下側にあるｘ軸方向の第２の線分の各格子点の座標が算出され、以下、同様にしてさらにその下側の線分の各格子点の座標が算出され、ステップＳ２２０でｉがｐ１に等しくなると、指定領域の上辺の位置まで交差格子点が求められることになり、次いで、ステップＳ２２２に進む。このようにして、移動後の中間格子点（△印）を外枠の上辺の格子点と結んだ線分上にあるすべての格子点の座標が算出される。
【００６６】
（ＶＩ）移動後の中間格子点（▲印）を外枠の上辺の格子点と結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップＳ２２２でポインタｉをｉ＝１にセットし、ポインタｊをｊ＝ｑ２＋１にセットして共に初期位置におく。次いで、ステップＳ２２４で格子点（ｉ、ｑ２）および格子点（ｉ、ｎ）の座標を読み出す。最初はｉ＝１であるから、指定領域の右辺と同じｘ軸方向の位置にある格子点（１、ｑ２）と外枠の右辺の格子点（１、ｎ）の座標を読み出すことになる。次いで、ステップＳ２２６で各格子点を結ぶｘ軸方向の線分を以下の式に従って求める。
ａ・ｘ＋ｂ・ｙ＋ｃ＝０
【００６７】
次いで、求めたｘ軸方向の線分に交差するｙ軸方向の線分を算出する処理を行う。ステップＳ２２８で格子点（ｐ１、ｊ）および格子点（０、ｊ）の座標を読み出す。最初はｊ＝１であるから、指定領域の上辺と同じｙ軸方向の位置にある格子点（ｐ１、１）と外枠の上辺の格子点（０、１）の座標を読み出すことになる。次いで、ステップＳ２２３０で各格子点を結ぶｙ軸方向の線分を以下の式に従って求める。
ａ’・ｘ＋ｂ’・ｙ＋ｃ’＝０
これにより、ｙ軸方向の線分が求められたので、これら２直線の交点にある格子点を求める処理を行う。すなわち、ステップＳ２３２で２直線の交点の座標（ｘ、ｙ）を前述した（２１）式および（２２）式に従って算出する。
【００６８】
次いで、ステップＳ２３６で（２１）式、（２２）式によって算出したｘ座標およびｙ座標を格子点（ｉ、ｊ）の座標としてストアする。次いで、ステップＳ２３８に進み、ポインタｊをインクリメントし（１だけ進める）、続くステップＳ２４０でポインタｊがｎに等しくなったか否かを判別する。例えば、最初は指定領域の右辺と同じｘ軸方向の位置にある格子点（１、ｑ２）と外枠の右辺の格子点（１、ｎ）とを結ぶｘ軸方向の第１の線分上にある格子点の座標を算出しているから、この線分上に複数の格子点が存在している場合には、まだ両者が等しくなく、ＮＯに分岐してステップＳ２２８に戻ってループを繰り返す。したがって、次回のループでは指定領域の右辺と同じｘ軸方向の位置にある格子点（１、ｑ２）と外枠の右辺の格子点（１、ｎ）とを結ぶｘ軸方向の第１の線分上にある次の（右側の）格子点の座標が算出されてストアされる。
【００６９】
そして、同様のループを繰り返すことにより、ｊ＝ｎになると、外枠の右辺の位置までポインタｊが進んだと判断してステップＳ２２３８からステップＳ２４０に抜ける。ステップＳ２４０ではポインタｉをインクリメントし（１だけ進める）、続くステップＳ２４２でポインタｉがｐ１に等しくなったか否かを判別する。例えば、いままでのルーチンでは指定領域の右辺と同じｘ軸方向の位置にある格子点（１、ｑ２）と外枠の右辺の格子点（１、ｎ）とを結ぶｘ軸方向の第１の線分上の格子点を指定領域の右辺と同じｘ軸方向の位置から外枠の右辺まで（ｎまで）求めたから、今度は下側に移動してｘ軸方向の第１の線分のすぐ下側にあるｘ軸方向の第２の線分の各格子点について上記同様の処理を行うことになる。
【００７０】
そのため、ステップＳ２４２ではＮＯに分岐し、ステップＳ２２４に戻り、同様のループを繰り返す。これにより、ｘ軸方向の第１の線分のすぐ下側にあるｘ軸方向の第２の線分の各格子点の座標が算出され、以下、同様にしてさらにその下側の線分の各格子点の座標が算出され、ステップＳ２４２でｉがｐ１に等しくなると、指定領域の上辺の位置まで交差格子点が求められることになり、次いで、ステップＳ２４４に進む。このようにして、移動後の中間格子点（▲印）を外枠の上辺の格子点と結んだ線分上にあるすべての格子点の座標が算出される。
【００７１】
（ＶＩＩ）移動後の中間格子点（△印）を外枠の下辺の格子点と結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
ステップＳ２４４でポインタｉをｉ＝ｐ２＋１にセットし、ポインタｊをｊ＝１にセットして共に初期位置におく。次いで、ステップＳ２４６で格子点（ｉ、ｑ１）および格子点（ｉ、０）の座標を読み出す。最初はｉ＝１であるから、指定領域の左辺と同じｘ軸方向の位置にある格子点（ｐ２＋１、ｑ１）と外枠の左辺の格子点（ｐ２＋１、０）の座標を読み出すことになる。次いで、ステップＳ２４８で各格子点を結ぶｘ軸方向の線分を以下の式に従って求める。
ａ・ｘ＋ｂ・ｙ＋ｃ＝０
【００７２】
次いで、求めたｘ軸方向の線分に交差するｙ軸方向の線分を算出する処理を行う。ステップＳ２５０で格子点（ｐ２、ｊ）および格子点（ｍ、ｊ）の座標を読み出す。最初はｊ＝１であるから、指定領域の下辺と同じｙ軸方向の位置にある格子点（ｐ２、１）と外枠の下辺の格子点（ｍ、１）の座標を読み出すことになる。次いで、ステップＳ２５２で各格子点を結ぶｙ軸方向の線分を以下の式に従って求める。
ａ’・ｘ＋ｂ’・ｙ＋ｃ’＝０
これにより、ｙ軸方向の線分が求められたので、これら２直線の交点にある格子点を求める処理を行う。すなわち、ステップＳ２５４で２直線の交点の座標（ｘ、ｙ）を前述した（２１）式および（２２）式に従って算出する。
【００７３】
次いで、ステップＳ２５６で（２１）式、（２２）式によって算出したｘ座標およびｙ座標を格子点（ｉ、ｊ）の座標としてストアする。次いで、ステップＳ２５８に進み、ポインタｊをインクリメントし（１だけ進める）、続くステップＳ２６０でポインタｊがｑ１に等しくなったか否かを判別する。例えば、最初は指定領域の左辺と同じｘ軸方向の位置にある格子点（ｐ２＋１、ｑ１）と外枠の左辺の格子点（ｐ２＋１、０）とを結ぶｘ軸方向の第１の線分上にある格子点の座標を算出しているから、この線分上に複数の格子点が存在している場合には、まだ両者が等しくなく、ＮＯに分岐してステップＳ２５０に戻ってループを繰り返す。したがって、次回のループでは指定領域の左辺と同じｘ軸方向の位置にある格子点（ｐ２＋１、ｑ１）と外枠の左辺の格子点（ｐ２＋１、０）とを結ぶｘ軸方向の第１の線分上にある次の（右側の）格子点の座標が算出されてストアされる。
【００７４】
そして、同様のループを繰り返すことにより、ｊ＝ｑ１になると、指定領域の左辺の位置までポインタｊが進んだと判断してステップＳ２６０からステップＳ２６２に抜ける。ステップＳ２６２ではポインタｉをインクリメントし（１だけ進める）、続くステップＳ２６４でポインタｉがｍに等しくなったか否かを判別する。例えば、いままでのルーチンでは指定領域の左辺と同じｘ軸方向の位置にある格子点（ｐ２＋１、ｑ１）と外枠の左辺の格子点（ｐ２＋１、０）とを結ぶｘ軸方向の第１の線分上の格子点を外枠の左辺から指定領域の左同じｘ軸方向の位置まで（ｑ１まで）求めたから、今度は下側に移動してｘ軸方向の第１の線分のすぐ下側にあるｘ軸方向の第２の線分の各格子点について上記同様の処理を行うことになる。
【００７５】
そのため、ステップＳ２６４ではＮＯに分岐し、ステップＳ２４６に戻り、同様のループを繰り返す。これにより、ｘ軸方向の第１の線分のすぐ下側にあるｘ軸方向の第２の線分の各格子点の座標が算出され、以下、同様にしてさらにその下側の線分の各格子点の座標が算出され、ステップＳ２６４でｉがｍに等しくなると、外枠の下辺の位置まで交差格子点が求められることになり、次いで、図１４のステップＳ２６６に進む。このようにして、移動後の中間格子点（△印）を外枠の下辺の格子点と結んだ線分上にあるすべての格子点の座標が算出される。
【００７６】
（ＶＩＩＩ）移動後の中間格子点（▲印）を外枠の下辺の格子点と結んだ線分上にある格子点の座標を算出する処理は、以下の通りである。
図１４に移り、ステップＳ２６６でポインタｉをｉ＝ｐ２＋１にセットし、ポインタｊをｊ＝ｑ２＋１にセットして共に初期位置におく。次いで、ステップＳ２６８で格子点（ｉ、ｎ）および格子点（ｉ、ｑ２）の座標を読み出す。最初はｉ＝ｐ２＋１であるから、指定領域の右辺と同じｘ軸方向の位置にある格子点（ｐ２＋１、ｑ２）と外枠の右辺の格子点（ｐ２＋１、ｎ）の座標を読み出すことになる。次いで、ステップＳ２７０で各格子点を結ぶｘ軸方向の線分を以下の式に従って求める。
ａ・ｘ＋ｂ・ｙ＋ｃ＝０
【００７７】
次いで、求めたｘ軸方向の線分に交差するｙ軸方向の線分を算出する処理を行う。ステップＳ２７２で格子点（ｐ２、ｊ）および格子点（ｍ、ｊ）の座標を読み出す。最初はｊ＝ｑ２＋１であるから、指定領域の下辺と同じｙ軸方向の位置にある格子点（ｐ２、ｑ２＋１）と外枠の下辺の格子点（ｍ、ｑ２＋１）の座標を読み出すことになる。次いで、ステップＳ２７４で各格子点を結ぶｙ軸方向の線分を以下の式に従って求める。
ａ’・ｘ＋ｂ’・ｙ＋ｃ’＝０
これにより、ｙ軸方向の線分が求められたので、これら２直線の交点にある格子点を求める処理を行う。すなわち、ステップＳ２７６で２直線の交点の座標（ｘ、ｙ）を前述した（２１）式および（２２）式に従って算出する。
【００７８】
次いで、ステップＳ２７８で（２１）式、（２２）式によって算出したｘ座標およびｙ座標を格子点（ｉ、ｊ）の座標としてストアする。次いで、ステップＳ２８０に進み、ポインタｊをインクリメントし（１だけ進める）、続くステップＳ２８２でポインタｊがｎに等しくなったか否かを判別する。例えば、最初は指定領域の右辺と同じｘ軸方向の位置にある格子点（ｐ２＋１、ｑ２）と外枠の右辺の格子点（ｐ２＋１、ｎ）とを結ぶｘ軸方向の第１の線分上にある格子点の座標を算出しているから、この線分上に複数の格子点が存在している場合には、まだ両者が等しくなく、ＮＯに分岐してステップＳ２７２に戻ってループを繰り返す。したがって、次回のループでは指定領域の右辺と同じｘ軸方向の位置にある格子点（ｐ２＋１、ｑ２）と外枠の右辺の格子点（ｐ２＋１、ｎ）とを結ぶｘ軸方向の第１の線分上にある次の（右側の）格子点の座標が算出されてストアされる。
【００７９】
そして、同様のループを繰り返すことにより、ｊ＝ｎになると、外枠の右辺の位置までポインタｊが進んだと判断してステップＳ２８２からステップＳ２８４に抜ける。ステップＳ２８４ではポインタｉをインクリメントし（１だけ進める）、続くステップＳ２８６でポインタｉがｍに等しくなったか否かを判別する。例えば、いままでのルーチンでは指定領域の右辺と同じｘ軸方向の位置にある格子点（ｐ２＋１、ｑ２）と外枠の右辺の格子点（ｐ２＋１、ｎ）とを結ぶｘ軸方向の第１の線分上の格子点を指定領域の右辺と同じｘ軸方向の位置から外枠の右辺まで（ｎまで）求めたから、今度は下側に移動してｘ軸方向の第１の線分のすぐ下側にあるｘ軸方向の第２の線分の各格子点について上記同様の処理を行うことになる。
【００８０】
そのため、ステップＳ２８６ではＮＯに分岐し、ステップＳ２６８に戻り、同様のループを繰り返す。これにより、ｘ軸方向の第１の線分のすぐ下側にあるｘ軸方向の第２の線分の各格子点の座標が算出され、以下、同様にしてさらにその下側の線分の各格子点の座標が算出され、ステップＳ２８６でｉがｍに等しくなると、外枠の下辺の位置まで交差格子点が求められることになり、本ルーチンを終了する。このようにして、移動後の中間格子点（▲印）を外枠の下辺の格子点と結んだ線分上にあるすべての格子点の座標が算出される。
以上のルーチンを実行することにより、変形対象の内部の指定した範囲内の４つの小矩形をそっくりそのままｘ軸方向にｄｘなる量だけ、ｙ軸方向にｄｙなる量だけ平行移動したときに、変形後のその他の各小矩形の頂点の座標が算出される。
【００８１】
次に、前述したいわゆるライン貼り付け法の処理内容について、以下に具体的に詳述する。
ライン貼り付け処理のサブルーチン
図７に示したステップＳ３４におけるライン貼り付け法（矩形から任意の四角形への変形方法）の具体的な内容は以下の通りである。
図１５はライン貼り付け法の処理を示すサブルーチンのフローチャートであり、このサブルーチンの処理の対象となる画像データの例は図１６（ａ）、（ｂ）のように示される。すなわち、図１６（ａ）は変形前の元画像データを示し、詳しくは変形元となるビット配列形式の画像データを分割した場合のある１つの小矩形の画像データ（つまり、変形前の小矩形画像データ）に対応する。ここで説明するライン貼り付け法は、図１６（ａ）に示すように変形前の小矩形画像データとして縦（Ｙ）方向が１２ピクセル、横（Ｘ）方向が１６ピクセルで構成される元画像データ（矩形ＡＢＣＤで表される）を、図１６（ｂ）に示すような四角形Ａ’Ｂ’Ｃ’Ｄ’に変形する内容である。その変形処理では、まず元画像データを１２本の水平ライン（ライン０〜ライン１１）に分割する。そして、分割した各ラインを画像変形態様に応じて変形後の四角形に順番に貼り付けていく処理が行われ、変形画像が得られる。
【００８２】
サブルーチンのステップを進めながら、上記処理について説明する。
このサブルーチンに移行すると、まずステップＳ１１００で辺Ａ’Ｂ’についてラインの端点処理を行う。これは、変形後の四角形のラインの端点Ａ’Ｂ’を求めるものである。なお、ステップＳ１１００の処理（辺Ａ’Ｂ’の位置を求める方法）については、後述のサブルーチンで詳述する。
すなわち、図１６（ａ）（ｂ）に示すように、分割した各ラインを画像変形態様に応じて変形後の四角形に順番に貼り付けていく処理では、以下のような状態に着目する必要がある。辺ＡＢ上にあった各ラインの一方の端点は辺Ａ’Ｂ’上に、また、辺ＤＣ上にあった他方の端点は辺Ｄ’Ｃ’上に移動する。このとき、辺ＡＢと辺Ａ’Ｂ’および辺ＤＣと辺Ｄ’Ｃ’では、それらの長さが異なるので、辺Ａ’Ｂ’、辺Ｄ’Ｃ’上でラインの端点が重なったりすることがある。これは、図１６（ｂ）の☆印で示す部分であり、辺Ａ’Ｂ’上のライン５およびライン６が重なっている。また、同一のラインを２回以上貼り付けなければならないこともある。これは、図１６（ｂ）の★印で示す２つの部分であり、辺Ｄ’Ｃ’上のライン３およびライン８が２回繰り返され、それぞれライン３、３’およびライン８、８’となっている。
【００８３】
図１７にラインを２回貼り付ける様子を示す。図１７（ａ）は変形前の元画像データであり、詳しくは変形元となるビット配列形式の画像データを分割した場合のある１つの小矩形の画像データに対応する。図１７（ｂ）は変形後の１つの四角形の画像データである。変形前の画像データのライン３が、変形後は途中のドットから右側６ドットだけライン３、３’として２ライン分貼り付けられる。また、変形前の画像データのライン５とライン６が、変形後は最初のドットから７ドットまで（つまり左側７ドット分）については同じドットに貼り付けられ、以後の右側７ドットについてはライン５、ライン６として別個に貼り付けられる。なお、図１７〜図２５はライン貼り付け法を実行する場合の、複数の実行過程における変形前の小矩形および変形後の四角形を示すものであり、各過程の具体例は後述のサブルーチンを説明するときに述べる。
【００８４】
次いで、ステップＳ１１０２で辺Ｄ’Ｃ’についてラインの端点処理を行う。これは、変形後の四角形のラインの端点Ｄ’Ｃ’を求めるものである。なお、ステップＳ１１０２の処理（辺Ｄ’Ｃ’の位置を求める方法）については、同様に後述のサブルーチンで詳述する。
このようにして、各ラインの端点が移動する辺Ａ’Ｂ’と辺Ｄ’Ｃ’の位置が求められると、これらのラインの端点位置は図３２に示すように、ＣＰＵ３１の内部レジスタ３１ａにある端点バッファにデータを格納する。この場合、内部レジスタ３１ａには辺Ａ’Ｂ’上の端点バッファと、辺Ｄ’Ｃ’上の端点バッファという２つの格納エリアがある。そして、これらの各端点バッファではラインの端点の座標と、そのライン番号を対応付けて格納する。２つの端点バッファは端点の位置を読み出すときや、ラインの描画位置を決めるときに使用される。
【００８５】
次いで、ステップＳ１１０４〜ステップＳ１１１０でラインを描画する処理を行う。まず、ステップＳ１１０４では２つの端点バッファからライン番号の同じデータを読み出す。次いで、ステップＳ１１０６で同じライン番号のラインが複数あるときには描画回数が最小になるように組み合せる。これは、図２７に示すように、例えば辺Ａ’Ｂ’上で同じライン番号のラインが３本あり、一方、辺Ｄ’Ｃ’上で同じライン番号のラインが２本ある場合、上側の各端点同士を１本のラインで引き、辺Ａ’Ｂ’上の２つの端点と辺Ｄ’Ｃ’上の１つの端点とを２本のラインで引くような処理を行うものである。
次いで、ステップＳ１１０８で描画処理（詳細はサブルーチンで後述）を行う。次いで、ステップＳ１１１０ですべてのラインについて処理したか否かを判別し、ＮＯのときはステップＳ１１０４に戻って同様の処理を繰り返す。そして、すべてのラインについてステップＳ１１０４〜ステップＳ１１０８の処理が終了すると、ステップＳ１１１０からＹＥＳに抜けてルーチンを終了する。このようにして、各小矩形が異なる四角形にそれぞれ変形され、変形対象の画像全体が滑らかに変形することになる。
【００８６】
ライン端点処理のサブルーチン
次に、上記ステップＳ１１００およびステップＳ１１０２におけるラインの端点処理のサブルーチンについて説明する。
図２８はラインの端点処理（ステップＳ１１１０の処理）を示すサブルーチンのフローチャートである。まず、貼り付けるラインの一方の端点となる辺Ａ’Ｂ’の位置を求める方法から説明する。なお、貼り付けるラインの他方の端点となる辺Ｄ’Ｃ’の位置を求める方法も同様である。
ステップＳ１２００で座標決定用誤差ｅ１、ライン選択用誤差ｅ２、現在ライン番号をすべて［０］に初期設定する。座標決定用誤差ｅ１とは、端点の位置を決めるとき又はラインの描画位置を決めるときに用いる座標決定用誤差のことである。ライン選択用誤差ｅ２とは、端点に割り当てるラインを選択するときに用いるライン選択用誤差のことである。これにより、最初は各誤差が［０］になる。
【００８７】
次いで、ステップＳ１２０２で処理を開始する点（Ａ’又はＤ’）の座標をＣＰＵ３１の内部レジスタ３１ａにある現在座標というエリアに格納する。例えば、貼り付けるラインの一方の端点となる辺Ａ’Ｂ’の位置を求める処理では、Ａ’の座標を格納する。一方、貼り付けるラインの他方の端点となる辺Ｄ’Ｃ’の位置を求める処理では、Ｄ’の座標を格納する。ＣＰＵ３１の内部レジスタ３１ａには図２６に示すように、端点バッファの他に、以下のような格納エリアがある。
座標決定用誤差ｅ１のエリア
座標決定用誤差増分Δｅ１のエリア
現在座標のエリア
ライン選択用誤差ｅ２のエリア
ライン選択誤差増分Δｅ２のエリア
現在ライン番号
また、ドット選択用の格納エリアとしては、以下のようなものがある。
ドット選択用誤差ｅ３のエリア
ドット選択用誤差増分Δｅ３のエリア
現在ドット番号のエリア
【００８８】
次いで、ステップＳ１２０４でＹ方向のピクセル数がＸ方向のピクセル数より多いか否かを判別する。いま、貼り付けるラインの一方の端点となる辺Ａ’Ｂ’の位置を求める場合の具体例は図１８に示される。図１８（ａ）に示す変形前のラインの一方の端点となる辺ＡＢを示し、図１８（ｂ）は貼り付けるラインの一方の端点となる辺Ａ’Ｂ’の様子を示し、さらに図１８（ｃ）にＸ方向およびＹ方向のピクセル数の変化を示している。この例に対応させて考えると、辺Ａ’Ｂ’はＹ方向に１１ピクセル、Ｘ方向に４ピクセルに渡って描画されるので、ステップＳ１２０４の判別結果はＹＥＳとなり、このケースではステップＳ１２０６に進む。一方、逆のケースではＮＯに分岐して図２９に示すステップＳ１２３８に進む。
また、この場合、図１８に示すケースでは点Ａ’から点Ｂ’に向ってＹ座標を１ずつ変えていったときにＸ座標の変化する位置を求めると、そのとき変化した座標が辺Ａ’Ｂ’の位置となる。したがって、無条件に位置の決る始点（点Ａ’）を除く１０個のドットを打つときには、Ｘ座標の変化する位置としてＸ座標が変化する３箇所を求めることになる。
【００８９】
ステップＳ１２０６に進むと、座標決定用誤差増分Δｅ１を（Ｘピクセル数−１）／（Ｙピクセル数−１）に初期設定するとともに、ライン選択誤差増分Δｅ２を（元ライン数−１）／（Ｙピクセル数−１）に初期設定する。ステップＳ１２００〜ステップＳ１２０６の処理により必要な初期設定が完了する。次いで、ステップＳ１２０８で現在のライン番号と現在座標を端点バッファ（図２６参照）に格納する。次いで、ステップＳ１２１０で現在座標のＹ座標を変更する。次いで、ステップＳ１２１２で座標決定用誤差ｅ１についての判別を以下のようにして行う。すなわち、選択誤差（初期値＝０）ｅを決め、選択誤差ｅに誤差増分Δｅを加える（ｅ＝ｅ＋Δｅ）。Δｅは（Ｘ方向のピクセル数−１）／（Ｙ方向のピクセル数−１）である。
【００９０】
なお、ここでは、座標決定用であるからｅをｅ１とし、ΔｅをΔｅ１として処理をする。そうすると、ｅ１＝ｅ１＋Δｅ１となる。この値が１／２より大きくなったか否かを判別する。そして、誤差増分Δｅ１を加えた結果ｅ１がｅ１≧（１／２）であれば、ステップＳ１２１４に進んで次に打つ点の座標（次の現在座標に相当）のＸ座標を変更する。これは、選択誤差に誤差増分を加え、その結果が１／２より大きいか小さいかによって処理を選択するもので、選択誤差が１／２以上のときに誤差を補正する。
【００９１】
このようにすると、点Ａ’から点Ｂ’に向ってＹ座標を１ずつ変えていったときに、少なくとも誤差増分Δｅ１が１の半分より大きい場合に、次の座標を変更するので、Ｘ座標の変化する位置が滑らかにつながることになる。なお、この方法はいわゆるＢｒｅｓｅｎｈａｍのアルゴリズムとして用いられるものである。
次いで、ステップＳ１２１６で誤差補正を行い、ｅ１＝ｅ１−１とする。これは、選択誤差が１／２以上になって次の座標を変更したので、１を減算することにより、再び次の現在座標から誤差増分Δｅを加えて同様の判別を始めるためである。その後、ステップＳ１２１８に進む。
一方、誤差増分Δｅ１を加えた結果ｅ１がｅ１＜（１／２）であれば、ステップＳ１２１４、ステップＳ１２１６をジャンプしてステップＳ１２１８に進む。このときは、次に打つ点のＸ座標は元のままにする。また、この場合は選択誤差ｅ１は補正しない。以上のステップＳ１２１０〜ステップＳ１２１６を実行することにより、貼り付けるラインの一方の端点となる辺Ａ’Ｂ’の位置が決定される。
【００９２】
ここで、図１８の場合（貼り付けるラインの一方の端点となる辺Ａ’Ｂ’の位置を決定する場合）の具体例について説明する。
まず、最初の端点Ａ’は無条件に決まる。この時点で、選択誤差ｅは［０］に初期設定されている。また、端点Ａ’から端点Ｂ’に対してはＹ方向に１１ピクセル、Ｘ方向に４ピクセルに渡って描画されるので、誤差増分Δｅは
Δｅ＝（４−１）／（１１−１）
＝０．３０である。次いで、選択誤差ｅはｅ＝０に初期設定されているからそのままとし、誤差増分ΔｅとしてΔｅ＝０．３０を加えると、
ｅ＝０＋０．３０＝０．３０＜（１／２）となる。したがって、このときは次に打つ点▲１▼のＸ座標は変更しない（図１８（ｃ）参照）。また、選択誤差ｅは１／２より小さいので、選択誤差ｅの補正は行わない。次いで、ここまでの選択誤差ｅ＝０．３０に誤差増分ΔｅとしてΔｅ＝０．３０を加えると、
ｅ＝０．３０＋０．３０＝０．６０≧（１／２）となるので、今度は次に打つ点▲２▼のＸ座標を変更する（図１８（ｃ）参照）。以上の処理を繰り返すことにより、点▲５▼、▲９▼の位置でＸ座標の変更が行われ、最終的に図１８（ｃ）に示すように、端点Ｂ’の位置が決定される。
【００９３】
一方、上記ステップＳ１２０４でＹ方向のピクセル数がＸ方向のピクセル数より小さいときは図２９のステップＳ１２３８に進み、今度はＹ座標の方を変更する処理を行う。すなわち、ステップＳ１２３８で座標決定用誤差増分Δｅ１を（Ｙピクセル数−１）／（Ｘピクセル数−１）に初期設定するとともに、ライン選択誤差増分Δｅ２を（元ライン数−１）／（Ｘピクセル数−１）に初期設定する。次いで、ステップＳ１２４０で現在のライン番号と現在座標を端点バッファ（図２６参照）に格納する。次いで、ステップＳ１２４２で現在座標のＸ座標を変更する。次いで、ステップＳ１２４４で座標決定用誤差ｅ１についての判別を以下のようにして行う。すなわち、選択誤差（初期値＝０）ｅを決め、選択誤差ｅに誤差増分Δｅを加える（ｅ＝ｅ＋Δｅ）。Δｅは（Ｙ方向のピクセル数−１）／（Ｘ方向のピクセル数−１）である。なお、ここでは、同様に座標決定用であるからｅをｅ１とし、ΔｅをΔｅ１として処理をする。そうすると、ｅ１＝ｅ１＋Δｅ１となる。この値が１／２より大きくなったか否かを判別する。そして、誤差増分Δｅ１を加えた結果ｅ１がｅ１≧（１／２）であれば、ステップＳ１２４６に進んで次に打つ点の座標（次の現在座標に相当）のＹ座標を変更する。これは、選択誤差に誤差増分を加え、その結果が１／２より大きいか小さいかによって処理を選択するもので、選択誤差が１／２以上のときに誤差を補正する。
【００９４】
このようにすると、点Ｄ’から点Ｃ’に向ってＸ座標を１ずつ変えていったときに、少なくとも誤差増分Δｅ１が１の半分より大きい場合に、次の座標を変更するので、Ｙ座標の変化する位置が滑らかにつながることになる。次いで、ステップＳ１２４８で誤差補正を行い、ｅ１＝ｅ１−１とする。これは、選択誤差が１／２以上になって次の現在座標のＹ座標を変更したので、１を減算することにより、再び次の現在座標から誤差増分Δｅを加えて同様の判別を始めるためである。その後、ステップＳ１２５０に進む。
一方、誤差増分Δｅ１を加えた結果ｅ１がｅ１＜（１／２）であれば、ステップＳ１２４６、ステップＳ１２４８をジャンプしてステップＳ１２５０に進む。このときは、次に打つ点のＹ座標は元のままにする。また、この場合は選択誤差ｅ１は補正しない。以上のステップＳ１２４２〜ステップＳ１２４８を実行することにより、貼り付けるラインの一方の端点となる辺Ｄ’Ｃ’の位置が決定される。
【００９５】
ここで、図１９の場合（貼り付けるラインの他方の端点となる辺Ｄ’Ｃ’の位置を決定する場合）の具体例について説明する。
図１９（ａ）は変形前のラインの他方の端点となる辺ＤＣを示し、図１９（ｂ）は貼り付けるラインの他方の端点となる辺Ｄ’Ｃ’の様子を示し、さらに図１９（ｃ）は辺Ｄ’Ｃ’におけるＸ方向およびＹ方向のピクセル数の変化を示している。この例に対応させて考えると、辺Ｄ’Ｃ’はＹ方向に１４ピクセル、Ｘ方向に５ピクセルに渡って描画されるので、点Ｄ’から点Ｃ’に向ってＹ座標を１ずつ変えていったときにＸ座標の変化する位置を求めると、そのとき変化した座標が辺Ｄ’Ｃ’の位置となる。したがって、無条件に位置の決る始点（点Ｄ’）を除く１３個のドットを打つときには、Ｘ座標の変化する位置としてＸ座標が変化する４箇所を求めることになる。
【００９６】
まず、最初の端点Ｄ’は無条件に決まる。この時点で、選択誤差ｅは［０］に初期設定されている。また、端点Ｄ’から端点Ｃ’に対してはＹ方向に１４ピクセル、Ｘ方向に５ピクセルに渡って描画されるので、誤差増分Δｅは
Δｅ＝（５−１）／（１４−１）
＝０．３０である。次いで、選択誤差ｅはｅ＝０に初期設定されているからそのままとし、誤差増分ΔｅとしてΔｅ＝０．３０を加えると、
ｅ＝０＋０．３０＝０．３０＜（１／２）となる。したがって、このときは次に打つ点▲１▼のＸ座標は変更しない（図１９（ｃ）参照）。また、選択誤差ｅは１／２より小さいので、選択誤差ｅの補正は行わない。次いで、ここまでの選択誤差ｅ＝０．３０に誤差増分ΔｅとしてΔｅ＝０．３０を加えると、
ｅ＝０．３０＋０．３０＝０．６０≧（１／２）となるので、今度は次に打つ点▲２▼のＸ座標を変更する（図１９ｃ）参照）。以上の処理を繰り返すことにより、点▲５▼、▲９▼、（１２）（なお、１０以降の○付き数字は表示が困難につき、かっこ付きの半角数字で表す）の位置でＸ座標の変更が行われ、最終的に図１９（ｃ）に示すように、端点Ｃ’の位置が決定される。
【００９７】
さて、再び図２９のフローチャートに戻り、端点位置の決定が行われると、ステップＳ１２１８に進む。ステップＳ１２１８〜ステップＳ１２３６およびステップＳ１２５０〜ステップＳ１２６６では、辺Ａ’Ｂ’、辺Ｄ’Ｃ’に分割された水平ラインのうち、どのラインの端点を割り当てるかを求める処理を行う。
まず、図２０（ｂ）に示す辺Ａ’Ｂ’のように図２０（ａ）に示す元となる辺ＡＢよりも短い辺に、貼り付けるラインの端点を割り当てる処理内容について説明する。元画像データの水平ライン数は１２本、辺Ａ’Ｂ’に貼り付けることのできるライン数は１１本なので、元画像データの１２本のラインのうち、２本のラインの端点が辺Ａ’Ｂ’上で重なる。重なるラインの選択の処理は、次のようになる。
【００９８】
ステップＳ１２１８で選択誤差（初期値＝０）ｅを決め、選択誤差ｅに誤差増分Δｅを加える（ｅ＝ｅ＋Δｅ）。Δｅは（元画像のライン数−１）／（辺Ａ’Ｂ’のピクセル数−１）である。なお、ここでは、ライン選択用であるからｅをｅ２とし、ΔｅをΔｅ２として処理をする。そうすると、ｅ２＝ｅ２＋Δｅ２となる。次いで、この値が１／２より大きくなったか否かをステップＳ１２２０で判別する。そして、誤差増分Δｅ２を加えた結果ｅ２がｅ２≧（１／２）であれば、ステップＳ１２２４に進んで現在のライン番号を［１］だけインクリメントする（つまり、次のライン番号に進める）。これは、選択誤差に誤差増分を加え、その結果が１／２より大きいか小さいかによって処理を選択するもので、選択誤差が１／２以上のときに誤差を補正する。現在のライン番号を１進めることにより、辺Ａ’Ｂ’上の次の点には次のラインの端点が割り当てられる。
【００９９】
このようにすると、点Ａ’から点Ｂ’に向ってＸ座標を１ずつ変えていったときに、少なくとも誤差増分Δｅ２が１の半分より大きい場合に、次のライン番号に変更するので、ライン端点の変化する位置が滑らかにつながることになる。
また、ステップＳ１２２０でｅ２が１／２未満のときはステップＳ１２３６にジャンプする。ステップＳ１２３６ではすべての端点について処理したか否かを判別し、すべての端点について処理が終了していなければ、ステップＳ１２０８に戻って同様の処理を繰り返す。したがって、誤差増分Δｅ２が１の半分より大きくなった時点でステップＳ１２３６へジャンプせず、ステップＳ１２２４の方に進むことになる。
【０１００】
ステップＳ１２２４を経ると、続くステップＳ１２２４で誤差補正を行い、ｅ２＝ｅ２−１とする。これは、選択誤差が１／２以上になって次のライン番号に変更したので、１を減算することにより、再び次のライン番号から誤差増分Δｅを加えて同様の判別を始めるためである。次いで、ステップＳ１２２８で再び選択誤差ｅ２が１／２以上であるか否かを判別する。これは、誤差補正を行った結果について、再度選択誤差ｅ２の大ささを判断するものである。そして、誤差補正を行った結果、選択誤差ｅ２が依然として１／２以上であれば、ステップＳ１２３０に進み、現在のライン番号と現在座標をＣＰＵ３１の内部レジスタ３１ａ内の端点バッファに格納する。次いで、ステップＳ１２３２でライン番号を［１］だけインクリメントする（つまり、次のライン番号に進める）。これにより、辺Ａ’Ｂ’上の同じ点に、次のラインの端点も割り当てられる。そして、選択誤差ｅ２が１／２未満になるまで、同じ点に次のラインの端点が順次割り当てられていく。
【０１０１】
次いで、ステップＳ１２３４で誤差補正を行い、ｅ２＝ｅ２−１とする。これは、上記同様に選択誤差が１／２以上になって次のライン番号に変更したので、１を減算することにより、再び次のライン番号から誤差増分Δｅを加えて同様の判別を始めるためである。その後、ステップＳ１２２８に戻って同様の処理を繰り返す。したがって、誤差を補正した結果（選択誤差）ｅ２が未だ１／２より大きければ、ライン番号を更に１進めて辺Ａ’Ｂ’上の同じ点に、次のラインの端点が割り当てられ、選択誤差ｅ２が１／２未満になるまで、同じ点に次のラインの端点が割り当てられることになる。
【０１０２】
一方、ステップＳ１２２８で誤差増分Δｅ２を加えた結果ｅ２がｅ２＜（１／２）であれば、ステップＳ１２３６にジャンプする。このときは、次のライン番号に変更されず、ライン番号は元のままである。また、この場合は選択誤差ｅ２は補正しない。ステップＳ１２３６ではすべての端点について処理したか否かを判別する。すべての端点について処理が終了していなければ、ステップＳ１２０８に戻って処理を繰り返す。これにより、点Ａ’から点Ｂ’に向ってＸ座標を１ずつ変えていったときに、誤差増分Δｅ２の大きさに応じて上記のような処理が繰り返される。誤差増分Δｅ２が１／２より大きい場合に、次のライン番号に変更されていく。以上のステップＳ１２１８〜ステップＳ１２３６を実行することにより、辺Ａ’Ｂ’のように元となる辺ＡＢよりも短い辺に、貼り付けるラインの端点を割り当てる場合の各ライン端点の位置が決定される。
【０１０３】
ここで、図２０の場合（辺Ａ’Ｂ’のように元となる辺ＡＢよりも短い辺に、ラインの一方の端点を割り当てる場合）の具体例について説明する。
図２０（ａ）は変形前のラインの一方の端点となる辺ＡＢを示し、図２０（ｂ）は貼り付けるラインの一方の端点となる辺Ａ’Ｂ’の様子を示し、さらに図２０（ｃ）は辺Ａ’Ｂ’におけるＸ方向およびＹ方向のピクセル数の変化を示している。まず、ライン０の端点が頂点Ａ’上に決まる。この時点でライン番号は０、選択誤差ｅは［０］に初期設定されている。また、誤差増分Δｅは
Δｅ＝（１２−１）／（１１−１）
＝１．１０である。次いで、選択誤差ｅはｅ＝０に初期設定されているからそのまとし、誤差増分ΔｅとしてΔｅ＝１．１０を加えると、
ｅ＝０＋１．１０＝１．１０≧（１／２）となる。これにより、ライン番号を１進める（ライン１になる：図２０（ｃ）参照）。したがって、辺Ａ’Ｂ’上の点▲１▼にはライン１の端点が割り当てられる（図２０（ｂ）参照）。このとき、選択誤差ｅを次のように補正する。
ｅ＝１．１０−１＝０．１０＜１／２
【０１０４】
ここまでの選択誤差ｅ＝０．１０に、再び誤差増分Δｅ＝１．１０を加えると、
ｅ＝０．１０＋１．１０＝１．２０≧（１／２）となる。これにより、ライン番号を１進める（今度はライン２になる：図２０（ｃ）参照）。したがって、辺Ａ’Ｂ’上の点▲２▼にはライン２の端点が割り当てられる（図２０（ｂ）参照）。このとき、選択誤差ｅを次のように補正する。
ｅ＝１．２０−１＝０．２０＜１／２
以下、同様の処理を行い、辺Ａ’Ｂ’上の点▲３▼にはライン３の端点が、点▲４▼にはライン４の端点が、点▲５▼にはライン５の端点がそれぞれ割り当てられる（図２０（ｂ）参照）。このとき、ライン５を割り当てて選択誤差ｅを補正した時点で選択誤差ｅは０．５０になる。選択誤差ｅを補正した時点で未だｅ≧１／２なので、ライン番号を更に１進めて（ライン６になる）、点▲５▼にライン６の端点も割り当てる。次いで、さらに選択誤差ｅを以下のように補正する。
ｅ＝０．５０−１＝−０．５０＜１／２
以上の処理を繰り返すことにより、辺Ａ’Ｂ’に分割された元の水平ライン内のどのラインの端点を割り当てるかが決まる。
【０１０５】
さて、再び図２９のフローチャートに戻って説明する。
上述の説明は辺Ａ’Ｂ’のように元となる辺ＡＢよりも短い辺に、貼り付けるラインの端点を割り当てる処理内容であったが、今度は、図２１（ｂ）に示す辺Ｄ’Ｃ’のように図２１（ａ）に示す元となる辺ＤＣよりも長い辺に、貼り付けるラインの端点を割り当てる処理内容について説明する。この場合には図２９に示すステップＳ１２５０以降の処理が実行される。これは、先のステップＳ１２０４の判別結果がＮＯである場合に相当し、この判別結果がＮＯということは元となる辺ＤＣよりも長い辺Ｄ’Ｃ’の処理に進むケースである。
ステップＳ１２０４の判別結果がＮＯであるときは図２９のステップＳ１２３８に分岐し、端点の位置決定を行った後、ステップＳ１２５０以降の各ステップを実行する。
まず、元画像データの水平ライン数は１２本、辺Ｄ’Ｃ’に貼り付けることのできるライン数は１４本なので、元画像データの１２本のラインのうち、２本のラインの端点が辺Ｄ’Ｃ’上で２回貼り付けられることになる。貼り付けられるラインの選択の処理は、次のようになる。
【０１０６】
ステップＳ１２５０で選択誤差（初期値＝０）ｅを決め、選択誤差ｅに誤差増分Δｅを加える（ｅ＝ｅ＋Δｅ）。Δｅは（元画像のライン数−１）／（辺Ｄ’Ｃ’のピクセル数−１）である。なお、ここでは、ライン選択用であるからｅをｅ２とし、ΔｅをΔｅ２として処理をする。そうすると、ｅ２＝ｅ２＋Δｅ２となる。次いで、この値が１／２より大きくなったか否かをステップＳ１２５２で判別する。そして、誤差増分Δｅ２を加えた結果ｅ２がｅ２≧（１／２）であれば、ステップＳ１２５４に進んで現在のライン番号を［１］だけインクリメントする（つまり、次のライン番号に進める）。これは、選択誤差に誤差増分を加え、その結果が１／２より大きいか小さいかによって処理を選択するもので、選択誤差が１／２以上のときに誤差を補正する。現在のライン番号を１進めることにより、辺Ｄ’Ｃ’上の次の点には次のラインの端点が割り当てられる。
【０１０７】
このようにすると、点Ｄ’から点Ｃ’に向ってＸ座標を１ずつ変えていったときに、少なくとも誤差増分Δｅ２が１の半分より大きい場合に、次のライン番号に変更するので、ライン端点の変化する位置が滑らかにつながることになる。
また、ステップＳ２５２でｅ２が１／２未満のときはステップＳ２６６にジャンプする。ステップＳ１２６６ではすべての端点について処理したか否かを判別し、すべての端点について処理が終了していなければ、ステップＳ１２４０に戻って同様の処理を繰り返す。したがって、誤差増分Δｅ２が１の半分より大きくなった時点でステップＳ１２６６へジャンプせず、ステップＳ１２５４の方に進むことになる。
【０１０８】
ステップＳ１２５４を経ると、続くステップＳ１２５６で誤差補正を行い、ｅ２＝ｅ２−１とする。これは、選択誤差が１／２以上になって次のライン番号に変更したので、１を減算することにより、再び次のライン番号から誤差増分Δｅを加えて同様の判別を始めるためである。次いで、ステップＳ１２５８で再び選択誤差ｅ２が１／２以上であるか否かを判別する。これは、誤差補正を行った結果について、再度選択誤差ｅ２の大きさを判断するものである。そして、誤差補正を行った結果、選択誤差ｅ２が依然として１／２以上であれば、ステップＳ１２６０に進み、現在のライン番号と現在座標をＣＰＵ３１の内部レジスタ３１ａ内の端点バッファに格納する。次いで、ステップＳ１２６２でライン番号を［１］だけインクリメントする（つまり、次のライン番号に進める）。これにより、辺Ｄ’Ｃ’上の同じ点に、次のラインの端点も割り当てられる。そして、選択誤差ｅ２が１／２未満になるまで、同じ点に次のラインの端点が順次割り当てられていく。
【０１０９】
次いで、ステップＳ１２６４で誤差補正を行い、ｅ２＝ｅ２−１とする。これは、上記同様に選択誤差が１／２以上になって次のライン番号に変更したので、１を減算することにより、再び次のライン番号から誤差増分Δｅを加えて同様の判別を始めるためである。その後、再びステップＳ１２５８に戻って同様の処理を繰り返す。したがって、誤差を補正した結果（選択誤差）ｅ２が未だ１／２より大きければ、ライン番号を更に１進めて辺Ｄ’Ｃ’上の同じ点に、次のラインの端点が割り当てられることになる。そして、選択誤差ｅ２が１／２未満になるまで、同じ点に次のラインの端点が割り当てられていく。
【０１１０】
一方、ステップＳ２５８で誤差増分Δｅ２を加えた結果ｅ２がｅ２＜（１／２）であれば、ステップＳ１２６６にジャンプする。このときは、次のライン番号に変更されず、ライン番号は元のままである。また、この場合は選択誤差ｅ２は補正しない。ステップＳ１２６６ではすべての端点について処理したか否かを判別する。すべての端点について処理が終了していなければ、ステップＳ１２４０に戻って処理を繰り返す。これにより、点Ｄ’から点Ｃ’に向ってＸ座標を１ずつ変えていったときに、誤差増分Δｅ２の大きさに応じて上記のような処理が繰り返される。誤差増分Δｅ２が１／２より大きい場合に、次のライン番号に変更されていく。以上のステップＳ１２５０〜ステップＳ１２６６を実行することにより、辺Ｄ’Ｃ’のように元となる辺ＤＣよりも長い辺に、貼り付けるラインの端点を割り当てる場合の各ライン端点の位置が決定される。
【０１１１】
ここで、図２１の場合（辺Ｄ’Ｃ’のように元となる辺ＡＢよりも長い辺に、ラインの一方の端点を割り当てる場合）の具体例について説明する。
図２１（ａ）は変形前のラインの一方の端点となる辺ＤＣを示し、図２１（ｂ）は貼り付けるラインの一方の端点となる辺Ｄ’Ｃ’の様子を示し、さらに図２１（ｃ）は辺Ｄ’Ｃ’におけるＸ方向およびＹ方向のピクセル数の変化を示している。まず、ライン０の端点が頂点てＤ’上に決まる。この時点でライン番号は０、選択誤差ｅは［０］に初期設定されている。また、誤差増分Δｅは
Δｅ＝（１２−１）／（１４−１）
＝０．８４である。次いで、選択誤差ｅはｅ＝０に初期設定されているからそのままとし、誤差増分ΔｅとしてΔｅ＝０．８４を加えると、
ｅ＝０＋０．８４＝０．８４≧（１／２）となる。これにより、ライン番号を１進める（ライン１になる：図２１（ｃ）参照）。したがって、辺Ｄ’Ｃ’上の点▲１▼にはライン１の端点が割り当てられる（図２１（ｂ）参照）。このとき、選択誤差ｅを次のように補正する。
ｅ＝０．８４−１＝−０．１６＜１／２
【０１１２】
同様に、辺Ｄ’Ｃ’上の点▲２▼にはライン２の端点が、点▲３▼にはライン３の端点が割り当てられる（図２１（ｂ）参照）。
ライン３を割り当てて選択誤差ｅを補正して時点で、選択誤差ｅは−０．４８になっている。ここまでの選択誤差ｅ＝−０．４８に再び誤差増分Δｅ＝０．８４を加えると、
ｅ＝−０．４８＋０．８４＝０．３６＜（１／２）になるので、ライン３を点▲４▼にもう一度貼り付ける（図２１（ｃ）参照）。このとき、選択誤差ｅは補正しない。
以上の処理を繰り返すことにより、辺Ｄ’Ｃ’に分割された元の水平ライン内のどのラインの端点を割り当てるかが決まる。ライン端点処理が終わった時点における端点バッファへの格納データは図３２に示すようになる。図３２では、辺Ａ’Ｂ’上のライン０〜ライン１１の１２個の端点位置が座標によって端点バッファに記憶される。また、辺Ｄ’Ｃ’上のライン０〜ライン１１（そのうちライン３とライン８は２つある）の１４個の端点位置が座標によって端点バッファに記憶される。
【０１１３】
ライン描画処理のサブルーチン
さて、その後はこのようにして求めた辺Ａ’Ｂ’上に一方のラインの端点を持ち、辺Ｄ’Ｃ’上に他方の端点を持つような複数のラインに元画像データ（矩形ＡＢＣＤ）の対応するラインを順番に貼り付けていけば画像変形が行える。ただし、このとき転送先と転送元ではラインの長さ（ピクセル数）が異なるので、ライン毎に拡大あるいは縮小をしながら貼り付けていくことになる。
そこで、続いて前述の図１５に示したステップＳ１１０８のラインの描画処理のサブルーチンについて説明する。
図３０はラインの描画処理を示すサブルーチンのフローチャートである。まず、貼り付けるラインの位置を求める処理から説明する。具体例としては、後にライン０の貼り付け位置を求める方法を説明をする。他のラインの貼り付け位置についても同様である。
まず、ステップＳ１３００で座標決定用誤差ｅ１、ドット選択用誤差ｅ３、現在ドット番号をすべて［０］に初期設定する。座標決定用誤差ｅ１とは、ここではラインの描画位置を決めるときに用いる座標決定用誤差のことである。ドット選択用誤差ｅ３とは、ラインに割り当てるドットを選択するときに用いるドット選択用誤差のことである。これにより、最初は各誤差が［０］になる。
【０１１４】
次いで、ステップＳ１３０２で辺Ａ’Ｂ’上の端点の座標をＣＰＵ３１の内部レジスタ３１ａにある現在座標というエリアに格納する（図２６参照）。なお、ドット選択処理の過程で使用される関連の格納エリアとしては、ドット選択用誤差ｅ３のエリア、ドット選択用誤差増分Δｅ３のエリア、現在ドット番号のエリアが用いられる。
次いで、ステップＳ１３０４でＹ方向のピクセル数がＸ方向のピクセル数より多いか否かを判別する。いま、ライン０を貼り付けるため各ドットの位置を求める場合の具体例は図２２に示される。図２２（ａ）は変形前のラインＡＤを示し、図２２（ｂ）は変形後のライン辺Ａ’Ｄ’の様子を示し、さらに図２２（ｃ）は辺Ａ’Ｄ’におけるＸ方向およびＹ方向のピクセル数の変化を示している。この例に対応させて考えると、辺Ａ’Ｄ’はＹ方向に１０ピクセル、Ｘ方向に２ピクセルに渡って描画されるので、ステップＳ１３０４の判別結果はＹＥＳとなり、このケースではステップＳ１３０６に進む。一方、逆のケースではＮＯに分岐して図２９に示すステップＳ１３３８に進む。
また、この場合、図２２に示すケースでは点Ａ’から点Ｄ’に向ってＸ座標を１ずつ変えていったときにＹ座標の変化する位置を求めると、そのとき変化した座標がラインＡ’Ｄ’を貼り付けする位置となる。したがって、無条件に位置の決る始点（点Ａ’）を除く９個のドットを打つときには、Ｘ座標の変化する位置としてＸ座標が変化する１箇所を求めることになる。
【０１１５】
ステップＳ１３０６に進むと、座標決定用誤差増分Δｅ１を（Ｘピクセル数−１）／（Ｙピクセル数−１）に初期設定するとともに、ドット選択誤差増分Δｅ３を（転送元ドット数−１）／（転送先ドット数−１）に初期設定する。ステップＳ１３００〜ステップＳ１３０６の処理により必要な初期設定が完了する。次いで、ステップＳ１３０８で現在座標に描画されていなければ、現在ドット番号のドットを描画する。これにより、該当するラインの最初の点▲１▼がドットで描画される。次いで、ステップＳ１３１０で現在座標のＹ座標を変更する。次いで、ステップＳ１３１２で座標決定用誤差ｅ１についての判別を以下のようにして行う。すなわち、選択誤差（初期値＝０）ｅを決め、選択誤差ｅに誤差増分Δｅを加える（ｅ＝ｅ＋Δｅ）。Δｅは（Ｙ方向のピクセル数−１）／（Ｘ方向のピクセル数−１）である。なお、ここでは、座標決定用であるからｅをｅ１とし、ΔｅをΔｅ１として処理をする。そうすると、ｅ１＝ｅ１＋Δｅ１となる。この値が１／２より大きくなったか否かを判別する。そして、誤差増分Δｅ１を加えた結果ｅ１がｅ１≧（１／２）であれば、ステップＳ１３１４に進んで次に打つ点の座標（次の現在座標に相当）のＸ座標を変更する。これは、選択誤差に誤差増分を加え、その結果が１／２より大きいか小さいかによって処理を選択するもので、選択誤差が１／２以上のときに誤差を補正する。
【０１１６】
このようにすると、点Ａ’から点Ｄ’に向ってＸ座標を１ずつ変えていったときに、少なくとも誤差増分Δｅ１が１の半分より大きい場合に、次の座標を変更するので、Ｙ座標の変化する位置が滑らかにつながることになる。次いで、ステップＳ１３１６で誤差補正を行い、ｅ１＝ｅ１−１とする。これは、選択誤差が１／２以上になって次の座標を変更したので、１を減算することにより、再び次の現在座標から誤差増分Δｅを加えて同様の判別を始めるためである。その後、ステップＳ１３１８に進む。
また、誤差増分Δｅ１を加えた結果ｅ１がｅ１＜（１／２）であれば、ステップＳ１３１４、ステップＳ１３１６をジャンプしてステップＳ１３１８に進む。このときは、次に打つ点のＸ座標は元のままにする。また、この場合は選択誤差ｅ１は補正しない。以上のステップＳ１３１０〜ステップＳ１３１６を実行することにより、Ｙ方向のピクセル数がＸ方向のピクセル数より多い場合における該当するラインの貼り付け位置が決定される。
【０１１７】
一方、上記ステップＳ１３０４でＹ方向のピクセル数がＸ方向のピクセル数より小さいときは図３１のステップＳ１３２８に進み、今度はＸ座標の方を変更する処理を行う。すなわち、ステップＳ１３２８で座標決定用誤差増分Δｅ１を（Ｙピクセル数−１）／（Ｘピクセル数−１）に初期設定するとともに、ドット選択誤差増分Δｅ３を（転送元ドット数−１）／（転送先ドット数−１）に初期設定する。次いで、ステップＳ１３３０で現在座標に描画されていなければ、現在ドット番号のドットを描画する。これにより、該当するラインの最初の点▲１▼がドットで描画される。次いで、ステップＳ１３３２で現在座標のＸ座標を変更する。次いで、ステップＳ１３３４で座標決定用誤差ｅ１についての判別を以下のようにして行う。
【０１１８】
すなわち、選択誤差（初期値＝０）ｅを決め、選択誤差ｅに誤差増分Δｅを加える（ｅ＝ｅ＋Δｅ）。Δｅは（Ｙ方向のピクセル数−１）／（Ｘ方向のピクセル数−１）である。なお、ここでは、座標決定用であるからｅをｅ１とし、ΔｅをΔｅ１として処理をする。そうすると、ｅ１＝ｅ１＋Δｅ１となる。この値が１／２より大きくなったか否かを判別する。そして、誤差増分Δｅ１を加えた結果ｅ１がｅ１≧（１／２）であれば、ステップＳ１３３６に進んで次に打つ点の座標（次の現在座標に相当）のＹ座標を変更する。これは、選択誤差に誤差増分を加え、その結果が１／２より大きいか小さいかによって処理を選択するもので、選択誤差が１／２以上のときに誤差を補正する。
【０１１９】
このようにすると、点Ａ’から点Ｄ’に向ってＸ座標を１ずつ変えていったときに、少なくとも誤差増分Δｅ１が１の半分より大きい場合に、次の座標を変更するので、Ｙ座標の変化する位置が滑らかにつながることになる。次いで、ステップＳ１３４０で誤差補正を行い、ｅ１＝ｅ１−１とする。これは、選択誤差が１／２以上になって次の座標を変更したので、１を減算することにより、再び次の現在座標から誤差増分Δｅを加えて同様の判別を始めるためである。その後、ステップＳ１３４２に進む。
また、誤差増分Δｅ１を加えた結果ｅ１がｅ１＜（１／２）であれば、ステップＳ１３３８、ステップＳ１３４０をジャンプしてステップＳ１３４２に進む。このときは、次に打つ点のＸ座標は元のままにする。また、この場合は選択誤差ｅ１は補正しない。以上のステップＳ１３３２〜ステップＳ１３４０を実行することにより、Ｙ方向のピクセル数がＸ方向のピクセル数より小さい場合における該当するラインの貼り付け位置が決定される。
【０１２０】
なお、上記処理は前述した図２８に示すステップＳ１２１０〜ステップＳ１２１６と同様の処理内容であるが、図２８のルーチンに比べてＸとＹが逆になっている部分がある。これは、Ｘ方向とＹ方向のピクセル数の多い方を基準として考えているからである。図２８のルーチンではピクセル数の多いＹ座標を基準として考え、Ｙ座標を１つずつ変えていったときに、Ｘ座標がどう変化するかを決定したのに対して、図３０のルーチンではピクセル数の多いＸ座標を基準として考え、Ｘ座標を１つずつ変えていったときに、Ｙ座標がどう変化するかを決定している。
他のラインの貼り付け位置についても、同様の方法で求める処理が行われる。
【０１２１】
以上で、各ラインの貼り付け位置が求まったので、次に、元となる水平ドットラインのドット内のうち、どのドットを割り当てる（つまり、ドットを選択する）かを求める処理内容を説明する。
まず、ドット選択の処理として示されるステップＳ１３１８以降の処理で、転送先ラインのピクセル数が転送元ラインのピクセル数より少ないとき、つまりラインを縮小する方法を説明する。この方法は、ドット選択の処理であるステップＳ１３１８〜ステップＳ１３２６で示される。
転送元ラインの最初のドット（ドット０）を無条件に選択するものとすると、その他のドットの選択の方法は以下のようになる。すなわち、まずステップＳ１３１８で選択誤差（初期値＝０）ｅを決め、選択誤差ｅに誤差増分Δｅを加える（ｅ＝ｅ＋Δｅ）。Δｅは（転送元のドット数−１）／（転送先のドット数−１）である。なお、ここでは、ドット選択用であるからｅをｅ３とし、ΔｅをΔｅ３として処理をする。そうすると、ｅ３＝ｅ３＋Δｅ３となる。
【０１２２】
次いで、この値が１／２より大きくなったか否かをステップＳ１３２０で判別する。そして、誤差増分Δｅ３を加えた結果ｅ３がｅ３≧（１／２）であれば、ステップＳ１３２２に進んで現在ドット番号（転送元ラインのドット番号）を［１］だけインクリメントする（つまり、次のドット番号に進める）。これは、選択誤差に誤差増分を加え、その結果が１／２より大きいか小さいかによって処理を選択するもので、選択誤差が１／２以上のときに誤差を補正する。転送元ラインのドット番号を１進めることにより、辺ＡＤ上で次に選択すべき転送元ラインのドット番号が割り当てられる。
【０１２３】
このようにすると、点Ａから点Ｄに向ってＸ座標を１ずつ変えていったときに、少なくとも誤差増分Δｅ３が１の半分より大きい場合に、次のドット番号に変更するので、ドットの変化する位置が滑らかにつながることになる。次いで、ステップＳ１３２４で誤差補正を行い、ｅ３＝ｅ３−１とする。これは、選択誤差が１／２以上になって次のドット番号を変更したので、１を減算することにより、再び次の現在ドット番号から誤差増分Δｅを加えて同様の判別を始めるためである。その後、ステップＳ１３４４に戻ってステップＳ１３４４〜ステップＳ１３４８のループを繰り返す。そして、ステップＳ１３２０でｅ３が１／２未満になると、ステップＳ１３５０に分岐する。
【０１２４】
一方、ステップＳ１３２０でｅ３が当初から１／２未満のときはステップＳ１３２６にジャンプする。ステップＳ１３２６ではすべてのドットについて処理したか否かを判別し、すべてのドットについて処理が終了していなければ、ステップＳ１３３０に戻って同様の処理を繰り返す。したがって、誤差増分Δｅ３が１の半分より大きくなった時点ではステップＳ１３５０へジャンプせず、ステップＳ１３４６の方へ進むことになる。
このように、誤差増分Δｅ３を加えた結果（選択誤差）ｅ３がｅ３＜（１／２）であれば、転送先ラインの次のドットには１つ前のドットと同じデータが再び転送される。このとき、水平ドット番号と選択誤差ｅ３の変更は行われない。
【０１２５】
ここで、ドット選択の具体例について図２４を参照して説明する。
図２４（ａ）は変形前の転送元ラインのドットの様子を示し、図２４（ｂ）は変形後の転送先ラインのドットの様子を示し、さらに図２４（ｃ）は転送ラインにおけるＸ方向およびＹ方向のピクセル数の変化を示している。この例は、転送先ラインのピクセル数が転送元ラインのピクセル数より多いとき、つまりラインを拡大する処理に相当するものである。
この例に対応させて考えると、転送元ラインのドット数は１６個、転送先ラインのドット数は１７個なので、転送先の１７個のドットのうち１個は１つ前のドットと同じデータを転送することになる。転送元ラインの最初のドット（ドット０）を無条件に転送するものとすると、その他のドットの転送の処理は次のようにして行われる。
【０１２６】
まず、最初にドット０を転送する。この時点で、選択誤差ｅは［０］に初期設定され、ドット番号は０になっている。また、転送元ラインのドット数は１６個、転送先ラインのドット数は１７個であるから、誤差増分Δｅは
Δｅ＝（１６−１）／（１７−１）
＝０．９３である。次いで、選択誤差ｅはｅ＝０に初期設定されているからそのままとし、誤差増分ΔｅとしてΔｅ＝０．９３を加えると、
ｅ＝０＋０．９３＝０．９３≧（１／２）となる。したがって、このときはドット番号を１進める（ドット１になる）。同時に、選択誤差ｅを以下のように補正する。
ｅ＝０．９３−１＝−０．０７＜（１／２）
この時点で選択誤差ｅが１／２より小さくなるので、点▲１▼にはドット１が転送される（図２４（ｂ）、図２４（ｃ）参照）。
【０１２７】
次いで、同様にここまでの選択誤差ｅ＝−０．０７に誤差増分ΔｅとしてΔｅ＝０．９３を加えると、
ｅ＝−０．０７＋０．９３＝０．８６≧（１／２）になるので、ドット番号を１進める（ドット２になる）とともに、選択誤差ｅを以下のように補正する。
ｅ＝０．８６−１＝−０．１４＜（１／２）
この時点で選択誤差ｅが１／２より小さくなり、点▲２▼に表示すべきドットとして、ドット２が転送される（図２４（ｂ）、図２４（ｃ）参照）。
【０１２８】
以後、同様の処理を行うと、点▲３▼にはドット３が、点▲４▼にはドット４が、点▲５▼にはドット５が、点▲６▼にはドット６が、点▲７▼にはドット７がそれぞれ割り当てられる。ドット７を割り当てた時点で選択誤差ｅは−０．４９になる。ここまでの選択誤差ｅ＝−０．４９に誤差増分Δｅ＝０．９３を加えると、
ｅ＝−０．４９＋０．９３＝０．４４＜（１／２）になるので、今度はドット番号は７のままで、選択誤差ｅも変更しない。したがって、点▲８▼にはドット７が再び転送される（図２４（ｂ）、図２４（ｃ）参照）。
以上の処理を繰り返すことにより、転送先ラインの１６個のドットから１個のドット（ドット７）が２回転送されて、転送先ラインの１７個のドットが決定される。このようにして、転送先ラインのピクセル数が転送元ラインのピクセル数より多い場合に、ラインを拡大する処理が行われる。
【０１２９】
上述した各プログラムを実行することにより、変形前の画像データのラインを変形後の画像データとして貼り付ける処理が行われるが、このときラインの貼り付けは辺Ａ’Ｂ’と辺Ｄ’Ｃ’のうち、長い方の辺が有するピクセル数分だけ行われる。例えば、図１６の例では辺Ａ’Ｂ’と辺Ｄ’Ｃ’の各ピクセル数を比較すると、辺Ａ’Ｂ’のピクセル数が１１、辺Ｄ’Ｃ’のピクセル数が１４であるから、辺Ｄ’Ｃ’のピクセル数分（＝１４）だけ行われる。具体的には、図１６（ｂ）に示すように辺Ｄ’Ｃ’のピクセル数に対応して、ライン０、ライン０、ライン１、ライン２、ライン３、ライン３’、ライン４、ライン５、ライン６、ライン７、ライン８、ライン８’、ライン９、ライン１０、ライン１１の１４回ラインの貼り付けるが行われる。そして、各ラインを貼り付けた最終的な状態は図２５（ｂ）のように示される。なお、図２５（ａ）は変形前の画像データのラインである。
なお、図１７（ａ）、（ｂ）に示すように貼り付けた２つのラインが重なる部分が生じるが、本実施例では先に書かれたものを優先するようにしている。また、この他に、後に書かれたものを優先する方法、あるいは重なった部分では２つのドットデータの色コードを合成する毎に、その値を加えて１／２する等の処理方法もある。ドットデータの色コードを合成する場合には、例えばＲ（赤成分）、Ｇ（緑成分）、Ｂ（青成分）というように色コードを分ける。
【０１３０】
このように本実施例では、ビット配列形式の画像データを有する変形対象を複数の小矩形に分割し、変形対象全体が滑らかに変形されるように、各小矩形を座標変換処理に従って異なる小四角形にそれぞれ変形することが行われる。このとき、小矩形の変形処理では、変形対象の内部の指定範囲に含まれる４つの小多角形の頂点を少なくとも各頂点の相対位置が変らないように下方に平行移動したとき、変形対象全体が滑らかに変形されるように他の小矩形の頂点を移動させ、移動した他の小矩形の頂点を基準となる小矩形の頂点に基づいて算出し、この算出した頂点に対応して各小矩形を四角形に変形することが行われる。その後、変形前の小矩形に含まれるビット配列形式の画像データの配列が各小四角毎にライン貼り付け法に従って変形後の小四角形のデータに対応するように順次変形されて変形後の全体画像が作成される。
その結果、例えば、図１（ａ）に示すようなビット配列形式の「目」の画像を図１（ｂ）に示すような「目」の画像に滑らかに変形させることができる。
【０１３１】
したがって、変形対象の画像データの配列に対して各小矩形毎に変形処理が行われるので、従来のように全く異なる全体の画像データを予め持つ必要がなく、少ないメモリ容量で、ビット配列形式のデータを有する画像を自由に変形することができる。
また、変形対象を複数の小矩形に分割し、各小矩形毎に変形処理が行われるので、変形に自由度があり、予めメモリに多くのデータを持たなくても、画像を滑らかに変形することができる。
特に、変形対象の内部の指定範囲に含まれる小多角形をそのまま平行移動させる変形法を使用することにより、変形後のすべての小四角形の頂点の位置データ（例えば、座標）を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。さらに、この変形法を用いると、変形対象の外枠の形を変えずに、また変形対象の指定した範囲に含まれる小多角形を変形せずに任意の場所に移動でき、その他の小多角形のみを変形することができる。よって、画像の外形（例えば、大きさ）および画像データの一部分を変えずに、その場所を移動したいという場合に有効である。
例えば、図１（ａ）に示すようなビット配列形式の「目」の画像を変形する場合、「目」の形を変えずに、瞳にうつる影の位置を変えたいようなときに有効に活用することができる。
【０１３２】
具体的な波及効果としては、本発明の適用により、例えばアニメーション、ゲーム等のキャラクター又は背景データ等のようにドットで構成され、かつ各ドット毎に表示色番号あるいはパレット番号を持つようなビット配列形式の画像を、自由にかつ滑らかに変形することができる。その結果、１つの元画像データから元画像データの一部又は全部が滑らかに変形した複数の画像データを作成することができる。
また、アニメーションに適用した場合、従来のように少しずつその形の異なる複数の画像データを予めメモリに持っておかなくても、一定時間毎に元画像データを本発明の変形法を用いて変形すれば、少ないメモリ容量で従来と同等のアニメーションを行うことができる。
ゲーム等に複数のキャラクターを登場させる場合にも、１つのキャラクターの画像データから全く別の複数のキャラクターを作ることができる。
ゲーム等に登場するキャラクターの一部分（例えば、目、鼻、手、足等のパーツ）の形を変える場合にも、元となる１つの画像データだけを持っていればよいという効果がある。
ゲーム等の背景等に特殊効果を付加する場合にも、従来のような拡大、縮小、四角形から四角形への変形等に比べてはるかに自由かつ滑らかな変形を行うことができ、従来にない特殊効果（例えば、背景を歪ませて異次元の世界を表現する等）を付加することができる。
なお、変形対象の内部の指定した範囲に含まれる複数の小多角形は上記実施例のような４つに限るものではなく、その他の数の小多角形を指定範囲に含めてもよい。
【０１３３】
上記各実施例ではビット配列形式の画像データを有する変形対象を小矩形に分割し、任意な四角形に変形しているが、これに限らず、例えば変形対象を複数の小六角形に分割し、各六角形を例えば所定の変形処理手順に従って異なる小六角形にそれぞれ変形することにより、変形後の画像データを作成するようにしてもよい。
また、ビット配列形式の画像データを有する変形対象を分割する形状は上記の２種類に限るものではなく、本発明の目的の範囲内が各種の変形が可能である。さらに、本発明の適用はアニメーション、ゲーム等のキャラクター又は背景データ等に限るものではなく、他の分野、他の画像データにも適用できる。
【０１３４】
【発明の効果】
本発明によれば、変形対象を複数の小多角形に分割し、各小多角形を所定の変形処理に従って異なる小多角形にそれぞれ変形し、このとき小多角形の変形処理では、変形対象の内部の任意の範囲に含まれる小多角形の頂点を、各頂点の相対位置を変えずに前記変形対象内の任意の位置に移動したとき、前記変形対象の内部の任意の範囲に含まれる小多角形の移動に応じて他の小多角形の頂点を前記変形対象内で移動させ、移動した他の小多角形の頂点を前記変形対象の内部の任意の範囲に含まれる小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形し、さらに変形前の小多角形に含まれるビット配列形式の画像データの配列を、各小多角形毎に、所定のデータ変換処理に従って変形後の小多角形のデータに対応するように順次変更して変更後の全体画像を作成しているので、以下の効果を得ることができる。
（１）変形対象の有する画像データの配列は、各小多角形毎に変更処理が行われるので、従来のように全く異なる全体の画像データを予め持つ必要がなく、少ないメモリ容量で、ビット配列形式の画像を自由に変形することができる。
（２）変形対象を複数の小多角形に分割し、各小多角形毎に変形処理が行われるので、変形に自由度があり、予めメモリに多くのデータを持たなくても、画像を滑らかに変形することができる。
（３）特に、変形対象の内部の指定範囲に含まれる小多角形をそのまま平行移動させる変形法を使用した場合、変形後のすべての小多角形の頂点の位置データ（例えば、座標）を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。
（４）さらに、この変形法を用いると、変形対象の外枠の形を変えずに、また変形対象の指定した範囲に含まれる小多角形を変形せずに任意の場所に移動でき、その他の小多角形のみを変形することができる。よって、画像の外形（例えば、大きさ）および画像データの一部分を変えずに、その場所を移動したいという場合に有効である。
【０１３５】
他の請求項記載の発明によれば、小多角形の変形処理において、変形対象の内部の任意の範囲に少なくとも複数個の小多角形を含み、これら複数個の小多角形の頂点を、各頂点の相対位置変えずに変形対象内の任意の位置に移動したときであっても、他の小多角形の頂点を複数個の小多角形の移動後の頂点に基づいて算出し、この算出した頂点に対応して各小多角形を変形しているので、同様に変形後のすべての小多角形の頂点の位置データ（例えば、座標）を持っておく必要がなく、少ない変形データで滑らかな画像変形を行わせることができる。また、この変形法を用いると、変形対象の外枠の形を変えずに、かつ変形対象の指定した範囲に含まれる小多角形を変形せずに任意の場所に移動でき、その他の小多角形のみを変形することができる。
【図面の簡単な説明】
【図１】本発明による多角形分割変形方法の原理を説明する図である。
【図２】本発明による多角形分割変形方法の小矩形から任意の四角形への変形例を示す図である。
【図３】本発明に係る画像変形装置の第１実施例の構成図である。
【図４】同実施例の変形対象となる画像データを多数の小矩形に分割する例を示す図である。
【図５】同実施例のＣＰＵの内部レジスタへのデータの格納例を示す図である。
【図６】同実施例の画像変形処理のメインプログラムを示すフローチャートである。
【図７】同実施例の小矩形変形処理のサブルーチンを示すフローチャートである。
【図８】同実施例のライン貼り付け法を説明する図である。
【図９】同実施例の変形対象の変形処理を説明する図である。
【図１０】同実施例のデータの格納例を示す図である。
【図１１】同実施例の格子点座標算出処理のルーチンを示すフローチャートである。
【図１２】同実施例の格子点座標算出処理のルーチンを示すフローチャートである。
【図１３】同実施例の格子点座標算出処理のルーチンを示すフローチャートである。
【図１４】同実施例の格子点座標算出処理のルーチンを示すフローチャートである。
【図１５】同実施例のライン貼り付け処理のサブルーチンを示すフローチャートである。
【図１６】同実施例の画像データの変形例を示す図である。
【図１７】同実施例の画像データの変形例を示す図である。
【図１８】同実施例の画像データの変形例を示す図である。
【図１９】同実施例の画像データの変形例を示す図である。
【図２０】同実施例の画像データの変形例を示す図である。
【図２１】同画像データの変形例を示す図である。
【図２２】同実施例の画像データの変形例を示す図である。
【図２３】同実施例の画像データの変形例を示す図である。
【図２４】同実施例の画像データの変形例を示す図である。
【図２５】同実施例の画像データの変形例を示す図である。
【図２６】同実施例のＣＰＵの内部レジスタへのデータの格納例を示す図である。
【図２７】同実施例のライン描画の一例を説明する図である。
【図２８】同実施例のライン端点処理のサブルーチンの一部を示すフローチャートである。
【図２９】同実施例のライン端点処理のサブルーチンの一部を示すフローチャートである。
【図３０】同ライン描画処理のサブルーチンの一部を示すフローチャートである。
【図３１】同実施例のライン描画処理のサブルーチンの一部を示すフローチャートである。
【図３２】同実施例の端点バッファへのデータの格納例を示す図である。
【符号の説明】
３１  ＣＰＵ（分割手段、変形手段、画像データ作成手段、座標変換手段、データ変換手段、画像変形制御手段）
３２  入力操作子（変形態様指定手段）
３３  記憶装置（記憶手段）
３４  ＶＤＰ
３５  ＶＲＡＭ
３６  ＴＶディスプレイ（表示手段）
４１  ビット配列形式の画像データ
４２  変形前の格子点座標
４３、４４  変形後の格子点座標
５１  第１の変形スイッチ
５２  第２の変形スイッチ
【図１】
0003548867.tif 000002
【図２】
0003548867.tif 000003
【図３】
0003548867.tif 000004
【図４】
0003548867.tif 000005
【図５】
0003548867.tif 000006
【図６】
0003548867.tif 000007
【図７】
0003548867.tif 000008
【図８】
0003548867.tif 000009
【図９】
0003548867.tif 000010
【図１０】
0003548867.tif 000011
【図１１】
0003548867.tif 000012
【図１２】
0003548867.tif 000013
【図１３】
0003548867.tif 000014
【図１４】
0003548867.tif 000015
【図１５】
0003548867.tif 000016
【図１６】
0003548867.tif 000017
【図１７】
0003548867.tif 000018
【図１８】
0003548867.tif 000019
【図１９】
0003548867.tif 000020
【図２０】
0003548867.tif 000021
【図２１】
0003548867.tif 000022
【図２２】
0003548867.tif 000023
【図２３】
0003548867.tif 000024
【図２４】
0003548867.tif 000025
【図２５】
0003548867.tif 000026
【図２６】
0003548867.tif 000027
【図２７】
0003548867.tif 000028
【図２８】
0003548867.tif 000029
【図２９】
0003548867.tif 000030
【図３０】
0003548867.tif 000031
【図３１】
0003548867.tif 000032
【図３２】
0003548867.tif 000033