判斷點是否手繪多邊形內的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......餘下全文>>