2017-05-12 13 views
0

일반적으로 : 탐색 오프셋을 어떻게 구현하고보다 효율적으로 사용할 수 있습니까?어떻게 (비트 맵)을 통한 트래버스가 더 우아하게 구현 될 수 있습니까?

아래에 정의 된 비트 맵이 있다고 가정 해 봅시다. 고정 픽셀에서 시작하여 주변의 모든 픽셀을 통과 (이 경우 수집) 할 수 있고 궁극적으로이 8 개의 if 문을 피할 수 있습니까?

// The bitmap 1920x1080px 
RGBColor[][] imageMatrix = new RGBColor[1920][1080]; 

// Collect all nearby pixels that are not white 
ArrayList<RGBColor> neighboringPixels = new ArrayList<RGBColor>(); 

// Width-index of center pixel 
int w = 50; 
// Height-index of center pixel 
int h = 50; 

// Initializing offsets for a more elegant check-up... 
int[][] offsets = { { -1, -1 }, { 0, -1 }, { 1, -1 }, 
     { 1, 0 }, { 1, 1 }, { 0, 1 }, { -1, 1 }, 
     { -1, 0 } }; 

// But this is what I came up with 
// Get top-left pixel 
if (!(w - 1 < 0 || w - 1 > 255 || h - 1 < 0 || h - 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w - 1][h - 1]); 
} 
// Get top pixel 
if (!(w < 0 || w > 255 || h - 1 < 0 || h - 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w][h - 1]); 
} 
// Get top-right pixel 
if (!(w + 1 < 0 || w + 1 > 255 || h - 1 < 0 || h - 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w + 1][h - 1]); 
} 
// Get right pixel 
if (!(w + 1 < 0 || w + 1 > 255 || h < 0 || h > 255)) { 
    neighboringPixels.add(imageMatrix[w + 1][h]); 
} 
// Get bottom-right pixel 
if (!(w + 1 < 0 || w + 1 > 255 || h + 1 < 0 || h + 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w + 1][h + 1]); 
} 
// Get bottom pixel 
if (!(w < 0 || w > 255 || h + 1 < 0 || h + 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w][h + 1]); 
} 
// Get bottom-left pixel 
if (!(w - 1 < 0 || w - 1 > 255 || h + 1 < 0 || h + 1 > 255)) { 
    neighboringPixels.add(imageMatrix[w - 1][h + 1]); 
} 
// Get left pixel 
if (!(w - 1 < 0 || w - 1 > 255 || h < 0 || h > 255)) { 
    neighboringPixels.add(imageMatrix[w - 1][h]); 
} 
+0

에 대해서만 "효율적으로"정의 할 수 있습니까? 속도 나 코드 라인을 의미합니까? –

+0

@Lashane 나는 주로 코드 라인을 의미한다. 이러한 8 가지 if 문 또는 심지어 26 if 문이 3 차원 공간에서 작동해야하는 것을 피할 수있는 방법이 있어야합니다. – JAR

답변

-1

당신은 3 × 광장에 반복됩니다

for (int i=w-1; i<w+2; ++i) { 
    if (i<0 || i>=255) continue; 
    for (int j=h-1; j<h+3; ++j) { 
     if (j<0 || j>=255) continue; 
     if (i==w && j==h) continue; 
     neighboringPixels.add(imageMatrix[i][j]); 
    } 

은 당신이 할 수있는 컴파일러가 최적화를 할 수 있도록 한 간단하게 코드를 작성합니다. 간단히

+1

거의 정확한 코드입니다.'if (i == 0 && j == 0) 계속;'0 대신 w/h를 사용합니다. –

+0

@Lashane 맞습니다. – JAR

-1

는 :

for (int i = -1 ; i <= 1 ; i++) { 
    int wi = w + i; 
    if (wi >= 0 && wi <= 255) { 
     for (int j = -1 ; j <= 1 ; j++) { 
      int hj = h + j; 
      if (!(i == 0 && j == 0) && hj >= 0 && hj <= 255) { 
       neighboringPixels.add(imageMatrix[wj][hj]); 
      } 
     } 
    } 
} 
0

당신은 현재의 코드는 최악의 경우 32 조건이 포함되어 있습니다.

final int minH = Math.max(0, h - 1); 
final int maxH = Math.min(255, h + 1); 
final int minW = Math.max(0, w - 1); 
final int maxW = Math.min(255, w + 1); 

for (int i = minH; i <= maxH; i++) 
    for (int j = minW; j <= maxW; j++) 
     if ((i != h) || (j != w)) 
      neighboringPixels.add(imageMatrix[i][j]); 

에는 최악의 경우 4 + 4 * 4 * 2 = 36 개의 조건이있을 것이다 : 코드 라인 환산

최소 다소 용액 I는 방법이 같다 온다. 실행 시간의 관점에서

최소 용액과 같을 수있다 :

final int prevH = h - 1; 
final int minW = Math.max(0, w - 1); 
final int nextH = h + 1; 
final int maxW = Math.min(255, w + 1); 

if ((prevH >= 0) && (prevH <= 255)) 
    for (int i = minW; i <= maxW; i++) 
     neighboringPixels.add(imageMatrix[prevH][i]); 
if ((h >= 0) && (h <= 255)) { 
    if ((minW != w) && (minW <= 255)) 
     neighboringPixels.add(imageMatrix[h][minW]); 
    if ((maxW != w) && (maxW >= 0)) 
     neighboringPixels.add(imageMatrix[h][maxW]); 
} 
if ((nextH >= 0) && (nextH <= 255)) 
    for (int i = minW; i <= maxW; i++) 
     neighboringPixels.add(imageMatrix[nextH][i]); 

최악의 경우 2 + 2 + 4 + 6 + 2 + 4 = 20 개의 조건

으로서 상기 최적화 :

조건 if ((a>=0) && (a<=255))if ((a&~0xff) != 0)으로 최적화 될 수 있지만 [0-255] 범위