這篇文章,我們來實現五指的追蹤。
其實,能夠實現一指的追蹤,那麼五指的追蹤自然不成問題。但是,還是有幾個問題我們需要考慮一下。
1、並不是每一幀都會包含五指的全部資訊。
比如,當前幀包含了五指資訊,那麼,視窗上就會顯示五個紅色圓。如果此時使用者握拳,那麼,下一幀就可能只會有一指的資訊。此時,就應從視窗中移除多餘的四個紅色圓。
2、手指如何和紅色圓對應。
因為hand.fingers集合對應的不一定是拇指、食指、中指、無名指、小指(可能對應的是小指、無名指、中指),所以,得想個辦法把某個指尖和某個紅色圓對應起來。幸好,leap為每個物件都定義了id。這樣,我們就可以將指尖的id和紅色圓繫結在一起。自然地,我們會想到用dictionary。
3、如何刪除上一幀有的而這一幀中沒有的紅色圓。
這個問題相對簡單,做乙個list,把這一幀中id一次加進去,然後,再從dictionary的keys裡面刪除那些不在list中的id所對應的紅色圓。
step1:構造下面的使用者介面。
step2:宣告myleaplistener類和視窗closing事件。**和leapmotion(1)中的一樣。
step3:新增成員變數dictionary表示手指id和紅色圓的對應,新增成員變數list表示當前幀追蹤到的手指編號。**如下:
1step4:編寫「連線裝置」的單擊事件和「斷開裝置」的單擊事件。與之前不同的是,在「連線裝置」的單擊事件中,需要初始化ellipses成員變數,在「斷開裝置」的單擊事件中,需要清空ellipses成員變數。private dictionaryellipses;
2private list fingerids;
1step5:編寫onframeevent事件。還是先放上事件宣告。private
void connect_device_button_click(object
sender, routedeventargs e)214
15private
void disconnect_device_button_click(object
sender, routedeventargs e)
16
1和之前一樣,在事件中,我們首先要獲取追蹤到的手部的資訊。void listener_onframeevent(object
sender, eventargs e)
2
1 leapframe frame = controller.frame();//接下來,就需要找到追蹤到的每乙個指尖(是指尖,而不是筆之類的東西歐)。獲取當前幀
2if (!frame.hands.isempty)//
判斷是否追蹤到手部
3
1獲取指尖id放入list,然後判斷dictionary中是否有指定id對應的ellipse。**如下:foreach (finger finger in hand.fingers.where(f =>f.isfinger))
2
1//獲取指尖id,放入list
2fingerids.add(finger.id);
34 ellipse ellipse = null;5
if (ellipses.containskey(finger.id))//
如果在dictionary中有,則用ellipse表示其69
else
//dictionary中不存在,則建立乙個ellipse
10), null
);20 }
1這樣,我們就完成了指尖位置的繪製。//設定ellipse的位置
2 leapvector position =finger.tipposition;34
double x =position.x;
5double y =position.y;67
double screenwidth =container_canvas.actualwidth;
8double screenheight =container_canvas.actualheight;
910 x = x / detectionwidth * screenwidth + (screenwidth / 2
);11 y = screenheight - y / 600 *screenheight;
1213
this.dispatcher.begininvoke(new action(delegate
14), null);
但是,要記得,在dictionary中可能存在本幀中沒有檢測到的指尖的id。為此,我們需要移除dictionary中那些多餘的key。**如下:
1ok,這樣就完成了。執行程式看看吧。//去掉這一幀中沒追蹤到的手指
2 ienumerable deletedids =ellipses.keys.except(fingerids);
3foreach (int id in deletedids.tolist())//
這裡要記得tolist()一下,否則會出現異常。
4), null
);11
12ellipses.remove(id);13}
1415
//完成本次繪製,清空list
16 fingerids.clear();
你會發現,基本上還是我們要的效果。但是,
當手越高,指尖距離越近,這是為什麼呢?考慮一下。
附上源**。
五指棋邏輯, 簡單實現
void initqipan 初始化棋盤 void printqipan 列印棋盤 void pos int x,int y void xiaqi int tonji int x,int y void win 勝利判斷 void zhuobiao void white void black char...
C基礎(五)指標
書目 c程式設計 第三版 表示形式含義a 二維陣列名,指向一維陣列a 0 即0行首位址 a 0 a 0 a 0行0列元素位址 a 1,a 1 1行首位址 a 1 a 1 1行0列元素a 1 0 的位址 a 1 2,a 1 2,a 1 2 1行2列元素a 1 2 的位址 a 1 2 a 1 2 a 1...
c 指標(五) 指標的指標
int p 這定義了乙個什麼指標呢?不急不急,慢慢來分析 int a 上條語句我們定義了乙個整型變數 a 首先,我們不妨把 p 和 a 模擬一下,那麼 p 就是乙個整型變數,我們不妨叫這個整型變數 target 按照位址找下去,最終找到的實實在在的int型變數 由於 p target,同時 p p,...