AG环亚娱乐_AG直营网_环亚娱乐AG最佳线路_搜狐新闻
web技术

全站技术

当前位置:主页 > 全站技术 >

联系我们

CONTACT

地址:
电话:
传真:
邮箱:

判断点是否任意多边形内的2种方法,判断2种方法

2019-02-06

判断点是否任意多边形内的2种方法,判断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)) {
                
        }

以上。






判断点是否在任意多边形内答案

struct point //建立point结构体,浮点型成员 x y{double x;double y;};point p[200],A,B; //建立point 数组,和两个point 对象 A Bint m,n,i; //定义三个整型变量 m n i double min_x,min_y,max_x,max_y; //定义四个浮点型变量,用于储存临时数据(如比较大小)double max(double,double); //声明取最大值函数double min(double,double); //声明去最小值函数double cross(point,point,point); //声明计算叉积函数bool In_squre(); //声明计算点是否在多边形内的函数(布尔型)int main(void){while(cin>>n) //输入 n 代表多边形顶点个数 {
if(n==0) break; //当 n==0 时退出循环 for(i=0;i<n;i++){cin>>p[i].x>>p[i].y;}p[n].x=p[0].x;
p[n].y=p[0].y;
cin>>m; //输入 m 代表测试点的数目 while(m--){cin>>A.x>>A.y; //输入测试点的坐标 if(In_squre()==true) cout<<"Yes"<<endl; //调用判断点是否在多边形内函数 else cout<<"No"<<endl;}}return0;}double max(double a,double b) //判断最大值函数{
return a>b?a:b;}double min(double a,double b) //判断最小值函数{
return a<b?a:b;
 
判断点是否在任意多边形内

//杭电1756////原模板适用于x y坐标为正数的情况,如需应用,需修改B点横坐标位置,使其相对无限远#include<iostream>using namespace std;
struct point //建立point结构体,浮点型成员 x y{double x;double y;};point p[200],A,B; //建立point 数组,和两个point 对象 A Bint m,n,i; //定义三个整型变量 m n i double min_x,min_y,max_x,max_y; //定义四个浮点型变量,用于储存临时数据(如比较大小)double max(double,double); //声明取最大值函数double min(double,double); //声明去最小值函数double cross(point,point,point); //声明计算叉积函数bool In_squre(); //声明计算点是否在多边形内的函数(布尔型)int main(void){while(cin>>n) //输入 n 代表多边形顶点个数 {
if(n==0) break; //当 n==0 时退出循环 for(i=0;i<n;i++){cin>>p[i].x>>p[i].y;}p[n].x=p[0].x;
p[n].y=p[0].y;
cin>>m; //输入 m 代表测试点的数目 while(m--){cin>>A.x>>A.y; //输入测试点的坐标 if(In_squre()==true) cout<<"Yes"<<endl; //调用判断点是否在多边形内函数 else cout<<"No"<<endl;}}return0;}double max(double a,double b) //判断最大值函数{
return a>b?a:b;}double min(double a,double b) //判断最小值函数{
return a<b?a:b;
}double cross(point a,point b,point c) //计算叉积函数{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}bool In_squre(){
B.x=-200; //将对象 B 的成员初始化 B.y=A.y;
int number=0; //定义整型变量 number 用于记录 AB 与多边形边交点个数 for(i=1;i<=n;i++){max_x=max(p[i].x,p[i-1].x);
max_y=max(p[i].y,p[i-1].y);
min_x=min(p[i].x,p[i-1].x);
min_y=min(p[i].y,p[i-1].y);
//max_x max_y min_x min_y 四个变量用于辅助界定边界 if(cross(p[i......余下全文>>
 

http://www.bkjia.com/Androidjc/892134.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/892134.htmlTechArticle判断点是否任意多边形内的2种方法,判断2种方法 导入 判断触摸点是否在一个多边形的内部 方法 1、数学方法 这个方法的好处是任意平台...

本文源自: AG环亚娱乐

上一篇:android 账户管理和同步机制

下一篇:没有了

【返回列表】

Copyright © 2005-2017 http://www.turingvr.com AG环亚娱乐_AG直营网_环亚娱乐AG最佳线路_搜狐新闻版权所有

友情链接: