找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 152|回复: 0

[每日一码] ARX射线法判断点是否在多边形内

[复制链接]

1

主题

0

回帖

33

积分

管理员

积分
33
发表于 2024-3-14 20:44:05 | 显示全部楼层 |阅读模式
  1. //*************************************************************
  2. //利用射线法判断一点是否在窗口内,如果在内部返回1,否则返回0
  3. //其中输入参数pt是被判断点,boundarypt是辅助边界点,用于作射线用
  4. //*********************1-14-2001 by Meishuli
  5. int inwindow(ads采用point pt,ads采用point boundarypt,ads采用name windowent)
  6. {
  7.   ads采用name ent0;
  8.   int rt;
  9.   AcDbEntity *pent,*pwindowent;
  10.     AcDbObjectId pentId,pwindowentId;
  11.   AcGePoint3dArray points;
  12.   int CrossPtsNum;
  13.   AcGePoint3d Pts,BoundaryPts;
  14.   AcDbObjectId auxlineId;
  15.     Acad::ErrorStatus es;
  16.   Pts.set(pt[X],pt[Y],0);
  17.   BoundaryPts.set(boundarypt[X],boundarypt[Y],0);
  18.   auxlineId=createLine(Pts,BoundaryPts);
  19.   acdbEntLast(ent0);
  20.   pwindowent=selectEntity(pwindowentId,windowent,AcDb::kForRead);
  21.   pent=selectEntity(pentId,ent0,AcDb::kForRead);
  22.   es=pwindowent->intersectWith(pent,AcDb::kOnBothOperands,points,0,0);
  23.     if (es == Acad::eOk) {
  24.       CrossPtsNum=points.length(); //计算交点的数量CrossPtsNum
  25.         points.setLogicalLength(0);
  26.   }
  27.   else {
  28.         acutPrintf("\nerror!--inwindow()\n");
  29.       pent->close();
  30.     acdbEntDel(ent0);
  31.       pwindowent->close();
  32.     return -1;
  33.   }
  34.   pent->close();
  35.   acdbEntDel(ent0);
  36.   pwindowent->close();
  37.   if(CrossPtsNum % 2 == 0)
  38.      rt = 0;
  39.   else rt = 1;
  40.   return rt;
  41. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-29 20:53 , Processed in 0.117200 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表