2013-06-04 3 views
1

Я пишу скретч-карту, как приложение, и для этого я использую SurfaceView. Я заполняю его каким-то цветом, и я рисую на нем Path на PorterDuff.Mode.CLEAR PorterDuffXfermode. Я должен определить, когда пользователь полностью поцарапал его (холст SurfaceView полностью прозрачен). Может ли кто-нибудь дать мне совет, как его определить?Определите, когда поверхность полностью прозрачна

Я попытался с сохранением координат путей, но из-за ширины штриха чертежа я не могу рассчитать площадь покрытия хорошо.

Я попытался получить растровое изображение из метода getDrawingCache SurfaceView и перебрать его пиксели и использовать метод getPixel. Это не работает, и я думаю, что это не было бы эффективным способом изучения холста.

ответ

0

Предполагая, что холст не будет большим или масштабируемым до произвольного размера, я думаю, что петля над пикселями будет эффективной.

Учитывая холст большого или произвольного размера, я бы создал представление массива холста и отметит пиксели по мере того, как вы пойдете, подсчитывая, сколько раз пользователь ударил хотя бы один раз. Затем проверьте это число на пороговое значение, которое определяет, какая часть билета должна быть поцарапана, чтобы он считался «поцарапанным». Входящий псевдокод

const int count = size_x * size_y; // pixel count 
const int threshhold = 0.8 * count // user must hit 80% of the pixels to uncover 
const int finger_radius = 2; // the radias of our finger in pixels 
int scratched_pixels = 0; 
bit [size_x][size_y] pixels_hit; // array of pixels all initialized to 0 

void OnMouseDown(int pos_x, int pos_y) 
{ 
    // calculates the mouse position in the canvas 
    int canvas_pos_x, canvas_pos_y = MousePosToCanvasPos(pos_x, pos_y); 
    for(int x = canvas_pos_x - finger_rad; x < canvas_pos_x + brush_rad; ++x) 
    { 
     for(int y = canvas_pos_y - finger_rad; y < canvas_pos_y + brush_rad; ++y) 
     { 
      int dist_x = x - canvas_pos_x; 
      int dist_y = y - canvas_pos_y; 
      if((dist_x * dist_x + dist_y * dist_y) <= brush_rad * brush_rad 
       && pixels_hit[x][y] == 0) 
      { 
       ++scratched_pixels; 
       pixels_hit[x][y] = 1; 
      } 
     } 
    } 
} 

bool IsScratched() 
{ 
    if(scratched_pixels > threshhold) 
     return true; 
    else 
     return false; 
} 
+0

Благодарим вас за комментарий. Я могу отслеживать положение пальца, но он не дает правильного результата в конце, потому что я рисую дорожки на холсте с некоторой шириной хода. – viplezer

+0

В этом случае изобразите палец как круг и найдите все пиксели, которые пересекают круг. Затем проверьте их все, а не одно шоу. При необходимости я могу предоставить некоторый псевдокод. – DubiousPusher

+0

Я сделал это, решение было похоже на то, что вы сказали в последнем комментарии. Если вы напишете его как ответ, я его приму. – viplezer

Смежные вопросы