分簇+触摸屏精确定位Algo

分簇+触摸屏精确定位Algo
问题分析
现代生活,触摸屏手机已是非常普及,可以说人手一只。我们只要用手指轻轻在屏幕上触碰,手机就能感应到我们的操作,并且执行相应的功能。那么,手机是怎样定位到触摸点的呢?这个就是我们今天要讨论算法所重点要模拟解决的问题。
解决的思路是:把我们手机屏幕看成一个二维坐标系,横竖分别分为X轴和Y轴,这样我们就可以通过坐标值来定位某个点。知道如何表示触摸点还不足够,我们怎样确定定位点呢?这就涉及到硬件了,每个屏幕TP上面都会有电容感应器,当你用手触摸某个地方时,那里对应的电容值便会升高。多点触摸,就会有多个地方电容值升高。
但问题又来了,我们触摸的地方往往是一个区域,因为我们手指有一定的宽度。所以,我们需要按电容值的高低对屏幕坐标先进行分簇,即局部最大值聚类。对np_values搜索局部极大值。如果只找到一个局部最大值,则有一个单点触摸。如果找到多个局部极大值,则有多个接触。
分簇完成,接下来就好办了,可以通过计算电容加权平均值得出每个分簇的精确定位。

分簇实现
下面是一个屏幕电容值的模拟数据表:

电容值模拟表.png

可以看到,表中所给电容值横轴方向、纵轴方向都有所变化,当触摸屏某个位置有触摸动作发生时,该处电容值会升高,由此可判断出,上图中有两处按压。
可得到两个序列:
x轴序列是{0,6,137,84,9,4},Y轴序列是{1,4,45,25,2,2,13,52,58,15,4}。
分簇要找的就是所给序列的突峰区间,如果用索引(坐标索引从0开始计)来表示的话,上述x轴序列有一个分簇区间[0,5],y轴序列有两个分簇区间[0,4]和[5,10]。图示如下:
X轴序列.png

Y轴序列.png

最后,我们需要输出分簇结果:x轴分簇[0,5],y轴分簇[0,4]、[5,10]。
分簇算法实现的难点在哪儿呢?我觉得应该是如何判断一个分簇的开始与结束。为了实现判断,我在遍历索引的时候,加上了标志变量(如果当前电容值比它的前者大的话,标志变量置1,否则置2)。然后在输出分簇的时候,我们就可以通过判断标志变量,准确输出区间。主要实现代码如下:

printf("x方向上的增减标志位如下:\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方向上的增减标志位如下:\n");
 for (j = 0; j < y-1; j++)
 {
   if(yy[j] <= yy[j+1])
   {
       yTag[j] = 1;
   }
   //根据区间来看,前后相等的情况应该赋值为2,所以上面小于情况的=号可下可不下
   if(yy[j] >= yy[j+1])
   {
       yTag[j] = 2;
       bianjieY++;
   }
   printf("%d", yTag[j]);
 }
 //定义二维数组用于存储区间的索引
 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]);
}

精确定位实现
有了分簇结果,我们就可以借用分簇结果来计算每个分簇对应的精确坐标值了。计算的过程:首先需要找到分簇区间中每个索引对应的电容值,把电容值累加到变量CapacitanceALL,然后将每个索引值*对应电容值累加到变量AddAll,最后就可通过AddAll / CapacitanceALL来计算出每个分簇的精确值location。
主要实现代码如下:

while(i < x-1) {

printf("\nX方向上的分簇[%d, %d]", xsection[i][0], xsection[i][1]);
AddAll = 0.0,CapacitanceALL = 0.0;
location = 0.0;
//输出此段分簇区间的精确定位
for(m = xsection[i][0];m <= xsection[i][1];m++)
{
    AddAll = AddAll + xx[m] * m;
    CapacitanceALL = CapacitanceALL + xx[m];
}
location = AddAll / CapacitanceALL;
   printf(" 此段分簇区间的加权精确x值是:%.3f",location);
i++;
if(xsection[i][0] == 0) {
    break;
 }
  }

算法测试
测试数据用的是上面提供电容模拟表中的数值,分别输入X、Y方向上的电容值,测试结果如下:

AlgoTest.png

后言
关于这个算法就介绍这么多了,有什么不对的地方还望多多指教,也欢迎大家关注我(简书/GitHub
谢谢观看此文。
源代码地址​http://pan.baidu.com/s/1slAOoTf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,923评论 6 535
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,740评论 3 420
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,856评论 0 380
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,175评论 1 315
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,931评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,321评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,383评论 3 443
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,533评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,082评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,891评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,067评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,618评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,319评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,732评论 0 27
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,987评论 1 289
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,794评论 3 394
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,076评论 2 375

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,796评论 18 139
  • 前言 其实读完斯坦福的这本《互联网大规模数据挖掘》,让我感觉到,什么是人工智能?人工智能就是更高层次的数据挖掘。机...
    我偏笑_NSNirvana阅读 12,664评论 1 23
  • 《高性能MySQL》&《MySQL技术内幕 InnoDB存储引擎》笔记 第一章 MySQL架构与历史 MySQL的...
    xiaogmail阅读 12,807评论 0 39
  • 本文是我总结的我个人求职过程中的经验,是按求职步骤来写的。写得比较细,因为我自己求职时的准备和每次面试完后的总结也...
    肃寻阅读 956评论 0 4
  • 感想多是一件坏事,最近不知道怎么了,老是乱想,弄的自己都累的一塌糊涂,这一生,第一次那么喜欢一个人!
    瞬间灿烂阅读 201评论 0 0