問題発生

Poisson Mattingについて、二つの問題が発生。
一つ目。オーダーに関する問題。
ある点(x,y)から、ある領域への最短距離を求めたい(正確には、その領域内の一番近い点を求めたい)。領域は、円や長方形のような形はしていなくて、メソッドisHoge()を呼ぶことで、O(1)で求められる。
このような場合に、例えば

int min = width * width + height * height;
for(int i = 0; i < width; i++){
   for(int j = 0; j < height; j++){
      if(isHoge(i,j)){
         int d = (i - x)^2 + (j - y)^2;
         if(d < min)
            min = d;
      }
   }
}
return min;

という方法を取ることを考えてみると、これは確かに答えを返してくれる。ただし、O(width * height)かかる。で、この最短距離を求める回数が数回とか数十回くらいなら大抵問題ないのだけれども、大体10000回程度呼ばれる。さらに、width * heightは、30万程度というでかい数となっている。このために、大体この作業の完了には数分かかる。何とか縮める方法を探したい。
二つ目。Poisson方程式を解くための行列を作って、GS法を適用。すると、発散していることが判明。困った。多分だけれども、行列が間違っていると思う。