Android-Android检测一个点是否在一个四边形内?

小组聊天灌水 小组聊天灌水 主题:993 回复:2175

Android-Android检测一个点是否在一个四边形内?

清晨说ぺ晚安 发布于 2017-03-10 字数 867 浏览 1095 回复 4

rt 有什么好的办法可以检测一个点是否在一个四边形内。

应用场景:
我对一个图片进行旋转,我要判断一个我的触摸操作是否在这个图片内(旋转后的)。

现在我是这样做的:

意图是把图片的区域转化成在屏幕中的区域,这样我点击的坐标就好判断了。

1.背景图缩放的矩阵 screenMatrix
2.图片本身的矩阵(相对于背景图的) matrix
3.计算混合矩阵
代码:

//从图片控件矩阵和图片到屏幕的矩阵的混合 
private Rect computeLayout()
{
RectF allRect = new RectF();
allMatrix.reset();
allMatrix.postConcat(screenMatrix);
allMatrix.postConcat(matrix);
allMatrix.mapRect(allRect,srcRect);
return new Rect(Math.round(allRect.left),
Math.round(allRect.top), Math.round(allRect.right),
Math.round(allRect.bottom));
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(4

清晨说ぺ晚安 2017-06-23 4 楼

先提供一种简单情景(假定四边形是一个凸四边形)的解决方法:
原理:凸多边形内部的点都在凸多边形的边所在的向量的同一侧(前提是计算边所在的向量时采用的是同一个方向,同为顺时针或者同为逆时针),利用叉积求解。
假设四边形四个顶点依次为A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4),待判断的点为P(x,y),如果点P在四边形内部,则向量AB AP(注意:1.这是求叉积;2.AB、AP均为向量,也就等于(x2-x1) (y-y1)-(y2-y1) (x-x1))的值与BCBP、CD CP、DA DP的值同号(若有等于零的情况,则表示P在边上,可以根据自己的喜好把它当做是内部或者外部),即四个值同为正或者同为负,则点P在ABCD内部,否则在外部。
如果是凹四边形还要做一些其他处理,就是找到导致四边形为凹的那个顶点,也是借助于叉积(可以参考我的博客:http://tristan-xi.org/?p=113 ,只需记录中间哪个点所求的向量叉积与其它几点异号即可),然后把四边形分成两个三角形(三角形肯定是凸的了),再按照上面的方法计算叉积,即可解决。
总结:叉积是判断多边形凹凸性以及点是否在凸多边形内部的利器。

夜无邪 2017-04-11 3 楼

其实办法还是挺简单的:
mPhotoMatrix.invert(mInvertPhotoMatrix);//mPhotoMatrix为图片变化矩阵,计算得到逆矩阵mInvertPhotoMatrix
float[] invertPoint = new float[2];
mInvertPhotoMatrix.mapPoints(invertPoint, new float[]{x, y});//对点击点进行逆矩阵变换
//photoRectSrc为图片未变换前的Rect,如果包含点击点即可认为该在图片区域
if (photoRectSrc.contains(invertPoint[0], invertPoint[1])) {
actionMode = MODE_DRAG;
}

归属感 2017-03-15 2 楼

如果知道图片的左上角和右下角的坐标,再获得当前触摸点的坐标,不就可以直接判断了吗。

晚风撩人 2017-03-14 1 楼

对图片旋转之后可以获得一个旋转矩阵,对touch点的坐标进行这个矩阵的逆矩阵转换,再判断转换后的坐标是否在Rect中。