見出し画像

解説クラス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)
を御贔屓下さい!

文末

いいなと思ったら応援しよう!