このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。
多くの画像編集プログラムでは、二つの画像を縫い合わせて大きな画像を作るということができる。この問題では、二つの画像を表す文字列が与えられる。文字列はビットマップ(非圧縮画像ですね)を表しており、文字列のi番目の要素の値jというのは、画像においてはi行j列の色を表している。二つのイメージを縫い合わせることを行え。この問題では画像A[]を画像B[]の左に置き、Aの右側とBの左側を重ねる。明らかな人工物であることを防ぐために、縫い合わせた領域はAからBに向けて徐々に色が混ざるようにしたい。重なっている領域の左からi番目(i=1から始まるとする)の値は次式のようになる。
((overlap+1-i)*a+(i*b))/(overlap+1)
ここで、aとbはそれぞれAとBの画素値である。overlapは重ねた画素数である。したがって、重なっている領域の一番左の画素値は次のようになる。
(overlap*a+b)/(overlap+1).
なお、どの場合でも値は最も近い整数値に変換せよ(四捨五入せよ)。画素値は文字のASCIIコードの値で与えられる。
私の解答はこちら。
public class Stitch { public String[] stitch(String[] A, String[] B, int overlap) { String[] blended = new String[A.length]; for( int i=0 ; i<A.length ; i++ ){ blended[i] = A[i].substring(0, A[i].length()-overlap); for( int j=1 ; j<=overlap ; j++ ){ double val = ((overlap+1.0-j)*A[i].charAt(A[i].length()-overlap+j-1)+j*B[i].charAt(j-1)) /(overlap+1); char cval = (char)Math.round(val); blended[i] += cval; } blended[i] += B[i].substring(overlap); } return blended; } }
0 件のコメント:
コメントを投稿