找回密码
 立即注册

QQ登录

只需一步,快速开始

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

输入三点,以中间点为顶点,把旁边两条线做圆角,半径用户输入

[复制链接]

1

主题

0

回帖

43

积分

管理员

积分
43
发表于 2024-3-14 20:36:37 | 显示全部楼层 |阅读模式
  1. 输入三点,以中间点为顶点,把旁边两条线做圆角,半径用户输入
  2. static void TESTcomplexentcmd()  
  3. {  
  4.         ads采用point pt1;  
  5.         ads采用point pt2;  
  6.         ads采用point pt3;  
  7.         ads采用real r;  
  8.         if (acedGetPoint(NULL,采用T("\n输入第一点"),pt1) != RTNORM)  
  9.         {  
  10.                 return;  
  11.         }  
  12.         if (acedGetPoint(NULL,采用T("\n输入第二点"),pt2) != RTNORM)  
  13.         {  
  14.                 return;  
  15.         }  
  16.         if (acedGetPoint(NULL,采用T("\n输入第三点"),pt3) != RTNORM)  
  17.         {  
  18.                 return;  
  19.         }  
  20.         if (acedGetReal(采用T("\n输入内切圆半径"),&r) != RTNORM)  
  21.         {  
  22.                 return;  
  23.         }  
  24.         ////坐标维度转化  
  25.         AcGePoint3d pt3d1 = asPnt3d(pt1);  
  26.         AcGePoint3d pt3d2 = asPnt3d(pt2);  
  27.         AcGePoint3d pt3d3 = asPnt3d(pt3);  
  28.         ////构造两条直线计算顶点到切点的距离  
  29.         AcDbLine line1(pt3d2,pt3d1);  
  30.         AcDbLine line2(pt3d2,pt3d3);  
  31.         ////得到以PT2为顶点的两个向量  
  32.         AcGeVector3d v1(pt1[X]-pt2[X],pt1[Y]-pt2[Y],pt1[Z] - pt2[Z]);  
  33.         AcGeVector3d v2(pt3[X]-pt2[X],pt3[Y] - pt2[Y],pt3[Z] - pt2[Z]);  
  34.         AcGeVector3d v3(0,0,1);  
  35.         double PI = 3.1415926536;  
  36.         ////计算两个向量的夹角  
  37.         double angle = v1.angleTo(v2,v3);  
  38.         double angle1 = angle > PI ? 2 * PI - angle : angle;  
  39.         ////计算切点到顶点距离  
  40.         double dist = r / tan(angle1 / 2);  
  41.         ////切点1  
  42.         AcGePoint3d ptQ1;  
  43.         ////切点2  
  44.         AcGePoint3d ptQ2;  
  45.         ////找到切点  
  46.         line1.getPointAtDist(dist,ptQ1);  
  47.         line2.getPointAtDist(dist,ptQ2);  
  48.         ////求出bulge值(是圆心角1/4的正切值 - - ,之前当成正切值的四分之一了 - -!!!)  
  49.         double bulge;  
  50.         bulge = tan((PI - angle1) / 4);  
  51.         if(angle > 0 && angle <= PI)  
  52.         {  
  53.                 bulge = - bulge;  
  54.         }  
  55.         AcDbPolyline* pl = new AcDbPolyline();  
  56.         AcGePoint2d pt2d1(pt3d1[X],pt3d1[Y]);  
  57.         AcGePoint2d pt2dq1(ptQ1[X],ptQ1[Y]);  
  58.         AcGePoint2d pt2dq2(ptQ2[X],ptQ2[Y]);  
  59.         AcGePoint2d pt2d3(pt3d3[X],pt3d3[Y]);  
  60.         pl->addVertexAt(0,pt2d1,0);  
  61.         pl->addVertexAt(1,pt2dq1,bulge);  
  62.         pl->addVertexAt(2,pt2dq2,0);  
  63.         pl->addVertexAt(3,pt2d3,0);  
  64.         LoadEntity(pl);  
  65.         CString out;  
  66.         out.Format(采用T("\nangle:%.2f,bulge:%.2f,\ndist:%.2f\n,pt[z]:%.2f,%.2f,%.2f"),angle,bulge,dist,pt1[Z],pt2[Z],pt3[Z]);  
  67.         acutPrintf(out);  
  68. }  
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-10 21:11 , Processed in 0.091366 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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