找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1305|回复: 2

[每日一码] 通过两点的直线有部分在指定的多边形区域内,得到该区域

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-9-18 15:44:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. double lengthThroughRegion(CAD_POINT* VertexPt,int VertexNum,
  2.                            CAD_POINT Pt1,CAD_POINT Pt2)                           
  3. {
  4.     double length = 0;
  5.     if (Pt1.distanceTo(Pt2) < 1e-6)
  6.     {
  7.         return length;
  8.     }
  9.     //避免与边线重合计算不准,将输入直线偏移
  10.     //偏移值参照生成节线时,提高值1e-4
  11.     Pt1.y -= 5e-5;
  12.     Pt2.y -= 5e-5;

  13.     //////////////////////////////////////////////////////////////////////////
  14.     //普通情况
  15.     int CrossNum=0;
  16.     CAD_POINT CrossPt[10];
  17.     CAD_POINT CPt;

  18.     ads_point adsPt;   
  19.     //得到总的交点数
  20.     int i; for( i=0;i<VertexNum;i++)
  21.     {
  22.         if(i==VertexNum-1)
  23.         {
  24.             //if(GetCrossPoint(Pt1,Pt2,VertexPt,VertexPt[0],CPt))
  25.             if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt), asDblArray(VertexPt[0]), 1,adsPt) == RTNORM)
  26.             {
  27.                 CPt.set(adsPt[0],adsPt[1],adsPt[2]);
  28.                 //因为加减了1e-6
  29.                 //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt,VertexPt[0],CPt))
  30.                 {
  31.                     CrossPt[CrossNum]=CPt;
  32.                     CrossNum=CrossNum+1;
  33.                 }
  34.             }
  35.         }
  36.         else
  37.         {
  38.             //if(GetCrossPoint(Pt1,Pt2,VertexPt,VertexPt[i+1],CPt))
  39.             if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt), asDblArray(VertexPt[i+1]), 1,adsPt) == RTNORM)
  40.             {
  41.                 CPt.set(adsPt[0],adsPt[1],adsPt[2]);
  42.                 //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt,VertexPt[i+1],CPt))
  43.                 {
  44.                     CrossPt[CrossNum]=CPt;
  45.                     CrossNum=CrossNum+1;
  46.                 }
  47.             }
  48.         }
  49.     }

  50.     AcGePoint3dArray interArray;
  51.     for (i = 0; i < CrossNum; i ++)//得到所有相异交点
  52.     {
  53.         BOOL bAdd = TRUE;
  54.         for (int k = 0; k < interArray.length(); k ++)
  55.         {
  56.             if (interArray[k].distanceTo(CrossPt) < 1e-6)
  57.             {
  58.                 bAdd = FALSE;
  59.             }
  60.         }
  61.         if (bAdd)
  62.         {
  63.             interArray.append(CrossPt);
  64.         }
  65.     }




  66.     AcGePoint3dArray vertArray;
  67.     for (i = 0; i < VertexNum; i ++)
  68.     {
  69.         vertArray.append(VertexPt);
  70.     }
  71.     vertArray.append(VertexPt[0]);
  72.     //////////////////////////////////////////////////////////////////////////
  73.     for (i = 0; i < interArray.length()-1; i ++)
  74.     {
  75.         AcGePoint3d temp;
  76.         temp.y = interArray.y;
  77.         temp.x = (interArray.x + interArray[i+1].x)/2;
  78.         //if (IsAtLines(VertexPt, VertexNum, temp) != 1)
  79.         if (PointIsInPolygon(temp, vertArray) == 1)
  80.         {
  81.             length += interArray.distanceTo(interArray[i+1]);
  82.         }
  83.     }

  84.     if (length < 1e-6)
  85.     {
  86.         CrossNum = 0;
  87.         Pt1.y -= 2e-6;
  88.         Pt2.y -= 2e-6;

  89.         //////////////////////////////////////////////////////////////////////////
  90.         //得到总的交点数
  91.         int i; for( i=0;i<VertexNum;i++)
  92.         {
  93.             if(i==VertexNum-1)
  94.             {
  95.                 //if(GetCrossPoint(Pt1,Pt2,VertexPt,VertexPt[0],CPt))
  96.                 if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt), asDblArray(VertexPt[0]), 1,adsPt) == RTNORM)
  97.                 {
  98.                     //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt,VertexPt[0],CPt))
  99.                     {
  100.                         CrossPt[CrossNum]=CPt;
  101.                         CrossNum=CrossNum+1;
  102.                     }
  103.                 }
  104.             }
  105.             else
  106.             {
  107.                 //if(GetCrossPoint(Pt1,Pt2,VertexPt,VertexPt[i+1],CPt))
  108.                 if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt), asDblArray(VertexPt[i+1]), 1,adsPt) == RTNORM)
  109.                 {
  110.                     //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt,VertexPt[i+1],CPt))
  111.                     {
  112.                         CrossPt[CrossNum]=CPt;
  113.                         CrossNum=CrossNum+1;
  114.                     }
  115.                 }
  116.             }
  117.         }

  118.         AcGePoint3dArray interArray;
  119.         for (i = 0; i < CrossNum; i ++)//得到所有相异交点
  120.         {
  121.             BOOL bAdd = TRUE;
  122.             for (int k = 0; k < interArray.length(); k ++)
  123.             {
  124.                 if (interArray[k].distanceTo(CrossPt) < 1e-6)
  125.                 {
  126.                     bAdd = FALSE;
  127.                 }
  128.             }
  129.             if (bAdd)
  130.             {
  131.                 interArray.append(CrossPt);
  132.             }
  133.         }





  134.         //////////////////////////////////////////////////////////////////////////
  135.         for (i = 0; i < interArray.length()-1; i ++)
  136.         {
  137.             AcGePoint3d temp;
  138.             temp.y = interArray.y;
  139.             temp.x = (interArray.x + interArray[i+1].x)/2;

  140.             if (PointIsInPolygon(temp, vertArray) == 1)
  141.             {
  142.                 length += interArray.distanceTo(interArray[i+1]);
  143.             }
  144.         }
  145.     }  
  146.     return length;
  147. }


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 112个

财富等级: 日进斗金

发表于 2016-9-18 20:52:57 | 显示全部楼层
建议把使用场景也描述一下,最好做个动画来说明
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2016-9-19 07:57:51 | 显示全部楼层
最好做个动画来说明
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-26 07:44 , Processed in 0.207922 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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