假設畫布不會很大或可縮放到任意大小,我認爲循環遍歷像素會很有效。
給定一個大尺寸或任意尺寸的畫布,我會創建一個畫布的數組表示形式,並隨時標記像素,以保持計數用戶至少有多少次擊中。然後根據閾值測試該數字,該閾值確定必須刮擦多少票據才能被視爲「刮掉」。傳入的僞代碼
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;
}
謝謝您的意見。我可以跟蹤手指的位置,但最終沒有給出正確的結果,因爲我在畫布上繪製了一些筆畫寬度的路徑。 – viplezer
在這種情況下,將手指表示爲圓形並查找所有圓形相交的像素。然後測試它們,而不是單個展示。如果需要,我可以提供一些僞代碼。 – DubiousPusher
我已經完成了,解決方案與您在上一條評論中所說的相似。如果你把它寫成答案,我會接受它。 – viplezer