判斷點是否手繪多邊形內的2種方法,判斷2種方法

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.