分簇+觸摸屏精確定位Algo

分簇+觸摸屏精確定位Algo
問題分析
現(xiàn)代生活万搔,觸摸屏手機已是非常普及,可以說人手一只扣孟。我們只要用手指輕輕在屏幕上觸碰烫堤,手機就能感應(yīng)到我們的操作,并且執(zhí)行相應(yīng)的功能哈打。那么塔逃,手機是怎樣定位到觸摸點的呢?這個就是我們今天要討論算法所重點要模擬解決的問題料仗。
解決的思路是:把我們手機屏幕看成一個二維坐標(biāo)系湾盗,橫豎分別分為X軸和Y軸,這樣我們就可以通過坐標(biāo)值來定位某個點立轧。知道如何表示觸摸點還不足夠格粪,我們怎樣確定定位點呢?這就涉及到硬件了氛改,每個屏幕TP上面都會有電容感應(yīng)器帐萎,當(dāng)你用手觸摸某個地方時,那里對應(yīng)的電容值便會升高胜卤。多點觸摸疆导,就會有多個地方電容值升高。
但問題又來了葛躏,我們觸摸的地方往往是一個區(qū)域澈段,因為我們手指有一定的寬度。所以舰攒,我們需要按電容值的高低對屏幕坐標(biāo)先進(jìn)行分簇败富,即局部最大值聚類。對np_values搜索局部極大值摩窃。如果只找到一個局部最大值兽叮,則有一個單點觸摸。如果找到多個局部極大值猾愿,則有多個接觸鹦聪。
分簇完成,接下來就好辦了蒂秘,可以通過計算電容加權(quán)平均值得出每個分簇的精確定位椎麦。

分簇實現(xiàn)
下面是一個屏幕電容值的模擬數(shù)據(jù)表:

電容值模擬表.png

可以看到,表中所給電容值橫軸方向材彪、縱軸方向都有所變化观挎,當(dāng)觸摸屏某個位置有觸摸動作發(fā)生時,該處電容值會升高段化,由此可判斷出嘁捷,上圖中有兩處按壓。
可得到兩個序列:
x軸序列是{0显熏,6雄嚣,137,84喘蟆,9缓升,4},Y軸序列是{1蕴轨,4港谊,45,25橙弱,2歧寺,2,13棘脐,52斜筐,58,15蛀缝,4}顷链。
分簇要找的就是所給序列的突峰區(qū)間,如果用索引(坐標(biāo)索引從0開始計)來表示的話屈梁,上述x軸序列有一個分簇區(qū)間[0嗤练,5],y軸序列有兩個分簇區(qū)間[0俘闯,4]和[5潭苞,10]。圖示如下:
X軸序列.png

Y軸序列.png

最后真朗,我們需要輸出分簇結(jié)果:x軸分簇[0此疹,5],y軸分簇[0遮婶,4]蝗碎、[5,10]旗扑。
分簇算法實現(xiàn)的難點在哪兒呢蹦骑?我覺得應(yīng)該是如何判斷一個分簇的開始與結(jié)束。為了實現(xiàn)判斷臀防,我在遍歷索引的時候眠菇,加上了標(biāo)志變量(如果當(dāng)前電容值比它的前者大的話边败,標(biāo)志變量置1,否則置2)捎废。然后在輸出分簇的時候笑窜,我們就可以通過判斷標(biāo)志變量,準(zhǔn)確輸出區(qū)間登疗。主要實現(xiàn)代碼如下:

printf("x方向上的增減標(biāo)志位如下:\n");

for (i = 0; i < x-1; i++)
 {
   if(xx[i] <= xx[i+1])
   {
       xTag[i] = 1;
   }
   if(xx[i] >= xx[i+1])
   {
       xTag[i] = 2;
       bianjieX++;
   }
   printf("%d", xTag[i]);
}
  printf("y方向上的增減標(biāo)志位如下:\n");
 for (j = 0; j < y-1; j++)
 {
   if(yy[j] <= yy[j+1])
   {
       yTag[j] = 1;
   }
   //根據(jù)區(qū)間來看排截,前后相等的情況應(yīng)該賦值為2,所以上面小于情況的=號可下可不下
   if(yy[j] >= yy[j+1])
   {
       yTag[j] = 2;
       bianjieY++;
   }
   printf("%d", yTag[j]);
 }
 //定義二維數(shù)組用于存儲區(qū)間的索引
 for (i = 0; i < x-1; i++) {
if(xTag[i] == 2 && xTag[i+1] == 1) {
    xsection[count++][1] = i;
    xsection[count][0] = i+1;
}
}
if(xsection[count][1] == 0) {
xsection[count][1] = x-1;
}
 while(i < x-1) {
   printf("\nX方向上的分簇[%d, %d]", xsection[i][0], xsection[i][1]);
}

精確定位實現(xiàn)
有了分簇結(jié)果辐益,我們就可以借用分簇結(jié)果來計算每個分簇對應(yīng)的精確坐標(biāo)值了断傲。計算的過程:首先需要找到分簇區(qū)間中每個索引對應(yīng)的電容值,把電容值累加到變量CapacitanceALL智政,然后將每個索引值*對應(yīng)電容值累加到變量AddAll认罩,最后就可通過AddAll / CapacitanceALL來計算出每個分簇的精確值location。
主要實現(xiàn)代碼如下:

while(i < x-1) {

printf("\nX方向上的分簇[%d, %d]", xsection[i][0], xsection[i][1]);
AddAll = 0.0,CapacitanceALL = 0.0;
location = 0.0;
//輸出此段分簇區(qū)間的精確定位
for(m = xsection[i][0];m <= xsection[i][1];m++)
{
    AddAll = AddAll + xx[m] * m;
    CapacitanceALL = CapacitanceALL + xx[m];
}
location = AddAll / CapacitanceALL;
   printf(" 此段分簇區(qū)間的加權(quán)精確x值是:%.3f",location);
i++;
if(xsection[i][0] == 0) {
    break;
 }
  }

算法測試
測試數(shù)據(jù)用的是上面提供電容模擬表中的數(shù)值女仰,分別輸入X猜年、Y方向上的電容值,測試結(jié)果如下:

AlgoTest.png

后言
關(guān)于這個算法就介紹這么多了疾忍,有什么不對的地方還望多多指教乔外,也歡迎大家關(guān)注我(簡書/GitHub
謝謝觀看此文。
源代碼地址?http://pan.baidu.com/s/1slAOoTf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末一罩,一起剝皮案震驚了整個濱河市杨幼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聂渊,老刑警劉巖差购,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汉嗽,居然都是意外死亡欲逃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門饼暑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稳析,“玉大人,你說我怎么就攤上這事弓叛≌镁樱” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵撰筷,是天一觀的道長陈惰。 經(jīng)常有香客問我,道長毕籽,這世上最難降的妖魔是什么抬闯? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任井辆,我火速辦了婚禮,結(jié)果婚禮上画髓,老公的妹妹穿的比我還像新娘掘剪。我一直安慰自己,他們只是感情好奈虾,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著廉赔,像睡著了一般肉微。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜡塌,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天碉纳,我揣著相機與錄音,去河邊找鬼馏艾。 笑死劳曹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琅摩。 我是一名探鬼主播铁孵,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼房资!你這毒婦竟也來了蜕劝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤轰异,失蹤者是張志新(化名)和其女友劉穎岖沛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搭独,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡婴削,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牙肝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唉俗。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惊奇,靈堂內(nèi)的尸體忽然破棺而出互躬,到底是詐尸還是另有隱情,我是刑警寧澤颂郎,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布吼渡,位于F島的核電站,受9級特大地震影響乓序,放射性物質(zhì)發(fā)生泄漏寺酪。R本人自食惡果不足惜坎背,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寄雀。 院中可真熱鬧得滤,春花似錦、人聲如沸盒犹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽急膀。三九已至沮协,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卓嫂,已是汗流浹背慷暂。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晨雳,地道東北人行瑞。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像餐禁,于是被迫代替她去往敵國和親血久。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理坠宴,服務(wù)發(fā)現(xiàn)洋魂,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 前言 其實讀完斯坦福的這本《互聯(lián)網(wǎng)大規(guī)模數(shù)據(jù)挖掘》喜鼓,讓我感覺到副砍,什么是人工智能?人工智能就是更高層次的數(shù)據(jù)挖掘庄岖。機...
    我偏笑_NSNirvana閱讀 12,548評論 1 23
  • 《高性能MySQL》&《MySQL技術(shù)內(nèi)幕 InnoDB存儲引擎》筆記 第一章 MySQL架構(gòu)與歷史 MySQL的...
    xiaogmail閱讀 12,747評論 0 39
  • 本文是我總結(jié)的我個人求職過程中的經(jīng)驗豁翎,是按求職步驟來寫的。寫得比較細(xì)隅忿,因為我自己求職時的準(zhǔn)備和每次面試完后的總結(jié)也...
    肅尋閱讀 946評論 0 4
  • 感想多是一件壞事心剥,最近不知道怎么了,老是亂想背桐,弄的自己都累的一塌糊涂优烧,這一生,第一次那么喜歡一個人链峭!
    瞬間燦爛閱讀 180評論 0 0