
解説クラスCopyClear(29)
クラスCopyClear(29)
2025年2月15初稿(初講)解説
今回は、画像の外周一回りをクリアする関数群です!
解説『解説クラスCopyClear(28)』の続きです
(4-14-254)関数「int ClearRoundImageBase(
TypeArray* pa,int data,int n1,
int n2){・・・}」
/************************************************************************/
/***** クリア関数 :画像の周囲を指定回数分クリア:縦横共設定 *****/
/***** ※注:水平/垂直のクリア回数が0以下ならその線をクリアしない*****/
/************************************************************************/
int CopyClear::ClearRoundImageBase(
TypeArray *pa, // 配列
int data, // データ:整数
int n1, // 水平線クリア回数
int n2 // 垂直線クリア回数
){
int adr; // 画像の左上Adr
int h; // 水平幅
int v; // 垂直幅
int inc; // 増加幅
if( pa == 0 ){ // Ptrが空なら
return( STI_ARY_0 - 10 ); // 左記を返す
} //
adr = pa->adr; // Adrと
h = pa->h; // 水平幅と
v = pa->v; // 垂直幅と
inc = pa->inc; // 増加幅と
if( adr == 0 ){ // Adrが空なら
return( STI_ARY_1 - 10 ); // 左記を返す
}else if( h <= 0 ){ // 水平幅が不正なら
return( STI_ARY_2 - 10 ); // 左記を返す
}else if( v <= 0 ){ // 垂直幅が不正なら
return( STI_ARY_3 - 10 ); // 左記を返す
}else if( inc < 0 ){ // 増加幅が不正なら
return( STI_ARY_4 - 10 ); // 左記を返す
} //
if( n2 * 2 > h ){ // 回数が水平幅より
n2 = h / 2 + 1; // 大きいときの補正
} //
if( n1 * 2 > v ){ // 回数が垂直幅より
n1 = v / 2 + 1; // 大きいときの補正
} //
return( ClearRoundImageHV( // 左記で処理を行う
adr, h, v, inc, pa->w, data, n1, n2 ) ); //
}
☆備考☆この関数はファイル「CopyClear010.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「ClearRoundImageBase()」の【関数名】
「Clear」は、英単語「Clear」で日本語訳「きれいになる、
片付く、消える」と有り、ここでは、綺麗に消す=画像を
消す⇒同じ画素の値で消す=指定した仮引数「int data,」
の値を描き込む!
「Round」は、英単語「Round」、日本語としては「一回り・一巡」、周囲一回りを意味します!
「Image」は、勿論、画像を意味し!
「Base」は、基本を意味します!
オーバーロード(多重定義)は、仮引数「int data,」
とこの関数は、書き込む画素が整数型画像用です!
(B)関数「int ClearRoundImageBase()」の【返値】
検査した仮引数が正常で処理も正常終了ならば、
「END_STI」を辺値とし返し、エラーの場合は、仮引数を
検査した結果を解説『エラーコード等各種単純定義』に記載
した「3.ステータス情報」に説明のエラーコードを辺値
とし返し関数終了!
(C)関数「ClearRoundImageBase()」の【仮引数】
int CopyClear::ClearRoundImageBase(
TypeArray *pa, // 配列
int data, // データ:整数
int n1, // 水平線クリア回数
int n2 // 垂直線クリア回数
){
「TypeArray* pa,」は、対象画像情報
「int data,」は、クリア(書き込む)画素データ
「int n1,」は、外枠クリアする水平線(上下線)の数
「int n2」は、外枠クリアする垂直線(左右線)の数
(D)関数「ClearRoundImageBase()」の【アルゴリズム】
){
int adr; // 画像の左上Adr
int h; // 水平幅
int v; // 垂直幅
int inc; // 増加幅
if( pa == 0 ){ // Ptrが空なら
return( STI_ARY_0 - 10 ); // 左記を返す
} //
adr = pa->adr; // Adrと
h = pa->h; // 水平幅と
v = pa->v; // 垂直幅と
inc = pa->inc; // 増加幅と
if( adr == 0 ){ // Adrが空なら
return( STI_ARY_1 - 10 ); // 左記を返す
}else if( h <= 0 ){ // 水平幅が不正なら
return( STI_ARY_2 - 10 ); // 左記を返す
}else if( v <= 0 ){ // 垂直幅が不正なら
return( STI_ARY_3 - 10 ); // 左記を返す
}else if( inc < 0 ){ // 増加幅が不正なら
return( STI_ARY_4 - 10 ); // 左記を返す
} //
if( n2 * 2 > h ){ // 回数が水平幅より
n2 = h / 2 + 1; // 大きいときの補正
} //
if( n1 * 2 > v ){ // 回数が垂直幅より
n1 = v / 2 + 1; // 大きいときの補正
} //
return( ClearRoundImageHV( // 左記で処理を行う
adr, h, v, inc, pa->w, data, n1, n2 ) ); //
}
(D-1)ローカル変数
){
int adr; // 画像の左上Adr
int h; // 水平幅
int v; // 垂直幅
int inc; // 増加幅
「int adr;」は、画像始点(左上)のアドレス
「int h;」は、水平幅
「int v;」は、垂直幅
「int inc;」は、増加幅
(D―2)アルゴリズムコード
if( pa == 0 ){ // Ptrが空なら
return( STI_ARY_0 - 10 ); // 左記を返す
} //
adr = pa->adr; // Adrと
h = pa->h; // 水平幅と
v = pa->v; // 垂直幅と
inc = pa->inc; // 増加幅と
if( adr == 0 ){ // Adrが空なら
return( STI_ARY_1 - 10 ); // 左記を返す
}else if( h <= 0 ){ // 水平幅が不正なら
return( STI_ARY_2 - 10 ); // 左記を返す
}else if( v <= 0 ){ // 垂直幅が不正なら
return( STI_ARY_3 - 10 ); // 左記を返す
}else if( inc < 0 ){ // 増加幅が不正なら
return( STI_ARY_4 - 10 ); // 左記を返す
} //
if( n2 * 2 > h ){ // 回数が水平幅より
n2 = h / 2 + 1; // 大きいときの補正
} //
if( n1 * 2 > v ){ // 回数が垂直幅より
n1 = v / 2 + 1; // 大きいときの補正
} //
return( ClearRoundImageHV( // 左記で処理を行う
adr, h, v, inc, pa->w, data, n1, n2 ) ); //
}
「if(pa==0){return(STI_ARY_0-10);}」は、画像情報への
ポインタ自体が空ならエラーコード「STI_ARY_0」で「-10」
は、最初の「TypeArray*」型引数を示すを意味するエラー
コードを関数辺値とし返し関数終了!
「adr=pa->adr;h=pa->h;v=pa->v;inc=pa->inc;」は、
ローカル変数に値を移す事で扱い易く(高速化も)成る!
「if(adr==0){return(STI_ARY_1-10);}」は、画像の実行
アドレスが空を示すのでエラーコード「STI_ARY_1」を関数
辺値とし返し関数終了!
「else if(h<=0){return(STI_ARY_2-10);}」は、水平幅が
不正(0以下)ならエラーコード「STI_ARY_2」を関数辺値
とし返し関数終了!
「else if(v<=0){return(STI_ARY_3-10);}」は、垂直幅が
不正(0以下)ならエラーコード「STI_ARY_3」を関数辺値
とし返し関数終了!
「else if(inc<0){return(STI_ARY_4-10);}」は、増加幅が
不正(0未満)ならエラーコード「STI_ARY_4」を関数辺値
とし返し関数終了!
「if(n22>h){n2=h/2+1;}」は、クリアする左右線本数調整
「if(n12>v){n1=v/2+1;}」は、クリアする上下線本数調整
「return(ClearRoundImageHV(adr,h,v,inc,pa->w,data,
n1,n2));」は、サブルーチン関数「ClearRoundImageHV()」
で処理し、この関数辺値を関数辺値とし返し関数終了!
(4-14-255)関数「int ClearRoundImageBase(
TypeArray* pa,double data,
int n1,int n2){・・・}」
/************************************************************************/
/***** 実数値クリア関数:画像の周囲を指定回数分クリア:縦横共設定 *****/
/***** ※注:水平/垂直のクリア回数が0以下ならその線をクリアしない*****/
/************************************************************************/
int CopyClear::ClearRoundImageBase(
TypeArray *pa, // 配列
double data, // データ:実数
int n1, // 水平線クリア回数
int n2 // 垂直線クリア回数
){
int adr; // 画像の左上Adr
int h; // 水平幅
int v; // 垂直幅
int inc; // 増加幅
if( pa == 0 ){ // Ptrが空なら
return( STI_ARY_0 - 10 ); // 左記を返す
} //
adr = pa->adr; // Adrと
h = pa->h; // 水平幅と
v = pa->v; // 垂直幅と
inc = pa->inc; // 増加幅と
if( adr == 0 ){ // Adrが空なら
return( STI_ARY_1 - 10 ); // 左記を返す
}else if( h <= 0 ){ // 水平幅が不正なら
return( STI_ARY_2 - 10 ); // 左記を返す
}else if( v <= 0 ){ // 垂直幅が不正なら
return( STI_ARY_3 - 10 ); // 左記を返す
}else if( inc < 0 ){ // 増加幅が不正なら
return( STI_ARY_4 - 10 ); // 左記を返す
} //
if( n2 * 2 > h ){ // 回数が水平幅より
n2 = h / 2 + 1; // 大きいときの補正
} //
if( n1 * 2 > v ){ // 回数が垂直幅より
n1 = v / 2 + 1; // 大きいときの補正
} //
return( ClearRoundImageHV( // 左記で処理を行う
adr, h, v, inc, pa->w, data, n1, n2 ) ); //
}
☆備考☆この関数はファイル「CopyClear010.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「ClearRoundImageBase()」の【関数名】
「Clear」は、英単語「Clear」で日本語訳「きれいになる、
片付く、消える」と有り、ここでは、綺麗に消す=画像を
消す⇒同じ画素の値で消す=指定した仮引数
「double data,」の値を描き込む!
「Round」は、英単語「Round」、日本語としては「一回り・一巡」、周囲一回りを意味します!
「Image」は、勿論、画像を意味し!
「Base」は、基本を意味します!
オーバーロード(多重定義)は、仮引数「double data,」
とこの関数は、書き込む画素が実数画像用です!
(B)関数「int ClearRoundImageBase()」の【返値】
検査した仮引数が正常で処理も正常終了ならば、
「END_STI」を辺値とし返し、エラーの場合は、仮引数を
検査した結果を解説『エラーコード等各種単純定義』に記載
した「3.ステータス情報」に説明のエラーコードを辺値
とし返し関数終了!
(C)関数「ClearRoundImageBase()」の【仮引数】
int CopyClear::ClearRoundImageBase(
TypeArray *pa, // 配列
double data, // データ:実数
int n1, // 水平線クリア回数
int n2 // 垂直線クリア回数
){
「TypeArray* pa,」は、対象画像情報
「double data,」は、クリア(書き込む)画素データ
「int n1,」は、外枠クリアする水平線(上下線)の数
「int n2」は、外枠クリアする垂直線(左右線)の数
(D)関数「ClearRoundImageBase()」の【アルゴリズム】
){
int adr; // 画像の左上Adr
int h; // 水平幅
int v; // 垂直幅
int inc; // 増加幅
if( pa == 0 ){ // Ptrが空なら
return( STI_ARY_0 - 10 ); // 左記を返す
} //
adr = pa->adr; // Adrと
h = pa->h; // 水平幅と
v = pa->v; // 垂直幅と
inc = pa->inc; // 増加幅と
if( adr == 0 ){ // Adrが空なら
return( STI_ARY_1 - 10 ); // 左記を返す
}else if( h <= 0 ){ // 水平幅が不正なら
return( STI_ARY_2 - 10 ); // 左記を返す
}else if( v <= 0 ){ // 垂直幅が不正なら
return( STI_ARY_3 - 10 ); // 左記を返す
}else if( inc < 0 ){ // 増加幅が不正なら
return( STI_ARY_4 - 10 ); // 左記を返す
} //
if( n2 * 2 > h ){ // 回数が水平幅より
n2 = h / 2 + 1; // 大きいときの補正
} //
if( n1 * 2 > v ){ // 回数が垂直幅より
n1 = v / 2 + 1; // 大きいときの補正
} //
return( ClearRoundImageHV( // 左記で処理を行う
adr, h, v, inc, pa->w, data, n1, n2 ) ); //
}
(D-1)ローカル変数
){
int adr; // 画像の左上Adr
int h; // 水平幅
int v; // 垂直幅
int inc; // 増加幅
「int adr;」は、画像始点(左上)のアドレス
「int h;」は、水平幅
「int v;」は、垂直幅
「int inc;」は、増加幅
(D―2)アルゴリズムコード
if( pa == 0 ){ // Ptrが空なら
return( STI_ARY_0 - 10 ); // 左記を返す
} //
adr = pa->adr; // Adrと
h = pa->h; // 水平幅と
v = pa->v; // 垂直幅と
inc = pa->inc; // 増加幅と
if( adr == 0 ){ // Adrが空なら
return( STI_ARY_1 - 10 ); // 左記を返す
}else if( h <= 0 ){ // 水平幅が不正なら
return( STI_ARY_2 - 10 ); // 左記を返す
}else if( v <= 0 ){ // 垂直幅が不正なら
return( STI_ARY_3 - 10 ); // 左記を返す
}else if( inc < 0 ){ // 増加幅が不正なら
return( STI_ARY_4 - 10 ); // 左記を返す
} //
if( n2 * 2 > h ){ // 回数が水平幅より
n2 = h / 2 + 1; // 大きいときの補正
} //
if( n1 * 2 > v ){ // 回数が垂直幅より
n1 = v / 2 + 1; // 大きいときの補正
} //
return( ClearRoundImageHV( // 左記で処理を行う
adr, h, v, inc, pa->w, data, n1, n2 ) ); //
}
「if(pa==0){return(STI_ARY_0-10);}」は、画像情報への
ポインタ自体が空ならエラーコード「STI_ARY_0」で「-10」
は、最初の「TypeArray*」型引数を示すを意味するエラー
コードを関数辺値とし返し関数終了!
「adr=pa->adr;h=pa->h;v=pa->v;inc=pa->inc;」は、
ローカル変数に値を移す事で扱い易く(高速化も)成る!
「if(adr==0){return(STI_ARY_1-10);}」は、画像の実行
アドレスが空を示すのでエラーコード「STI_ARY_1」を関数
辺値とし返し関数終了!
「else if(h<=0){return(STI_ARY_2-10);}」は、水平幅が
不正(0以下)ならエラーコード「STI_ARY_2」を関数辺値
とし返し関数終了!
「else if(v<=0){return(STI_ARY_3-10);}」は、垂直幅が
不正(0以下)ならエラーコード「STI_ARY_3」を関数辺値
とし返し関数終了!
「else if(inc<0){return(STI_ARY_4-10);}」は、増加幅が
不正(0未満)ならエラーコード「STI_ARY_4」を関数辺値
とし返し関数終了!
「if(n22>h){n2=h/2+1;}」は、クリアする左右線本数調整
「if(n12>v){n1=v/2+1;}」は、クリアする上下線本数調整
「return(ClearRoundImageHV(adr,h,v,inc,pa->w,data,
n1,n2));」は、サブルーチン関数「ClearRoundImageHV()」
で処理し、この関数辺値を関数辺値とし返し関数終了!
(4-14-256)関数「int ClearRoundImage(
TypeArray* pa,int data,int n){・・・}」
/************************************************************************/
/***** クリア関数 :画像の周囲を指定回周回分クリア *****/
/************************************************************************/
int CopyClear::ClearRoundImage(
TypeArray *pa, // 配列
int data, // データ:整数
int n // クリア周回数
){
return( ClearRoundImageBase( pa, data, n, n ) ); // 縦横の回数を同じ
} // で周囲クリア処理
☆備考☆この関数はファイル「CopyClear010.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「ClearRoundImage()」の【関数名】
「Clear」は、英単語「Clear」で日本語訳「きれいになる、
片付く、消える」と有り、ここでは、綺麗に消す=画像を
消す⇒同じ画素の値で消す=指定した仮引数「int data,」
の値を描き込む!
「Round」は、英単語「Round」、日本語としては「一回り・一巡」、周囲一回りを意味します!
「Image」は、勿論、画像を意味し!
オーバーロード(多重定義)は、仮引数「int data,」
とこの関数は、書き込む画素が整数型画像用です!
(B)関数「int ClearRoundImage()」の【返値】
検査した仮引数が正常で処理も正常終了ならば、
「END_STI」を辺値とし返し、エラーの場合は、仮引数を
検査した結果を解説『エラーコード等各種単純定義』に記載
した「3.ステータス情報」に説明のエラーコードを辺値
とし返し関数終了!
(C)関数「ClearRoundImage()」の【仮引数】
int CopyClear::ClearRoundImage(
TypeArray *pa, // 配列
int data, // データ:整数
int n // クリア周回数
){
「TypeArray* pa,」は、対象画像情報
「int data,」は、クリア(書き込む)画素データ
「int n,」は、外枠クリアする周回線(上下左右線)の数
(D)関数「ClearRoundImage()」の【アルゴリズム】
){
return( ClearRoundImageBase( pa, data, n, n ) ); // 縦横の回数を同じ
} // で周囲クリア処理
「return(ClearRoundImageBase(pa,data,n,n));」は、
サブルーチン関数「ClearRoundImageBase()」で処理し
その関数辺値とし返し関数終了!
(4-14-257)関数「int ClearRoundImage(
TypeArray* pa,double data,int n){・・・}」
/************************************************************************/
/***** 実数値クリア関数:画像の周囲を一周分クリア *****/
/************************************************************************/
int CopyClear::ClearRoundImage(
TypeArray *pa, // 配列
double data, // データ:実数値
int n // クリア周回数
){
return( ClearRoundImageBase( pa, data, n, n ) ); // 縦横の回数を同じ
} // で周囲クリア処理
☆備考☆この関数はファイル「CopyClear010.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「ClearRoundImage()」の【関数名】
「Clear」は、英単語「Clear」で日本語訳「きれいになる、
片付く、消える」と有り、ここでは、綺麗に消す=画像を
消す⇒同じ画素の値で消す=指定した仮引数「double data,」
の値を描き込む!
「Round」は、英単語「Round」、日本語としては「一回り・一巡」、周囲一回りを意味します!
「Image」は、勿論、画像を意味し!
オーバーロード(多重定義)は、仮引数「double data,」
とこの関数は、書き込む画素が実数型画像用です!
(B)関数「int ClearRoundImage()」の【返値】
検査した仮引数が正常で処理も正常終了ならば、
「END_STI」を辺値とし返し、エラーの場合は、仮引数を
検査した結果を解説『エラーコード等各種単純定義』に記載
した「3.ステータス情報」に説明のエラーコードを辺値
とし返し関数終了!
(C)関数「ClearRoundImage()」の【仮引数】
int CopyClear::ClearRoundImage(
TypeArray *pa, // 配列
double data, // データ:実数値
int n // クリア周回数
){
「TypeArray* pa,」は、対象画像情報
「double data,」は、クリア(書き込む)画素データ
「int n,」は、外枠クリアする周回線(上下左右線)の数
(D)関数「ClearRoundImage()」の【アルゴリズム】
){
return( ClearRoundImageBase( pa, data, n, n ) ); // 縦横の回数を同じ
} // で周囲クリア処理
「return(ClearRoundImageBase(pa,data,n,n));」は、
サブルーチン関数「ClearRoundImageBase()」で処理し
その関数辺値とし返し関数終了!
(4-14-258)関数「int CopyRoundImage(
TypeArray* ps,TypeArray* pd,
int n){・・・}」
/************************************************************************/
/***** 転送関数 :画像の周囲を指定回周回分コピー *****/
/************************************************************************/
int CopyClear::CopyRoundImage(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
int n // コピー周回数
){
return( CopyRoundImageBase( ps, pd, n, n ) ); // 縦横の回数を同じ
} // で周囲コピー処理
☆備考☆この関数はファイル「CopyClear020.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
(A)関数「CopyRoundImage()」の【関数名】
「Copy」は、カタカナ語「コピー」意味通りコピーするです
「Round」は、英単語「Round」、日本語としては「一回り・一巡」、周囲一回りを意味します!
「Image」は、勿論、画像を意味し!「CopyRoundImage」で
画像の外周部のみコピー動作を行う関数です!
(B)関数「int CopyRoundImage()」の【返値】
検査した仮引数が正常で処理も正常終了ならば、
「END_STI」を辺値とし返し、エラーの場合は、仮引数を
検査した結果を解説『エラーコード等各種単純定義』に記載
した「3.ステータス情報」に説明のエラーコードを辺値
とし返し関数終了!
(C)関数「CopyRoundImage()」の【仮引数】
int CopyClear::CopyRoundImage(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
int n // コピー周回数
){
「TypeArray* ps,」は、S(元)画像
「TypeArray* pd,」は、D(結果)画像
「int n」は、コピー周回数
(D)関数「CopyRoundImage()」の【アルゴリズム】
){
return( CopyRoundImageBase( ps, pd, n, n ) ); // 縦横の回数を同じ
} // で周囲コピー処理
「return(CopyRoundImageBase(ps,pd,n,n));」は、
サブルーチン関数「CopyRoundImageBase()」で処理し
その関数辺値とし返し関数終了!
(4-14-259)関数「int CopyRoundImageBase(
TypeArray* ps,TypeArray* pd,
int n1,int n2){・・・}」
/************************************************************************/
/***** 転送関数 :画像の周囲を指定回周回分コピー:基本 *****/
/***** 縦/横の周囲の本数も指定できる *****/
/************************************************************************/
int CopyClear::CopyRoundImageBase(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
int n1, // 水平線コピー回数
int n2 // 垂直線コピー回数
){
int x; // x方向カウンタ
int y; // y方向カウンタ
int h; // 水平幅
int v; // 垂直幅
h = ( ps->h < pd->h ) ? ps->h : pd->h; // 最小水平幅取り出し
v = ( ps->v < pd->v ) ? ps->v : pd->v; // 最小垂直幅取り出し
if( n1 * 2 <= v ){ // コピー有効なら
for( y = 0; y < n1; y++ ){ // 水平コピー回数
copy_h( ps, pd, y ); // 上辺をコピー
copy_h( ps, pd, v - y - 1 ); // 下辺をコピー
} //
} //
if( n2 * 2 <= h ){ // コピー有効なら
for( x = 0; x < n2; x++ ){ // 水平コピー回数
copy_v( ps, pd, x ); // 左辺をコピー
copy_v( ps, pd, h - x - 1 ); // 右辺をコピー
} //
} //
return( END_STI ); // 正常終了
}
☆備考☆この関数はファイル「CopyClear020.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
(A)関数「CopyRoundImageBase()」の【関数名】
「Copy」は、カタカナ語「コピー」意味通りコピーするです
「Round」は、英単語「Round」、日本語としては「一回り・一巡」、周囲一回りを意味します!
「Image」は、勿論、画像を意味し!「CopyRoundImage」で画像の外周部のみコピー動作を行う関数です!
「Base」は、基本を意味します!
(B)関数「int CopyRoundImageBase()」の【返値】
検査した仮引数が正常で処理も正常終了ならば、
「END_STI」を辺値とし返し、エラーの場合は、仮引数を
検査した結果を解説『エラーコード等各種単純定義』に記載
した「3.ステータス情報」に説明のエラーコードを辺値
とし返し関数終了!
(C)関数「CopyRoundImageBase()」の【仮引数】
int CopyClear::CopyRoundImageBase(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
int n1, // 水平線コピー回数
int n2 // 垂直線コピー回数
){
「TypeArray* ps,」は、S(元)画像
「TypeArray* pd,」は、D(結果)画像
「int n1,」は、外枠コピーする水平線(上下線)の数
「int n2」は、外枠コピーする垂直線(左右線)の数
コピー周回数
(D)関数「CopyRoundImageBase()」の【アルゴリズム】
){
int x; // x方向カウンタ
int y; // y方向カウンタ
int h; // 水平幅
int v; // 垂直幅
h = ( ps->h < pd->h ) ? ps->h : pd->h; // 最小水平幅取り出し
v = ( ps->v < pd->v ) ? ps->v : pd->v; // 最小垂直幅取り出し
if( n1 * 2 <= v ){ // コピー有効なら
for( y = 0; y < n1; y++ ){ // 水平コピー回数
copy_h( ps, pd, y ); // 上辺をコピー
copy_h( ps, pd, v - y - 1 ); // 下辺をコピー
} //
} //
if( n2 * 2 <= h ){ // コピー有効なら
for( x = 0; x < n2; x++ ){ // 水平コピー回数
copy_v( ps, pd, x ); // 左辺をコピー
copy_v( ps, pd, h - x - 1 ); // 右辺をコピー
} //
} //
return( END_STI ); // 正常終了
}
(D-1)ローカル変数
){
int x; // x方向カウンタ
int y; // y方向カウンタ
int h; // 水平幅
int v; // 垂直幅
「int x;」は、X座標(水平)方向ループカウンタ
「int y;」は、Y座標(水平)方向ループカウンタ
「int h;」は、水平幅
「int v;」は、垂直幅
(D―2)アルゴリズムコード
h = ( ps->h < pd->h ) ? ps->h : pd->h; // 最小水平幅取り出し
v = ( ps->v < pd->v ) ? ps->v : pd->v; // 最小垂直幅取り出し
if( n1 * 2 <= v ){ // コピー有効なら
for( y = 0; y < n1; y++ ){ // 水平コピー回数
copy_h( ps, pd, y ); // 上辺をコピー
copy_h( ps, pd, v - y - 1 ); // 下辺をコピー
} //
} //
if( n2 * 2 <= h ){ // コピー有効なら
for( x = 0; x < n2; x++ ){ // 水平コピー回数
copy_v( ps, pd, x ); // 左辺をコピー
copy_v( ps, pd, h - x - 1 ); // 右辺をコピー
} //
} //
return( END_STI ); // 正常終了
}
「h=(ps->h<pd->h)?ps->h:pd->h;
v=(ps->v<pd->v)?ps->v:pd->v;」は、SD両者の有効な
水平垂直幅を算出★備考★有効とは小さい方に合わせる!
「if(n12<=v){for(y=0;y<n1;y++){copy_h(ps,pd,y);
copy_h(ps,pd,v-y-1);}}」は、仮引数「int n1,」で指定
した本数コピーが条件「n12<=v」で可能ならば分岐本体
「for(y=0;y<n1;y++){copy_h(ps,pd,y);
copy_h(ps,pd,v-y-1);}」と教科書的なfor構文での
「y=0;y<n1;y++」と「n1」回数分
「copy_h(ps,pd,y);」で水平方向に上辺コピーし、
「copy_h(ps,pd,v-y-1);」で水平方向に下辺コピー動作し
★備考★教科書的と記載したのは、そこまで高速性を優先よ
り分かり易い記載を優先した事を示します!そして教科書的
にしたのは、アップカウンタに成って居る事も要因です!
「if(n22<=h){for(x=0;x<n2;x++){copy_v(ps,pd,x);
copy_v(ps,pd,h-x-1);}}」は、仮引数「int n2」で指定し
た本数コピーが条件「n12<=v」で可能ならば分岐本体
「for(x=0;x<n2;x++){copy_v(ps,pd,x);
copy_v(ps,pd,h-x-1);}」と教科書的なfor構文での
「x=0;x<n2;x++」と「n2」回数分
「copy_v(ps,pd,x);」で垂直方向に左辺コピーし、
「copy_v(ps,pd,h-x-1);」で垂直方向に右辺コピー動作し
ます!
ココまでで区切り≪「public:属性」の関数の並びが、
ファイル「CopyClear.h」の定義から、一旦、途切れるの
で≫が良いので次から、「CopyClear.h」の定義の続きとし
ての「private:属性」の関数の説明を行う事にします!
引き続き新規解説『解説クラスCopyClear(30)
』を御贔屓下さい!