搜索
bottom↓
回复: 5

有懂lisp编程的吗?一个用C写的求圆心程序帮忙改写成用lisp

[复制链接]

出0入0汤圆

发表于 2018-5-10 16:03:21 | 显示全部楼层 |阅读模式
在写AtuoCAD插件  已知圆弧起点,终点,和凸度,求圆心的程序。原来用C写的,现在想改成lisp写。
  1. /********************************************************************   
  2.      file base:  main  
  3.      file ext:    cpp  
  4.      author:      scenic
  5.      purpose:     由起点和终点以及凸度求圆弧的圆心  
  6. *********************************************************************/  
  7. #include <stdio.h>  
  8. #include <stdlib.h>  
  9. #include <math.h>  
  10. #define PI 3.141593  
  11. #define RESOLUTION 0.000001  
  12. typedef struct point  
  13. {  
  14.      double x;  
  15.      double y;  
  16.      double z;  
  17. }Point,*PPoint;  
  18. typedef struct arc   
  19. {  
  20.      double sx;  
  21.      double sy;  
  22.      double sz;  
  23.      double ex;  
  24.      double ey;  
  25.      double ez;  
  26.      double r;  
  27.      double cx;  
  28.      double cy;  
  29.      double cz;  
  30.      double startangle;  
  31.      double endangle;  
  32. }ARC,*PARC;  
  33. int getArcR(Point startpoint ,Point endpoint ,double bulge,PARC parc);  //圆弧起始点和终止点 和凸度
  34. int getArcR(Point startpoint ,Point endpoint ,double bulge,PARC parc)  
  35. {     
  36.     double x1(0.0),y1(0.0),x2(0.0),y2(0.0),arcangle(0.0);//圆弧起始点和终止点, 以及所包的角度  
  37.     x1=startpoint.x;  
  38.     y1=startpoint.y;  
  39.     x2=endpoint.x;  
  40.     y2=endpoint.y;  
  41.     parc->sx=startpoint.x;  
  42.     parc->sy=startpoint.y;  
  43.     parc->sz=0.0;  
  44.     parc->ex=endpoint.x;  
  45.     parc->ey=endpoint.y;  
  46.     parc->ez=0.0;  
  47.     arcangle=4*atan(fabs(bulge));     //弧包含的弧度  
  48.     printf("arcangle= %f \n",arcangle*180/PI);  
  49.     if((-RESOLUTION<arcangle)&&(arcangle<RESOLUTION))  
  50.     {  
  51.         printf("LINE (x1= %f,y1=%f) (x2=%f,y2=%f) \n",x1,y1,x2,y2);  
  52.         return 1;  
  53.     }  
  54.     double chordlength;       //弦长  
  55.     chordlength=sqrt(pow((x1-x2),2)+pow((y1-y2),2));  
  56.     double  radius;           //圆弧半径  
  57.     radius=(0.5*chordlength)/(sin(0.5*arcangle));  
  58.     printf("r= %f\n",radius);  
  59.     if((-RESOLUTION<(radius))&&((radius)<RESOLUTION))  
  60.     {  
  61.         printf("startpoint can't be same as endpoint \n");  
  62.         return 1;  
  63.     }  
  64.     //--------------已知圆上两点和半径,求圆心坐标--------------------  
  65.     double verticalinterval;//圆心到弦垂距  
  66.     verticalinterval=sqrt( radius* radius-chordlength*chordlength/4);  
  67.     double cx,cy;//圆心坐标  
  68.     double midx,midy; //起始点和终止点连线的中点横纵坐标  
  69.     midx=0.5*(x1+x2);  
  70.     midy=0.5*(y1+y2);  
  71.     if((-RESOLUTION<(bulge-1))&&((bulge-1)<RESOLUTION))  
  72.     {  
  73.          printf("arc: (x=%f y=%f r=%f ) \n",midx,midy, radius);  
  74.          parc->cx=midx;  
  75.          parc->cy=midy;  
  76.          parc->cz=0.0;  
  77.          parc->r=radius;  
  78.          printf("x=%lf,y=%lf,z=%lf r=%f\n",parc->cx,parc->cy,parc->cz,parc->r);  
  79.          return 1;  
  80.      }  
  81.     //printf("mid=%f   mid=%f \n",midx,midy);  
  82. //--------------------------------------------------------------------  
  83.     //弦矢量的方向角(0-2PI之)  
  84.     double chordangle=0;//起点到终点的弦向量与x正方向之间的倾斜角  
  85.     chordangle=acos((x2-x1)/sqrt(pow(x2-x1,2)+pow(y2-y1,2)));  
  86.     printf("chordangle =%f \n",chordangle);  
  87.     double amass; //弦向量与X轴正向单位向量的叉积= (y2-y1)k  
  88.     amass = y2-y1;//由(由(x2-x1)*0-1*(y2-y1))得到  
  89.     if (amass<0)  
  90.      {     
  91.          chordangle=2*PI-chordangle;  
  92.          //printf("here \n");  
  93.      }  
  94.     printf("chordangle =%f \n",chordangle*180/PI);  
  95. //---------------------------------------------------------------  
  96.     double DirectionAngle=0.0;//弦中点到圆心的直线向量的方向角(0-2PI之间)  
  97.     if ((bulge>0 && arcangle<PI)||(bulge<0 && arcangle>PI))  
  98.      {  
  99.          DirectionAngle=chordangle+PI/2;  
  100.      }  
  101.     if((bulge<0 && arcangle<PI)||(bulge>0 && arcangle>PI))  
  102.      {  
  103.          DirectionAngle=chordangle-PI/2;  
  104.      }  
  105.     if(DirectionAngle<0)  
  106.     {  
  107.          DirectionAngle=DirectionAngle+2*PI;  
  108.     }  
  109.     if (DirectionAngle>2*PI)  
  110.      {  
  111.          DirectionAngle= DirectionAngle-2*PI;  
  112.      }  
  113. //---------------------------------------------------------------  
  114.     double d;//圆心到弦的距离  
  115.     d=sqrt( radius* radius-chordlength*chordlength/4);  
  116.     printf("DirectionAngle=%f,chordangle=%f  \n",DirectionAngle*180/PI,chordangle*180/PI);  
  117.     if((-RESOLUTION<(DirectionAngle-0))&&((DirectionAngle-0)<RESOLUTION))  
  118.      {  
  119.          cx=midx+d;  
  120.          cy=midy;  
  121.          printf("1:cx=%f cy=%f  \n ",cx,cy);  
  122.      }  
  123.     else  
  124. if((-RESOLUTION<(DirectionAngle-PI/2))&&((DirectionAngle-PI/2)<RESOLUTION))  
  125.      {  
  126.          cx=midx;  
  127.          cy=midy+d;  
  128.          printf("2:cx=%f cy=%f  \n ",cx,cy);  
  129.      }  
  130.     else  
  131. if((-RESOLUTION<(DirectionAngle-PI))&&((DirectionAngle-PI)<RESOLUTION))  
  132.      {  
  133.          cx=midx-d;  
  134.          cy=midy;  
  135.          printf("3:cx=%f cy=%f  \n ",cx,cy);  
  136.      }  
  137.     else  
  138. if((-RESOLUTION<(DirectionAngle-3*PI/2))&&((DirectionAngle-3*PI/2)<RESOLUTION))  
  139.      {  
  140.          cx=midx;  
  141.          cy=midy-d;  
  142.          printf("4:cx=%f cy=%f \n ",cx,cy);  
  143.      }  
  144.     else  
  145.   {  
  146.     double nslope,k;//nslope 为弦的斜率,K为弦中垂线的斜率  
  147.     double nAngle;//中垂线的倾斜角;  
  148.     double X,Y; //圆心相对于弦中心点的坐标偏移量  
  149.     nslope = (y2 - y1) / (x2-x1);  
  150.     k = -1 / nslope;  
  151.     nAngle = atan(k) ;  
  152.     X = fabs(cos(nAngle) * d);  
  153.     Y = fabs(sin(nAngle) * d);  
  154.     if (DirectionAngle > PI/2 && DirectionAngle < PI )  
  155.     {  
  156.         X = -X;  
  157.         Y = Y;  
  158.     }  
  159.     if (DirectionAngle > PI && DirectionAngle < (PI+PI/2) )  
  160.     {  
  161.         X = -X;  
  162.         Y = -Y;  
  163.          
  164.     }  
  165.     if (DirectionAngle > (PI+PI/2)&& DirectionAngle <2*PI)  
  166.     {  
  167.         X = X;  
  168.         Y = -Y;  
  169.          
  170.     }  
  171.    
  172.     cx=midx + X;  
  173.     cy=midy + Y;  
  174.     printf("cx=%f cy=%f  \n ",cx,cy);  
  175.   }  
  176.     parc->cx=cx;  
  177.     parc->cy=cy;  
  178.     parc->cz=0.0;  
  179.     parc->r=radius;  
  180.     printf("x=%lf,y=%lf,z=%lf r=%f \n",parc->cx,parc->cy,parc->cz,parc->r);  
  181.          return 1;  
  182. }  
  183. int getArcAngle(PARC parc)//取得圆弧角度  
  184. {  
  185.     double sx(0.0),sy(0.0),ex(0.0),ey(0.0),cx(0.0),cy(0.0),r(0.0);//arc 的起点终 点圆心的坐标  
  186.     double startangle(0.0),endangle(0.0);  
  187.      sx=parc->sx;  
  188.      sy=parc->sy;  
  189.     ex=parc->ex;  
  190.     ey=parc->ey;  
  191.     cx=parc->cx;  
  192.     cy=parc->cy;  
  193.      r=parc->r;  
  194.     //  
  195.     double num1(0.0),num2(0.0);//x方向矢量和圆心到弧线起点和终点的矢量的叉乘的z 分量  
  196.      startangle=acos((sx-cx)/r);  
  197.      num1=sy-cy;  
  198.      if(num1<0)  
  199.      {  
  200.          startangle=2*PI-startangle;  
  201.      }  
  202.      printf("startangle =%f \n",startangle*180/PI);  
  203.     endangle=acos((ex-cx)/r);  
  204.      num2=ey-cy;  
  205.      if(num2<0)  
  206.      {  
  207.          endangle=2*PI-endangle;  
  208.      }  
  209.      printf("endangle =%f \n",endangle*180/PI);  
  210.      return 0;  
  211. }  
  212. int main()  
  213. {  
  214.     Point startpoint={119.523,6.29683,0.0} ;  
  215.     Point endpoint={92.3448,16.3001,0.0} ;  
  216.     double bulge=-0.607501;  
  217.     ARC arc1;//={};  
  218.     getArcR(startpoint ,endpoint ,bulge,&arc1);  
  219.     getArcAngle(&arc1);  
  220.     getchar();  
  221.     return 0;  
  222. }  
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2018-5-10 21:22:57 | 显示全部楼层
自已网上找到一个,测试过可用
  1. ;;参数 pt = 圆弧起点 np = 圆弧终点 gx = 弓弦比
  2. ;;返回表 '(圆心 半径)
  3. (defun get_Center (pt np gx / pa bj xc gg rr cp mdp)
  4.   (setq        pa (angle pt np)                ;以弧度为单位返回两点之间连线与当ucs下x轴之间的夹角
  5.         bj (* (atan (abs gx)) 4)        ;反正切值
  6.         xc (* 0.5 (distance pt np))        ;1/2两点间距离
  7.         gg (* gx xc)
  8.   )
  9.   (if (/= 0.0 gg)
  10.     (progn                                ;
  11.       (setq rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg)))

  12.       (setq cp (polar pt pa xc)                ;求点的指定角度,指定距离的点

  13.             cp (polar cp (+ pa (/ pi 2)) (- rr gg))
  14.       )
  15.       (list cp rr)                        ;组成一个表
  16.     )
  17.     (list pt 0.0)
  18.   )
  19. )
复制代码

出0入0汤圆

发表于 2018-11-21 11:50:44 | 显示全部楼层
gmajvfhpa 发表于 2018-5-10 21:22
自已网上找到一个,测试过可用

虽然看不懂,但还是觉得很厉害~~~今天突然看见公众号上推得lisp

出0入4汤圆

发表于 2018-11-21 12:25:20 | 显示全部楼层
AutoCAD 可以用 C 做扩展吗?(以前不知道)只知道可以用 VB 和 lisp. 以前也学过一些 AutoCAD 的 Lisp

出0入0汤圆

发表于 2018-11-21 13:10:03 来自手机 | 显示全部楼层
lisp用来做坐标变换是真的方便

出0入0汤圆

发表于 2018-11-21 13:10:21 来自手机 | 显示全部楼层
另外lisp语言本身不难,楼主可以自学
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 13:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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