国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 精品成人18| 在线观看午夜免费视频 | 久久99这里只有精品 | 午夜家庭影院 | 久久免费99精品久久久久久 | 欧美综合第一页 | 亚洲欧美一区二区视频 | 97久久超碰| 日本高清视频在线播放 | 黄色片小视频 | 国产精品成av人在线视午夜片 | 精品无码久久久久久久动漫 | 欧美视频精品在线观看 | 亚洲欧美在线视频 | 日本高清无卡码一区二区久久 | 永久免费av | 亚洲免费视频一区二区 | 国产精品欧美久久久 | 国产精品精 | 亚洲va国产天堂va久久 en | 啪啪伊人 | 搞黄网站| 久久se精品一区精品二区 | 中文字幕一区在线 | 午夜视频免费在线观看 | 一本大道久久a久久精品综合1 | 亚洲国产欧美日韩 | 黄色视屏免费在线观看 | 亚洲精选久久 | 国产精品日本欧美一区二区三区 | 亚洲国产精品99久久久久久久久 | 成人午夜精品 | 99久久免费精品国产男女性高好 | 亚洲网站在线 | 国产精品久久久久久 | 精品视频久久 | 黄色免费毛片 | 日韩在线免费 | 嫩草在线视频 | 欧美高清性xxxxhdvideosex | 成年人免费观看在线视频 |