推断是否在多边形内的随机点2途径

输入

推断触摸点是一个多边形内

办法

1、数学

这种方法的优点是任意的平台可用于。不仅现在Android

算法:

解决水平线的穿过多边形的各边的点的交点,单侧单路口,成立

ok我们事实上就是须要看这个点的单边射线与多边形的交点。代码实现例如以下:

public boolean isInPolygon(Point point, Point[] points, int n) {
		int nCross = 0;
		for (int i = 0; i < n; i++) {
			Point p1 = points[i];
			Point p2 = points[(i + 1) % n];
			// 求解 y=p.y 与 p1 p2 的交点
			// p1p2 与 y=p0.y平行
			if (p1.y == p2.y)
				continue;
			// 交点在p1p2延长线上
			if (point.y < Math.min(p1.y, p2.y))
				continue;
			// 交点在p1p2延长线上
			if (point.y >= Math.max(p1.y, p2.y))
				continue;
			// 求交点的 X 坐标
			double x = (double) (point.y - p1.y) * (double) (p2.x - p1.x)
					/ (double) (p2.y - p1.y) + p1.x;
			// 仅仅统计单边交点
			if (x > point.x)
				nCross++;
		}
		return (nCross % 2 == 1);
	}

经典算法,通用实现

2、Android

借用Android开发中的碰撞检測的思想。我们使用Region来推断,Region的具体资料稍后会有总结:

充分借助Android的api来实现:

RectF rectF = new RectF();
        path.computeBounds(rectF, true);
        Region region = new Region();
        region.setPath(path, new Region((int) rectF.left,
                        (int) rectF.top, (int) rectF.right,
                        (int) rectF.bottom));
        if (region.contains(point.x, point.y)) {

        }

以上。

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2025-01-03 22:23:12

推断是否在多边形内的随机点2途径的相关文章

均匀的生成圆和三角形内的随机点

代码在每一章节最后   一.均匀生成圆内的随机点 我们知道生成矩形内的随机点比较容易,只要分别随机生成相应的横坐标和纵坐标,比如随机生成范围[-10,10]内横坐标x,随机生成范围[-20,20]内的纵坐标y,那么(x,y)就是生成的随机点.由此,我们很容易的想到了算法1 算法1(正确的): 每个圆对应一个外切矩形,我们随机生成矩形内的点,如果该点在圆内,就返回改点,否则重新生成直到生成的点在圆内. 该方法的缺点是有可能连续几次都生成不了符合要求的点.(可以求得:每次生成点时,该点有 的概率在圆

【原创】判断点在多边形内

一.应用场景:地图应用中判断一个位置是否在一个区域内.我曾经应用在百度地图上,代码为js实现.据我了解,目前百度地图api已经提供该功能. 二.概要: 1.行政区划边界是多边形: 2.多边形分为凸多边形和凹多边形: 3.应用:产生随机数据(即一个平面坐标)在制定的行政区划边界以内(即多边形内),在正式情况下不需要从图形的层面处理数据,数据本身就有在那个区划下的属性. 三.假定: 1.多边形的点都是不重合的点: 2.给定的多边形边界坐标集就是时针顺序的,即要么符合逆时针顺序要么符合顺时针顺序,不存

HDU - 3644:A Chocolate Manufacturer&#39;s Problem(模拟退火, 求多边形内最大圆半径)

pro:给定一个N边形,然后给半径为R的圆,问是否可以放进去.  问题转化为多边形的最大内接圆半径.(N<50): sol:乍一看,不就是二分+半平面交验证是否有核的板子题吗. 然而事情并没有那么简单.  因为我们的多边形可能是凹多边形,而前面的方法只对凸多边形有效. 学习了下模拟退火的算法,这个随机算法只在最小圆覆盖的时候写过. 这里再学一下,看起来更正宗一点的.  每次在当前点的附近(R)找是否能优化,而这个R慢慢变小,使得趋紧答案的趋势更精细. 判定点再多边形内:同样,不能用检验是否在每条

点在多边形内的判断

在看zrender源码时,看到点在多边形内的判断代码,特意粘出来,参考下: /** * 多边形包含判断 * 采用 non-zero winding rule */ function isInsidePolygon(points, x, y) { var N = points.length; var w = 0; for (var i = 0, j = N - 1; i < N; i++) { var x0 = points[j][0]; var y0 = points[j][1]; var x1

A Round Peg in a Ground Hole - POJ 1584 (判断凸多边形&amp;判断点在多边形内&amp;判断圆在多边形内)

题目大意:首先给一个圆的半径和圆心,然后给一个多边形的所有点(多边形按照顺时针或者逆时针给的),求,这个多边形是否是凸多边形,如果是凸多边形在判断这个圆是否在这个凸多边形内. 分析:判断凸多边形可以使用相邻的三个点叉积判断,因为不知道顺时针还是逆时针,所以叉积如果有有整数和负数,那么一定不是凸多边形(注意允许多多点在一条线段上).判断圆在凸多边形首先要判断圆心是否在多边形内,如果在多边形内,再次判断圆心到达到变形每条边的最短距离,如果小于半径就是不合法.ps:一道好题,通过这个题学会了不少东西.

判断点是否在多边形内

有一个n边形,顶点为p1,p2,...,pn;给定一个已知点p,判断p在此多边形内还是外. 预备知识: 两线段相交的定义,如果一条线段的两端分别处在另一条线段的两端,则此两线段相交 判断2点在线段的两侧可以用向量的叉乘实现! 基本步骤: 1,过p点垂直向上作一条射线 2,判断此射线与n边形n条边的交点 3,把所有交点相加,如果是奇数则说明在多边形内,否则在多边形外 思路非常的简单,另外说明一下几种特殊的情况: 1,射线与多边形的顶点相交:比如射线过多边形的Pi点,则如果Pi-1和Pi+1在此射线

ZOJ 3720 Magnet Darts (计算几何,概率,判点是否在多边形内)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意: 在一个矩形区域投掷飞镖,因此飞镖只会落在整点上,投到每个点的得分是Ax+By.矩形区域里面有个多边形,如果飞镖投在多边形里面则得分,求最终的得分期望. 即:给定一个矩形内的所有整数点,判断这些点是否在一个多边形内 方法: 计算几何的判点是否在多边形内(几何模板),如果在,则令得分加(Ax+By)*以此点为中心边长为1的正方形面积 1 void solve()

如何判断一个点是否在一个多边形内?

提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内. 一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的面积等于下面绝对值的二分之一: | x1  y1  1 | | x2 y2  1 | = x1y2 + x3y1 + x2y3 –x3y2 – x2y1 – x1y3 | x3 y3  1 | 当且仅当点P3位于直线P1P2(有向直线P1->P2)的右侧时,该表达式的符号为正.这个公式可以在固定的时

经纬度计算是否在圆形内,是否在矩形内,是否在多边形内方法

class 点面关系{static void Main(string[] args){//Vector2D point1 = new Vector2D(39.909209536859834, 116.3225715637207);//inVector2D point1 = new Vector2D(39.901045, 116.415596);//outVector2D cPoint = new Vector2D(39.909209536859834, 116.3225715637207); C