mice 发表于 2010-6-24 14:37

作图03,求a=2b

直线分段方式,a=a=2b

wangjial 发表于 2010-6-24 14:41

呵呵,小学生的计算题也来了。

hutb2008 发表于 2010-6-26 09:00

眼睛数花了。。。

晨怊 发表于 2010-6-26 17:58

不是很明白楼主的意思,如果是要画出那个图的话,先画出一个其它的用阵列就可以啦。

xyzyshl 发表于 2010-6-27 17:14

按要求做出,然后缩放到3500即可吧,那个花纹倒是个难题。

mice 发表于 2010-6-27 17:32

原意是这样的

主要是求画栏杆的间距,间距是A、B两种,A=2B,由14*14的方钢分隔,A+A+B相接,A一般不超过130,长度不一定是3500,可以是任何长度,到最后能尽分(即是没有余数),这是在设计围栏工作中经常遇到的,花形不用理会

mice 发表于 2010-6-27 17:36

还有

不论总长度如何,分出多小间隔,A的距离=B的距离*2,14*14的方钢尺寸是不能改变的

manbuzhe 发表于 2010-6-28 08:26

原帖由 mice 于 2010-6-24 14:37 发表 http://www.askcad.com/bbs/images/common/back.gif
直线分段方式,a=a=2b


距离长度+14(方钢尺寸),54等份(A距离)即可。

mice 发表于 2010-6-30 11:31

要这样的

原帖由 manbuzhe 于 2010-6-28 08:26 发表 http://www.askcad.com/bbs/images/common/back.gif

距离长度+14(方钢尺寸),54等份(A距离)即可。

头尾是A距离,:)

线角圆 发表于 2010-6-30 21:57

如果只满足a=2b的话,这题多解。

woaishuijia 发表于 2010-7-1 08:49


(defun c:lg (/ basepoint len high width amax n a nmax oldosmode)
;;设置栏杆高度和方钢宽度默认值
(if (not lg_high)
    (setq lg_high 500
          lg_width 14
    )
)
;;指定图形插入点
;;不接受空回车
(initget 1)
(setq basepoint (getpoint "\n指定插入点:"))
;;指定栏杆长度和栏杆高度和(或)方钢宽度
;;当用户指定的栏杆长度小于方钢宽度时图形无解,需要重新指定
;;用关键字指定栏杆高度和(或)方钢宽度后
;;需要重复运行指定栏杆长度的代码段
(while (not len)
    ;;检查是否存在上次指定的栏杆长度,如存在则做为本次的默认值
    (if        lg_length
      ;;存在默认值
      (progn
        ;;指定栏杆长度接受空回车,不接受0和负数;可输入关键字"H"和"W"
        (initget 6 "h w")
        (setq len (getdist basepoint
                           (strcat "\n指定长度[高度(H)/方钢宽度(W)]<"
                                   (rtos lg_length 2)
                                   ">:"
                           )
                  )
        )
        ;;空回车时栏杆长度使用默认值
        (if (not len)
          (setq len lg_length)
        )
      )
      ;;不存在默认值
      (progn
        ;;指定栏杆长度不接受空回车,0和负数;可输入关键字"H"和"W"
        (initget 7 "h w")
        (setq
          len (getdist basepoint "\n指定长度[高度(H)/方钢宽度(W)]:")
        )
      )
    )
    ;;检查用户输入的是长度值还是关键字
    (if        (numberp len)
      ;;输入的是长度值
      (if (< len lg_width)
        ;;当长度值小于方钢宽度时清空输入值重新指定
        (progn
          (prompt (strcat "\n指定的长度不能小于" (rtos lg_width 2)))
          (setq len nil)
        )
      )
      ;;输入的是关键字
      (progn
        ;;用已存在的高度值和方钢宽度值做为下一步输入的默认值
        ;;用户输入时接受空回车,不接受0和负数
        (initget 6)
        ;;检查用户输入的关键字是"H"还是"W"
        (if (= len "h")
          ;;用户输入的关键字是"H",指定高度
          (progn
          (setq high
                   (getdist basepoint
                          (strcat "\n指定高度<" (rtos lg_high 2) ">:")
                   )
          )
          ;;用户输入新的高度时修改默认值
          (if        high
              (setq lg_high high)
          )
          )
          ;;用户输入的关键字是"W",指定方钢宽度
          (progn
          (setq width
                   (getdist
                     basepoint
                     (strcat "\n指定方钢宽度<" (rtos lg_width 2) ">:")
                   )
          )
          ;;用户输入新的方钢宽度时修改默认值
          (if        width
              (setq lg_width width)
          )
          )
        )
        ;;清空变量,返回循环体的开始处重新由用户指定栏杆长度
        (setq len nil)
      )
    )
)
;;把用户指定的栏杆长度赋值给全局变量,以便用做下次输入的默认值
;;计算用户可以指定的花形数量的上限
;;用于下一步检查用户指定的花形数量是否合理
(setq        lg_length len
        nmax          (1+ (fix (/ (- len lg_width) (* lg_width 3))))
)
;;指定花形数量或A段最大长度
;;如用户指定的是花形数量,则按用户指定的花形数量画图
;;如用户指定的是A段最大长度
;;则在A段长度不超过用户指定值的前提下按最少的花形数量画图
;;用户指定的花形数量不允许超过前面计算的上限nmax,否则无解
;;用户指定的A段最大长度不允许小于方钢宽度的1.5倍,否则可能导致无解
(while (not n)
    ;;检查是否存在上次指定的花形数量,如存在则做为本次的默认值
    (if        lg_n
      ;;存在默认值
      (progn
        ;;指定花形数量接受空回车,不接受0和负数;可输入关键字"L"
        (initget 6 "l")
        (setq n        (getint        (strcat        "\n指定花形数量<"
                                (rtos lg_n 2)
                                ">:"
                        )
                )
        )
        ;;空回车时花形数量使用默认值
        (if (not n)
          (setq n lg_n)
        )
      )
      ;;不存在默认值
      (progn
        ;;指定花形数量不接受空回车,0和负数;可输入关键字"L"
        (initget 7 "l")
        (setq n (getint "\n指定花形数量:"))
      )
    )
    ;;检查用户输入的是花形数量值还是关键字
    (if        (numberp n)
      ;;输入的是花形数量值
      (if (> n nmax)
        ;;当花形数量值大于上限时清空输入值重新指定
        (progn
          (prompt (strcat "\n指定的花形数量不能大于" (rtos nmax 2)))
          (setq n nil)
        )
        ;;当用户指定的花形数量合理时存入全局变量
        ;;以便用做下次输入的默认值
        (setq lg_n n)
      )
      ;;用户输入的是关键字
      ;;指定A段最大长度
      (progn
        ;;用户指定的A段最大长度不允许小于方钢宽度的1.5倍
        ;;否则可能导致无解
        (while (not amax)
          ;;检查是否存在上次指定的A段最大长度,如存在则做为本次的默认值
          (if lg_amax
          ;;存在默认值
          (progn
              ;;用户输入时接受空回车,不接受0和负数
              (initget 6)
              (setq amax (getdist basepoint
                                  (strcat "\n指定A段最大长度<"
                                          (rtos lg_amax 2)
                                          ">:"
                                  )
                       )
              )
              ;;空回车时A段最大长度使用默认值
              (if (not amax)
                (setq amax lg_amax)
              )
          )
          ;;不存在默认值
          (progn
              ;;用户输入时不接受空回车,0和负数
              (initget 7)
              (setq
                amax (getdist basepoint (strcat "\n指定A段最大长度:"))
              )
          )
          )
          ;;当A段最大长度小于方钢宽度的1.5倍时清空输入值重新指定
          (if (< amax (* lg_width 1.5))
          (progn
              (prompt (strcat "\n指定的A段最大长度不能小于"
                              (rtos (* lg_width 1.5) 2)
                      )
              )
              (setq amax nil)
          )
          )
        )
        ;;把用户指定的A段最大长度存入全局变量,以便用做下次输入的默认值
        ;;计算最少的花形数量,当算得的结果为0或负数时,取花形数量为1
        (setq
          lg_amax amax
          n          (1+ (/ (- len (* amax 2) lg_width)
                       (+ (* amax 2.5) (* lg_width 3))
                      )
                  )
        )
        (if (> n (fix n))
          (setq n (1+ (fix n)))
        )
        (if (< n 1)
          (setq n 1)
        )
      )
    )
)
;;画图
;;记住原来的对象捕捉设置
;;按花形数量计算A值
(setq
    oldosmode (getvar "osmode")
    a              (/ (- len (* lg_width (+ (* (1- n) 3) 1)))
               (+ (* (1- n) 2.5) 2)
              )
)
;;暂时关闭对象捕捉
(setvar "osmode" 0)
;;屏蔽命令回显
(setvar "CMDECHO" 0)
;;以指定的插入点为左下角,按指定的栏杆长度和高度确定对角,画矩形
(command "rectang"
           basepoint
           (list (+ (car basepoint) len) (+ (cadr basepoint) lg_high))
)
;;在第一个矩形外侧一个方钢宽度处画第二个矩形
(command "rectang"
           (list (- (car basepoint) lg_width)
               (- (cadr basepoint) lg_width)
           )
           (list (+ (car basepoint) len lg_width)
               (+ (cadr basepoint) lg_high lg_width)
           )
)
;;将指定点移到其右侧A距离处
(setq basepoint (list (+ (car basepoint) a) (cadr basepoint)))
;;以此点为左下角,按方钢宽度和栏杆高度确定对角,画矩形,即第一条栏杆
(command "rectang"
           basepoint
           (list (+ (car basepoint) lg_width)
               (+ (cadr basepoint) lg_high)
           )
)
;;用循环语句,依次移动指定点并画出其余矩形(栏杆)
(repeat (1- n)
    (setq
      basepoint        (list (+ (car basepoint) a lg_width) (cadr basepoint))
    )
    (command "rectang"
             basepoint
             (list (+ (car basepoint) lg_width)
                   (+ (cadr basepoint) lg_high)
             )
    )
    (setq basepoint (list (+ (car basepoint) (* a 0.5) lg_width)
                          (cadr basepoint)
                  )
    )
    (command "rectang"
             basepoint
             (list (+ (car basepoint) lg_width)
                   (+ (cadr basepoint) lg_high)
             )
    )
    (setq
      basepoint        (list (+ (car basepoint) a lg_width) (cadr basepoint))
    )
    (command "rectang"
             basepoint
             (list (+ (car basepoint) lg_width)
                   (+ (cadr basepoint) lg_high)
             )
    )
)
;;恢复对象捕捉设置
(setvar "osmode" oldosmode)
;;打开命令回显
(setvar "CMDECHO" 1)
(princ)
)

PGF000 发表于 2010-7-1 09:40

楼上的太深渊了。

xyzyshl 发表于 2010-7-1 22:15

太深渊了?晕倒:L
页: [1]
查看完整版本: 作图03,求a=2b