明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3447|回复: 7

无聊,出来求助下,各位高手请解答下在下的问题吧

[复制链接]
发表于 2012-4-8 08:43:24 | 显示全部楼层 |阅读模式
本帖最后由 邹锋 于 2012-4-8 08:45 编辑

在下在写一个LISP程序时遇到个问题,就是在多线段中,已知圆弧两点坐标与凸度值,求出这个圆弧的半径与圆心坐标,要用LISP代码写,求代码,,



以下是我在网络上搜索的用C语言写 的
  1. (1)AutoCAD中约定:凸度为0是直线顶点,它与下一个顶点连接为一直线;凸度不为0是圆弧顶点,它与下一个顶点连接为一圆弧;凸度值为负表示顺时针圆弧,凸度值为正表示逆时针圆弧;凸度绝对值小于1表示圆弧包角小于180°,凸度绝对值大于1表示圆弧包角大于180°。凸度与圆弧包角的关系是:圆弧包角= 4×arctan|凸度值|。 void lwpolylineToArc(CPoint3d BeginPoint,CPoint3d EndPoint,double u,CPoint3d &CenterPoint)
  2.   {
  3.         double centerAngle;//包角
  4.         centerAngle=4*atan(abs(u));
  5.         centerAngel=centerAngel/pi;

  6.         double x1,x2,y1,y2;//圆弧起始点和终止点
  7.        x1=BeginPoint.x;
  8.       x2=EndPoint.x;
  9.       y1=BeginPoint.y;
  10.       y2=EndPoint.y;

  11.      double L; //弦长
  12.      L=sqrt(pow((x1-x2),2)+pow((y1-y2),2));
  13.   
  14.         double R;//圆弧半径
  15.         R=0.5*L/sin(0.5*centerAngle);

  16.         //已知圆上两点和半径,求圆心坐标
  17.         double h;//圆心到弦的距离
  18.         h=sqrt(R*R-L*L/4);

  19.         double k;//起始点和终止点连线的中垂线斜率
  20.         double xc,yc;//圆心坐标
  21.         double xa,ya; //起始点和终止点连线的中点横纵坐标
  22.         xa=0.5*(x1+x2);
  23.         ya=0.5*(y1+y2);

  24.         //弦的方向角(0-2PI之)

  25.          double angle;//起点到终点的弦向量与x正方向之间的倾斜角
  26.          angle=acos((x2-x1)/sqrt(pow(x2-x1,2)+pow(y2-y1,2)));

  27.          double amass; //弦向量与X轴正向单位向量的叉积
  28.          amass = y1-y2;//由(由(x2-x1)*0-1*(y2-y1))得到
  29.          
  30.          if (amass<0)
  31.          {  angle=-angle;
  32.           angle=2*PI+angle;
  33.         }
  34.       
  35.    
  36.         
  37.       double DirectionAngel;//弦中点到圆心的直线向量的方向角(0-2PI之间)
  38.       if ((u>0 && centerAngle<PI)||(u<0 && centerAngle>PI))
  39.       DirectionAngel=angle+PI/2;
  40.       if((u<0 && centerAngle<PI)||(u>0 && centerAngle>PI))
  41.       DirectionAngel=angle-PI/2;
  42.       if (DirectionAngel>2*PI)
  43.        DirectionAngel= DirectionAngel-2*PI;

  44.        double d;//圆心到弦的距离
  45.       d=sqrt(R*R-L*L/4);
  46.       if (DirectionAngle=0)
  47.      {
  48.       xc=xa+d;
  49.       yc=ya;
  50.     }
  51.      else if(DirectionAngle=PI/2)
  52.    {
  53.      xc=xa;
  54.      yc=ya+d;
  55.    }
  56.    else if (DirectionAngle=PI)
  57.    {
  58.     xc=xa-d;
  59.     yc=xa;
  60.    }
  61.    else if (DirectionAngle=PI+PI/2)
  62.    {
  63.     xc=xa;
  64.     yc=xa-d;
  65.    }
  66.    else
  67.    {
  68.     double nslope,k;//nslope 为弦的斜率,K为弦中垂线的斜率
  69.     double nAngle;//中垂线的倾斜角;
  70.     double X,Y; //圆心相对于弦中心点的坐标偏移量
  71.    
  72.     nslope = (y2 - y1) / (x2-x1);
  73.     k = -1 / nslope;
  74.        nAngle = atan(k) ;
  75.        X = cos(nAngle) * d;
  76.        Y = sin(nAngle) * d;

  77.        if (DirectionAngle > PI / 2 && DirectionAngle < PI )
  78.     {X = -X;
  79.         Y = -Y;
  80.     }
  81.        if (DirectionAngle > PI && DirectionAngle < (PI + PI / 2) )
  82.     {
  83.           X = -X;
  84.           Y = -Y;
  85.     }

  86.        xc=xa + X;
  87.        yc=ya+ Y;

  88.       CenterPoint.x=xc;
  89.       CenterPoint.y=yc;
  90.       CenterPoint.z=0.0;
复制代码

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-4-8 08:56:41 | 显示全部楼层
发表于 2012-4-8 09:21:42 | 显示全部楼层
本帖最后由 nzl1116 于 2012-4-8 09:23 编辑

(setq Ang (* (atan tudu) 2.0)
        Dist  (* (distance Pnt1 Pnt2) 0.5)
        R     (/ Dist (sin Ang))
        D1   (vlax-curve-getDistAtPoint curve Pnt1)
        D2   (vlax-curve-getDistAtPoint curve Pnt2)
        D3   (* (+ D1 D2) 0.5)
        Pnt3 (vlax-curve-getPointAtDist curve D3)
        Mid  (polar Pnt1 (angle Pnt1 Pnt2) Dist)
        Cen (polar Pnt3 (angle Pnt3 Mid) R)
)

点评

谢了  发表于 2012-4-8 09:39
 楼主| 发表于 2012-4-8 20:42:13 | 显示全部楼层
nzl1116 发表于 2012-4-8 09:21
(setq Ang (* (atan tudu) 2.0)
        Dist  (* (distance Pnt1 Pnt2) 0.5)
        R     (/ Dist (si ...

(defun c:test()
  (setq pnt1(getpoint))
  (setq pnt2(getpoint))
  (setq tudu -0.414214);;画个4分之1圆
(setq Ang (* (atan tudu) 2.0)
      Dist  (* (distance Pnt1 Pnt2) 0.5)
      R     (/ Dist (sin Ang))
      D1   (vlax-curve-getDistAtPoint curve Pnt1)
      D2   (vlax-curve-getDistAtPoint curve Pnt2)
      D3   (* (+ D1 D2) 0.5)
      Pnt3 (vlax-curve-getPointAtDist curve D3)
      Mid  (polar Pnt1 (angle Pnt1 Pnt2) Dist)
      Cen (polar Pnt3 (angle Pnt3 Mid) R)
)
  (prin1 cen))

无效!!!
发表于 2012-4-8 20:56:42 | 显示全部楼层
  1. ;;参数 pt = 圆弧起点 np = 圆弧终点 gx = 弓弦比
  2. ;;返回表 '(圆心 半径)
  3. (defun get_Center_radius (pt np gx / pa bj xc gg rr cp mdp)
  4.     (setq pa (angle pt np)
  5.           bj (* (atan (abs gx)) 4)
  6.           xc (* 0.5 (distance pt np))
  7.            gg (* gx xc)
  8.           )
  9.     (if (/= 0.0 gg)
  10.       (progn
  11.         (setq  rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg)))
  12.           
  13.     (setq cp (polar pt pa xc)
  14.           mdp cp
  15.           cp (polar cp (+ pa pi2) (- rr gg))
  16.           )
  17.     (list cp rr)
  18.         )
  19.       (list pt 0.0)
  20.       )
  21.     )

点评

非常感谢GU版,我弄好了这部分,,,,,下部份就是扭转多线段方向按我选择的方向,思路是:求出点列表,然后指定新的多线段顶点,重新组合排序列表,然后更新图元!这方法可行吗  发表于 2012-4-8 22:51
发表于 2012-4-9 08:28:35 | 显示全部楼层
邹锋 发表于 2012-4-8 20:42
(defun c:test()
  (setq pnt1(getpoint))
  (setq pnt2(getpoint))

其中的变量curve指的是多段线
 楼主| 发表于 2012-4-9 08:33:57 | 显示全部楼层
nzl1116 发表于 2012-4-9 08:28
其中的变量curve指的是多段线

谢谢了,我昨晚想到了,还要选择多线段再转对象类型就是curve了

点评

对象类型不用转换,vlax-curve-*系列函数对ename和vla对象都通用的  发表于 2012-4-9 08:41
发表于 2012-4-9 11:13:33 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-24 07:10 , Processed in 0.206242 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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