判断点是否在多边形内(包括在多边形上)的一个算法

 
/** 检查某点是否包含在多边形的范围内(只用与判断在多边形内部,不包含点在多边形边上的情况)~ */
- (BOOL) checkPointWithinPolygon:(PolyVerticesWrapper*)pvw point:(b2Vec2)point {
    int verticesCount = [pvw verticesCount];
    b2Vec2 *ptPolygon = [pvw vertices];
    
    int nCross = 0;
    for (int i = 0; i < verticesCount; ++ i) {
        float j = ptPolygon[i].x;
        float k = ptPolygon[i].y;
        float m = ptPolygon[(i + 1) % verticesCount].x;
        float n = ptPolygon[(i + 1) % verticesCount].y;
        b2Vec2 p1(j, k);
        b2Vec2 p2(m, n);
    
       //求解 y=p.y与 p1 p2 的交点
        if ( p1.y == p2.y ) {  // p1p2与 y=p0.y平行
            continue;
        }
        if ( point.y < fminf(p1.y, p2.y) ) {//交点在p1p2延长线上 
            continue;             
        }
        if ( point.y > fmaxf(p1.y, p2.y) ) {//交点在p1p2延长线上 
            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++;            
        }
    }
    if(nCross%2 != 0) {   //单边交点为偶数,点在多边形之外
        return YES;
    } else {
        return NO; 
    }
}




public int ptInPolygon1(Point3d pt, Polyline pPolyline)
        {
            int count = pPolyline.NumberOfVertices;
            //构建多边形外接矩形
            double maxx = double.MinValue, maxy = double.MinValue, minx = double.MaxValue, miny = double.MaxValue;
            for (int i = 0; i < count; i++)
            {
            }
            if (pt.X > maxx || pt.Y > maxy || pt.X < minx || pt.Y < miny)
            {
                return -1;
            }


            Line line1 = new Line(new Point3d(maxx, pt.Y, 0), new Point3d(minx, pt.Y, 0));


            int crossCount = 0;


            using (Transaction tran = pDatabase.TransactionManager.StartTransaction())
            {
                BlockTableRecord pBlockTableRecord = tran.GetObject(pDatabase.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;


                Point3dCollection crossPoint = new Point3dCollection();


                line1.IntersectWith(pPolyline, Intersect.OnBothOperands, crossPoint, 0, 0);
                if (crossPoint.Count >= 1)
                {
                    for (int n = 0; n < crossPoint.Count; n++)
                    {
                        Point3d crossPt = crossPoint[n];
                        if (crossPt.X > pt.X)
                        {
                            crossCount++;


                            Circle pCircle = new Circle(crossPt, Vector3d.ZAxis, 2);


                            pBlockTableRecord.AppendEntity(pCircle);
                            tran.AddNewlyCreatedDBObject(pCircle, true);
                        }
                    }


                }
                Circle circle = new Circle(pt, Vector3d.ZAxis, 2);
                pBlockTableRecord.AppendEntity(circle);
                tran.AddNewlyCreatedDBObject(circle, true);


                pBlockTableRecord.AppendEntity(line1);
                tran.AddNewlyCreatedDBObject(line1, true);
                tran.Commit();
            }
            return crossCount % 2;


        }








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值