激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android如何判斷一個點在不在多邊形區域內

Android如何判斷一個點在不在多邊形區域內

2022-02-24 15:30呆呆的小木頭 Android

這篇文章主要為大家詳細介紹了Android判斷一個點在不在多邊形區域內的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

有人問我,怎么判斷一個點是不是在多邊形內,本來想著把這個多邊形分成一個又一個三角形,如圖,

 Android如何判斷一個點在不在多邊形區域內

然后判斷這個點是不是在某個三角形中,如果在,那就肯定在這個多邊形中,那問題接下來就轉化成判斷這個點是不是在三角形中了,只要這個點D和三角形的三個點A、B、C組合的三角形a、b、c的面積之和等于這個三角形的面積,就說明這個點在三角形中,如圖。

Android如何判斷一個點在不在多邊形區域內

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public boolean isInTriangle(Point A, Point B, Point C, Point P) {
 double ABC = triAngleArea(A, B, C);
 double ABp = triAngleArea(A, B, P);
 double ACp = triAngleArea(A, C, P);
 double BCp = triAngleArea(B, C, P);
 if ((int) ABC == (int) (ABp + ACp + BCp)) {// 若面積之和等于原三角形面積,證明點在三角形內,這里做了一個約等于小數點之后沒有算(25714.25390625、25714.255859375)
  return true;
 } else {
  return false;
 }
}
 
private double triAngleArea(Point A, Point B, Point C) {// 由三個點計算這三個點組成三角形面積
 double result = Math.abs((A.getX() * B.getY() + B.getX() * C.getY()
   + C.getX() * A.getY() - B.getX() * A.getY() - C.getX()
   * B.getY() - A.getX() * C.getY()) / 2.0D);
 return result;
}

一切看起來那么合情合理,代碼寫完了,也測試了都沒有問題啦!但是最后我發現忽略了一個問題,還有一種多邊形的情況沒有考慮到,那就是香蕉形的多邊形,如圖:

Android如何判斷一個點在不在多邊形區域內

這個問題一出來,我立刻蒙圈啦,這個應該怎么做,最后在網上找到了解決辦法,那就是沿著這個點做平行線,如果這個點單側和多邊形相交的點為奇數,就說明這個點在這個多邊形中,如圖:

Android如何判斷一個點在不在多邊形區域內

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * 功能:判斷點是否在多邊形內 方法:求解通過該點的水平線與多邊形各邊的交點 結論:單邊交點為奇數,成立!
 *
 * @param point
 *   指定的某個點
 * @param APoints
 *   多邊形的各個頂點坐標(首末點可以不一致)
 * @return
 */
public boolean PtInPolygon(Point point, List<Point> APoints) {
 int nCross = 0;
 for (int i = 0; i < APoints.size(); i++) {
  Point p1 = APoints.get(i);
  Point p2 = APoints.get((i + 1) % APoints.size());
  // 求解 y=p.y 與 p1p2 的交點
  if (p1.getY() == p2.getY()) // p1p2 與 y=p0.y平行
   continue;
  if (point.getY() < Math.min(p1.getY(), p2.getY())) // 交點在p1p2延長線上
   continue;
  if (point.getY() >= Math.max(p1.getY(), p2.getY())) // 交點在p1p2延長線上
   continue;
  // 求交點的 X 坐標
  // --------------------------------------------------------------
  double x = (double) (point.getY() - p1.getY())
    * (double) (p2.getX() - p1.getX())
    / (double) (p2.getY() - p1.getY()) + p1.getX();
  if (x > point.getX())
   nCross++; // 只統計單邊交點
 }
 // 單邊交點為偶數,點在多邊形之外 ---
 return (nCross % 2 == 1);
}

項目下載:一個點是否在多邊形中

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/u014544193/article/details/50698015

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 精品国产一级毛片 | 久久精品色 | wankz100%videos| 亚洲日本高清 | 国产精品亚洲三区 | 日韩精品中文字幕在线播放 | 91在线色| 一区小视频 | 免费一区二区三区 | 9191久久久久视频 | 国产老师做www爽爽爽视频 | 成年性羞羞视频免费观看无限 | 国产精品视频不卡 | 久久亚洲成人 | 欧美一区中文字幕 | 中文字幕一二区 | 日韩精品一区二区在线 | 日韩精品dvd | 久久久久国产精品久久久久 | 日韩欧美电影一区二区三区 | 日韩精品一区二区在线 | 久久亚洲精品视频 | av免费av| 九九精品在线观看视频 | 国产亚洲精品久久久久久久软件 | 日本免费一区二区三区四区 | 水卜樱一区二区av | 日韩黄色一级视频 | 亚洲国产精品久久久久久久久久久 | 国产日韩在线观看视频 | 久久视频精品 | 久久久久国产成人免费精品免费 | 毛片免费在线观看视频 | 国产精品美女久久久久久不卡 | 草莓视频久久 | 亚洲一区二区在线免费 | 欧美一级免费视频 | 久久国产中文字幕 | 国产午夜精品在线 | 久久看视频 | 国产免费观看一区二区三区 |