2006年声優言及数(10)言及数カウント

ようやく言及数カウントまで来た。ここのポイントは、グラフの赤い線は実際の数字より1ピクセル上に上がってるということに注意。つまり、カウント0は下の軸より1ピクセル上にあって、カウントmaxも上の軸より1ピクセル上にある。なんでそういうグラフの書き方なのか分からないけど、使ってるモジュールがそういう仕様なんでしょう、きっと。

じゃー単純に1引けばいいだけかっていうと、キーワードが定義されていないときはそもそも赤い線が出てこないので、その場合も考慮しないといけない。具体的には赤い線が見つからなかったとき(j == eh)、値を0にします。

void get_count(graph_area *g)
{
     int i, j;
     const int sh = g->top-1;
     const int sw = g->left+OFFSET_FIRSTLINE;
     const int eh = g->bottom;
     const int ew = g->right - OFFSET_LASTLINE + 1;
     const double maxpx = g->bottom - g->top;
     g->count = (double *)malloc((ew-sw)*sizeof(double));

     printf("start point:(h=%d, w=%d)\n", sh, sw);
     printf("end point  :(h=%d, w=%d)\n", eh, ew);
     for(i=sw; i<ew; i++){
          for(j=sh; j<eh; j++){
               if(g->image[j][i] == COLOR_VALUE){
                    break;
               }
          }
          if(j == eh) j--;
          g->count[i-sw] = (double)(eh - j - 1) * (g->count_max/maxpx);
     }
     printf("count:");
     for(i=0; i<(ew-sw); i++){
          printf("%.2f ", g->count[i]);
     }
     printf("\n");
}

実行結果

$ ./png nana.png
input file: [nana.png]
png signature: 89 50 4e 47 0d 0a 1a 0a
graph border: t=17 b=161 l=32 r=389
max_value area: sh=13 sw=0 eh=20 ew=32
            33  3333  33
           3  3 3    3  3
              3 333  3 33
             3     3 33 3
            3      3 3  3
           3    3  3 3  3
           3333  33   33
max_value bit_pattern:
00000000000011001111001100000000
00000000000100101000010010000000
00000000000000101110010110000000
00000000000001000001011010000000
00000000000010000001010010000000
00000000000100001001010010000000
00000000000111100110001100000000
max_value hex_pattern: {0x000cf300, 0x00128480, 0x0002e580, 0x00041680, 0x00081480, 0x00109480, 0x001e6300, },
count_max: 250.0
start point:(h=16, w=38)
end point  :(h=161, w=389)
count:13.89 26.04 39.93 38.19 29.51 29.51 29.51 31.25 46.88 38.19 31.25 29.51 22.57 22.57 27.78 34.72 26.04 22.57 32.99 38.19 34.72 36.46 29.51 43.40 71.18 81.60 72.92 112.85 149.31 121.53 78.12 55.56 48.61 48.61 38.19 31.25 34.72 31.25 24.31 26.04 22.57 27.78 27.78 26.04 31.25 27.78 29.51 31.25 27.78 24.31 22.57 17.36 19.10 17.36 17.36 26.04 22.57 15.62 19.10 20.83 15.62 15.62 15.62 13.89 13.89 12.15 15.62 17.36 17.36 19.10 26.04 34.72 20.83 10.42 12.15 15.62 17.36 17.36 15.62 13.89 12.15 17.36 17.36 20.83 15.62 13.89 19.10 22.57 24.31 22.57 22.57 20.83 19.10 22.57 27.78 20.83 22.57 24.31 20.83 20.83 32.99 41.67 34.72 24.31 22.57 24.31 19.10 20.83 22.57 19.10 24.31 20.83 19.10 22.57 20.83 24.31 26.04 29.51 24.31 22.57 22.57 20.83 22.57 19.10 22.57 32.99 53.82 55.56 46.88 38.19 50.35 46.88 39.93 32.99 34.72 29.51 24.31 20.83 19.10 19.10 22.57 20.83 15.62 12.15 13.89 19.10 22.57 22.57 20.83 20.83 15.62 15.62 12.15 26.04 36.46 31.25 19.10 22.57 26.04 29.51 22.57 20.83 26.04 29.51 24.31 22.57 17.36 17.36 19.10 22.57 24.31 17.36 20.83 36.46 45.14 41.67 45.14 32.99 19.10 22.57 24.31 27.78 43.40 48.61 32.99 24.31 50.35 78.12 65.97 39.93 55.56 76.39 69.44 52.08 36.46 24.31 29.51 24.31 34.72 29.51 19.10 15.62 15.62 20.83 19.10 17.36 15.62 12.15 12.15 10.42 17.36 27.78 31.25 24.31 17.36 13.89 10.42 13.89 15.62 13.89 15.62 15.62 17.36 20.83 19.10 27.78 29.51 24.31 22.57 24.31 27.78 36.46 50.35 48.61 39.93 32.99 31.25 34.72 27.78 17.36 15.62 15.62 20.83 22.57 20.83 26.04 34.72 31.25 22.57 15.62 19.10 15.62 15.62 13.89 15.62 12.15 13.89 12.15 10.42 12.15 10.42 13.89 19.10 15.62 17.36 17.36 13.89 15.62 13.89 12.15 17.36 13.89 13.89 17.36 12.15 12.15 10.42 8.68 13.89 10.42 12.15 8.68 12.15 15.62 20.83 24.31 22.57 22.57 19.10 17.36 19.10 13.89 17.36 24.31 20.83 15.62 13.89 15.62 17.36 24.31 31.25 36.46 29.51 22.57 19.10 22.57 26.04 19.10 20.83 15.62 13.89 12.15 17.36 22.57 22.57 22.57 29.51 43.40 59.03 46.88 38.19 29.51 24.31 24.31 39.93 52.08 45.14 43.40 36.46 55.56 83.33 57.29 24.31 17.36 20.83 17.36 13.89 15.62 19.10 15.62 17.36 19.10 15.62 13.89 15.62 13.89 19.10 17.36 17.36 24.31 17.36

ほんとに合ってるのかどうかこれではよく分かりませんが、多分合ってる・・・と思う。カウントはできたので、あとは集計するだけですね。この先はCでやるよりPerlとかでフィルターかけるほうが楽。理由は後ほどご説明。