天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 134|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 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. }
    复制代码

     

     

     

     

    [每日一码] 通过两点的直线有部分在指定的多边形区域内,得到该区域
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 13:30 , Processed in 0.165812 second(s), 26 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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