找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: newer

[研讨] 画出如图的蛇形LINE图形

[复制链接]

已领礼包: 1865个

财富等级: 堆金积玉

发表于 2016-10-24 13:52:30 | 显示全部楼层

此题只是求相关点坐标问题就能解决,用递归方法反而复杂了。递归的思路如下:1、初始值f(pt,0)=(pt3 pt2 pt1)
2、f(pt ,k)=F(f(polar pt (/ pi 2),(- k 1)  )),其中F运算为根据上一次运算的结果进行对称、平移运算得出此次三点(pt3'   pt2'   pt1')
3、(setq i 0 ptlst nil )(while (< i n )  (setq ptlst (cons (f pt i) ptlst))   (setq i (+ i 1)))
4、对点集(reverse   ptlst)画多段线   
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1865个

财富等级: 堆金积玉

发表于 2016-10-28 14:46:47 | 显示全部楼层
(defun c:tt ()
  (defun disfun (ptc r n k)
    (setq h (/ (* 2.0 r) n))
    (setq dd (- (sqrt (- (* r r) (* (- r (* (+ k 1) h)) (- r (* (+ k 1) h)))))
                (sqrt (- (* r r) (* (- r (* k h)) (- r (* k h)))))
             )
    )
  )
  (defun f (ptc r n d k)
    (if (= k 0)
      (setq ptlst (list (list (+ (car ptc) (disfun ptc r n 0)) (+
                                                                  (cadr ptc)
                                                                  r
                                                                  (/ r -0.5
                                                                     n
                                                                  )
                                                               )
                        ) (list (+ (car ptc) (disfun ptc r n 0) d)
                                (+ (cadr ptc) r (/ r -1.0 n))
                          ) (list (+ (car ptc) (disfun ptc r n 0))
                                  (+ (cadr ptc) r)
                            )
                  )
      )
      (progn
        (setq ptlst (mapcar
                      '(lambda (x)
                         (list (+ (car x) (* (if (= (rem k 2) 0)
                                               1
                                               -1
                                             ) (if (and
                                                     (= (rem n 2) 0)
                                                     (= k (/ n 2))
                                                   )
                                                 0
                                                 (disfun ptc r n
                                                         (if (<= k
                                                                 (/ n 2)
                                                             )
                                                           k
                                                           (- k 1)
                                                         )
                                                 )
                                               )
                                          )
                               ) (- (cadr x) (/ r 0.5 n))
                         )
                       )
                      (mapcar
                        '(lambda (y)
                           (list (- (* 2 (car ptc)) (car y)) (cadr y))
                         )
                        (f ptc r n d (- k 1))
                      )
                    )
        )
      )
    )
  )
  (setq ptc (getpoint "\n圓心:")
        r (getreal "\n半徑:")
        n (getint "\n等分數:")
        d (getreal "\n尖角長度:")
  )
  (command "circle" ptc r)
  (setq i 0
        ptlist (list (polar ptc (* pi 0.75) (* r (sqrt 2))))
  )
  (while (< i n)
    (setq ptlist (append
                   (f ptc r n d i)
                   ptlist
                 )
    )
    (setq i (+ i 1))
  )
  (if (= (rem n 2) 0)
    (setq ptlist (cons (polar ptc (* pi -0.25) (* r (sqrt 2))) ptlist))
    (setq ptlist (cons (polar ptc (* pi 1.25) (* r (sqrt 2))) ptlist))
  )
  (entmake (append
             (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")
                   (cons 90 (length ptlist))
             )
             (mapcar
               '(lambda (pt)
                  (cons 10 pt)
                )
               ptlist
             )
           )
  )
)

评分

参与人数 1D豆 +50 贡献 +1 收起 理由
XDSoft + 50 + 1 有始有终奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-10-31 00:10:13 | 显示全部楼层
总觉得lisp括号看着头疼...
  1.         [CommandMethod("TTTT")]
  2.         public static void Test()
  3.         {

  4.             var doc = AcadApp.DocumentManager.MdiActiveDocument;
  5.             var ed = doc.Editor;
  6.             var db = doc.Database;
  7.             var resCenter = ed.GetPoint("\n请输入圆心:");
  8.             if (resCenter.Status != PromptStatus.OK) return;
  9.             var resRadius = ed.GetDouble("\n请输入半径:");
  10.             if (resRadius.Status != PromptStatus.OK) return;
  11.             var resNum = ed.GetInteger("\n请输入等分数:");
  12.             if (resNum.Status != PromptStatus.OK) return;
  13.             var resLen = ed.GetDouble("\n请输入尖角水平距离:");
  14.             if (resLen.Status != PromptStatus.OK) return;

  15.             var radius = resRadius.Value;
  16.             var diameter = radius * 2;
  17.             var num = resNum.Value;
  18.             var len = resLen.Value;

  19.             Polyline pline = new Polyline();
  20.             var x0 = -radius;
  21.             var y0 = radius;
  22.             var i = 0;
  23.             pline.AddVertexAt(i++, new Point2d(x0, y0), 0, 0, 0);
  24.             var setp = diameter / num;
  25.             var y = radius - setp;
  26.             var sign = 1;
  27.             while (y >= -radius)
  28.             {
  29.                 var x = sign * Math.Sqrt(radius * radius - y * y);
  30.                 x0 = y >= 0 ? x : -x0;
  31.                 pline.AddVertexAt(i++, new Point2d(x0, y0), 0, 0, 0);
  32.                 pline.AddVertexAt(i++, new Point2d(x0 + sign * len, y0 - setp / 2), 0, 0, 0);
  33.                 y0 -= setp;
  34.                 pline.AddVertexAt(i++, new Point2d(x0, y0), 0, 0, 0);
  35.                 if (y < 0) x0 = x;
  36.                 sign = -sign;
  37.                 y -= setp;
  38.             }
  39.             x0 = -radius * sign;
  40.             pline.AddVertexAt(i++, new Point2d(x0, y0), 0, 0, 0);

  41.             using (var tr = db.TransactionManager.StartTransaction())
  42.             {
  43.                 var center = resCenter.Value;
  44.                 var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  45.                 var cir = new Circle(center, Vector3d.ZAxis, radius);
  46.                 pline.TransformBy(Matrix3d.Displacement(center - Point3d.Origin));
  47.                 btr.AppendEntity(cir);
  48.                 tr.AddNewlyCreatedDBObject(cir, true);
  49.                 btr.AppendEntity(pline);
  50.                 tr.AddNewlyCreatedDBObject(pline, true);
  51.                 tr.Commit();
  52.             }
  53.         }

评分

参与人数 1D豆 +50 贡献 +1 收起 理由
XDSoft + 50 + 1

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1865个

财富等级: 堆金积玉

发表于 2016-10-31 07:26:22 | 显示全部楼层

武学的最高境界是如何将不起眼的落叶变成夺命利器!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-10-31 09:12:23 来自手机 | 显示全部楼层
更高境界是手中无剑 呵呵 开个玩笑 不用为语言的好坏争论 只有算法是精髓
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1865个

财富等级: 堆金积玉

发表于 2016-10-31 10:33:08 | 显示全部楼层

赞同!万变不离其宗!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-22 08:53 , Processed in 0.233369 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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