乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 63|回复: 4

判断点是否在多边形内(C#版本)

[复制链接]

4

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
27
发表于 2012-3-13 21:36:00 | 显示全部楼层 |阅读模式
///
        /// 判断点是否在闭合多线段内
        ///
        /// 待判断点
        /// 目标多边形
        /// 在多边形内则返回1
        
        private double min(double x,double y)
        {
            if (x > y)
                return y;
            else
                return x;
        }
        private double max(double x, double y)
        {
            if (x > y)
                return x;
            else
                return y;
        }
        public int PtinPolygon(Point3d pt,Point3d[] ptPolygon)
        {
            int nCount = ptPolygon.Length;
            // 记录是否在多边形的边上
            bool isBeside = false;
            // 多边形外接矩形
            double maxx,maxy,minx,miny;
            if (nCount > 0)
            {
                maxx = ptPolygon[0].X;
                minx = ptPolygon[0].X;
                maxy = ptPolygon[0].Y;
                miny = ptPolygon[0].Y;
                for (int j = 1; j = maxx)
                        maxx = ptPolygon[j].X;
                    else if (ptPolygon[j].X = maxy)
                        maxy = ptPolygon[j].Y;
                    else if (ptPolygon[j].Y  maxx) || (pt.X  maxy) || (pt.Y = min(p1.X,p2.X) && pt.X  max(p1.Y, p2.Y))
                    continue;
                // 求交点的X坐标
                double x = (double)(pt.Y - p1.Y) * (double)(p2.X - p1.X) / (double)(p2.Y - p1.Y) + p1.X;
                if (x > pt.X)
                    nCross++;  // 只统计单边交点
                else if (x == pt.X)
                    isBeside = true;
            }
            if (isBeside)
                return 0;  //多边形上
            else if (nCross % 2 == 1)
                return 1;  // 多边形内
            return -1;     // 多边形外
        }

vmwpuxgc5t2.png

vmwpuxgc5t2.png

该贴已经同步到
回复

使用道具 举报

1

主题

11

帖子

3

银币

初来乍到

Rank: 1

铜币
15
发表于 2012-3-25 20:48:00 | 显示全部楼层
,你直接用系统api吧。
回复

使用道具 举报

gyl

15

主题

127

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
187
发表于 2012-6-7 00:08:00 | 显示全部楼层

能具体说一下吗?
回复

使用道具 举报

1

主题

10

帖子

1

银币

初来乍到

Rank: 1

铜币
14
发表于 2012-7-25 10:31:00 | 显示全部楼层
用lz的方法 在有些时候判别出现了问题
你看下这样代码应该好点
  1. public int ptInPolygon1(Point3d pt, Polyline pPolyline)
  2.         {
  3.             int count = pPolyline.NumberOfVertices;
  4.             //构建多边形外接矩形
  5.             double maxx = double.MinValue, maxy = double.MinValue, minx = double.MaxValue, miny = double.MaxValue;
  6.             for (int i = 0; i  maxx)
  7.                 {
  8.                     maxx = pPolyline.GetPoint3dAt(i).X;
  9.                 }
  10.                 if (pPolyline.GetPoint3dAt(i).Y > maxy)
  11.                 {
  12.                     maxy = pPolyline.GetPoint3dAt(i).Y;
  13.                 }
  14.                 if (pPolyline.GetPoint3dAt(i).X  maxx || pt.Y > maxy || pt.X = 1)
  15.                 {
  16.                     for (int n = 0; n  pt.X)
  17.                         {
  18.                             crossCount++;
  19.                             Circle pCircle = new Circle(crossPt, Vector3d.ZAxis, 2);
  20.                             pBlockTableRecord.AppendEntity(pCircle);
  21.                             tran.AddNewlyCreatedDBObject(pCircle, true);
  22.                         }
  23.                     }
  24.                 }
  25.                 Circle circle = new Circle(pt, Vector3d.ZAxis, 2);
  26.                 pBlockTableRecord.AppendEntity(circle);
  27.                 tran.AddNewlyCreatedDBObject(circle, true);
  28.                 pBlockTableRecord.AppendEntity(line1);
  29.                 tran.AddNewlyCreatedDBObject(line1, true);
  30.                 tran.Commit();
  31.             }
  32.             return crossCount % 2;
  33.         }
回复

使用道具 举报

9

主题

24

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2014-5-26 10:20:00 | 显示全部楼层
东西不错,顶了,感谢分享
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 21:16 , Processed in 0.369239 second(s), 65 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表