精确字符串检查(WPF多点触控)

时间:2009-12-11 11:43:55

标签: c# wpf string contains multi-touch

我试图让你进入图片,我正试图在WPF4 VS2010中实现一个手势,就像你移动你的手指直到它穿过你已经用相同手指传过的TouchPoint,所以我的想法是制作一个列表并检查每个新TouchPoint是否存在,如果是,那么你已经完成了你的手势,如果没有,那么将TouchPoint添加到集合中以与下面的TouchPoints进行比较。由于某种原因,这不能很好地工作,所以我转向另一种方法,用Touch替换TouchPoints X,Y为TouchPoint并将它们转换为字符串并尝试对它们使用Contains方法,使用TouchMove和TouchUp事件我的代码如下: / p>

 private void g1_TouchMove(object sender, TouchEventArgs e)
    {



       if(touchX.Contains(""+e.GetTouchPoint(g1).Position.X) && touchY.Contains(""+e.GetTouchPoint(g1).Position.Y))
        {
         // Clearing the lists , changing the canvas background color to know that the gesture is done
           touchX.Clear();
           touchY.Clear();
           g1.Background = Brushes.AliceBlue;

        }
       else
       {
           //adding new X, Y values to their respective lists
           touchX.Add(""+e.GetTouchPoint(g1).Position.X);
           touchY.Add( ""+e.GetTouchPoint(g1).Position.Y);


       }

    }
private void g1_TouchUp(object sender, TouchEventArgs e)
    {
        //clearing the lists after the touch is up (finger removed)
        touchX.Clear();
        touchY.Clear();
        //getting the canvas it's original background color
        g1.Background = Brushes.Orange;

    }

因此,在测试它时它不起作用,即使我直接移动触摸它也会改变背景。任何想法?

提前致谢

1 个答案:

答案 0 :(得分:1)

首先,请回到使用数字。将数字放入字符串以供以后比较在如此多的级别上是错误的: - )

我的猜测是你的问题是一个分辨率问题 - 几乎不可能与之前的完全相同的地点,因为有一个批次屏幕上的像素。基本上,一个像素关闭将使您的算法无用。您应该将触摸区域映射到几个较大的簇中,然后检查触摸是否已经在此群集中(与完全相同的像素相反)。

一种简单的方法是对您收到的坐标进行整数除法。

在下面的示例中,我将像素坐标系划分为3 x 3像素的簇,但如果对你有意义,你可以选择更大的像素坐标系。这一切都取决于触摸区域的分辨率有多大。

这在实践中意味着这个3乘3区域内的任何像素都被视为相等。因此,(1,1)上的匹配与(2,3)上的上次匹配相匹配,依此类推。

// Divide into 3x3 pixel clusters
var currentCluster = new Point((int)touchPos.X / 3, (int)touchPos.Y / 3)
// previousClusters is a List<Point>() which is cleared on TouchUp
foreach (var cluster in previousClusters)
{
    if (cluster == currentCluster)
    {
        // We've been here before, do your magic here!
        g1.Background = Brushes.AliceBlue;
        // Return here, since we don't want to add the point again
        return;
    }
}
previousClusters.Add(currentCluster);