找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

0

主题

0

回帖

28

积分

管理员

积分
28
发表于 2024-3-14 19:32:06 | 显示全部楼层 |阅读模式
  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<i>,VertexPt[0],CPt))
  25.             if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), 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<i>,VertexPt[0],CPt))
  30.                 {
  31.                     CrossPt[CrossNum]=CPt;
  32.                     CrossNum=CrossNum+1;
  33.                 }
  34.             }
  35.         }
  36.         else
  37.         {
  38.             //if(GetCrossPoint(Pt1,Pt2,VertexPt<i>,VertexPt[i+1],CPt))
  39.             if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), 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<i>,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<i>) < 1e-6)
  57.             {
  58.                 bAdd = FALSE;
  59.             }
  60.         }
  61.         if (bAdd)
  62.         {
  63.             interArray.append(CrossPt<i>);
  64.         }
  65.     }
  66.     AcGePoint3dArray vertArray;
  67.     for (i = 0; i < VertexNum; i ++)
  68.     {
  69.         vertArray.append(VertexPt<i>);
  70.     }
  71.     vertArray.append(VertexPt[0]);
  72.     //////////////////////////////////////////////////////////////////////////
  73.     for (i = 0; i < interArray.length()-1; i ++)
  74.     {
  75.         AcGePoint3d temp;
  76.         temp.y = interArray<i>.y;
  77.         temp.x = (interArray<i>.x + interArray[i+1].x)/2;
  78.         //if (IsAtLines(VertexPt, VertexNum, temp) != 1)
  79.         if (PointIsInPolygon(temp, vertArray) == 1)
  80.         {
  81.             length += interArray<i>.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<i>,VertexPt[0],CPt))
  96.                 if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt[0]), 1,adsPt) == RTNORM)
  97.                 {
  98.                     //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,VertexPt[0],CPt))
  99.                     {
  100.                         CrossPt[CrossNum]=CPt;
  101.                         CrossNum=CrossNum+1;
  102.                     }
  103.                 }
  104.             }
  105.             else
  106.             {
  107.                 //if(GetCrossPoint(Pt1,Pt2,VertexPt<i>,VertexPt[i+1],CPt))
  108.                 if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt[i+1]), 1,adsPt) == RTNORM)
  109.                 {
  110.                     //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,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<i>) < 1e-6)
  125.                 {
  126.                     bAdd = FALSE;
  127.                 }
  128.             }
  129.             if (bAdd)
  130.             {
  131.                 interArray.append(CrossPt<i>);
  132.             }
  133.         }
  134.         //////////////////////////////////////////////////////////////////////////
  135.         for (i = 0; i < interArray.length()-1; i ++)
  136.         {
  137.             AcGePoint3d temp;
  138.             temp.y = interArray<i>.y;
  139.             temp.x = (interArray<i>.x + interArray[i+1].x)/2;
  140.             if (PointIsInPolygon(temp, vertArray) == 1)
  141.             {
  142.                 length += interArray<i>.distanceTo(interArray[i+1]);
  143.             }
  144.         }
  145.     }  
  146.     return length;
  147. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-29 05:19 , Processed in 0.135170 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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