明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2765|回复: 9

[测绘] 运用(测量员、工地通路测)格式文件绘制公路曲线

  [复制链接]
发表于 2019-10-15 23:46 | 显示全部楼层 |阅读模式
本帖最后由 ashleytgg 于 2019-10-15 23:44 编辑

   酝酿好久 ,终于把这个程序补充完了,程序主要功能利用——手机工地通路测、测量员程序的格式文件,在CAD中绘制公路曲线。程序支持线路短链处理,短链文件格式为 工地通格式的长短链文件。 因为时间和精力缘故,程序对于纠错并没有太多处理 ,如选择不匹配的参数文件,程序会崩溃,此时还需 读者自己琢磨。 程序的目的是共享, 对于解决一般问题还是可以的。对对于5线元的回头曲线,本程序是不支持的
   主程序的计算方法,以齐次坐标为主,下面是程序经常用到的计算函数   
  1. ;; Matrix x Vector  -  Vladimir Nesterovsky
  2. ;; Args: m - nxn matrix, v - vector in R^n
  3. (defun mxv (m v)
  4.   (mapcar '(lambda (r)
  5.        (apply '+
  6.         (mapcar '* r v)
  7.        )
  8.      )
  9.     m
  10.   )
  11. )

  12. ;| 定义一个刚体运动群,用其次坐标 对二维点集合group_pt 进行 先旋转, 再镜像,最后 平移的操作  
  13.     group_pt 要变换的二维点集合   φ为旋转角度, rotate_pt 为旋转基点
  14.    reflelx 为1 时对点集合沿着X轴进行镜像,等于-1 不进行 镜像操作
  15.     ang 为镜像轴的象限角度,mirror_base 为镜像轴上的一点  
  16.     U_move 为对点集合进行 平移的操作 的二维向量   
  17.    
  18. |;
  19. (defun operate_rigid_body (group_pt   rotate_pt   φ      U_move
  20.          reflelx    mirror_base      ang
  21.          /        T_rotation group      pt
  22.          T_综合     T_move   T_reflelx
  23.         )
  24.   ;; 定义一个旋转群 ,ang 为旋转的角度,rotate_base 为旋转的基点 ,
  25.   ;;当rotate_base 为nil 时,程序便认为是围绕 原点( 0 0 )旋转 ,当ang 为nil 时,程序认为旋转角为0度  
  26.   (defun group_rotate (rotate_base ang / T_r T_sum T_r_pt-1 T_r_pt)
  27.     (if  ang
  28.       (setq T_r
  29.        (list
  30.          (list (cos ang) (* -1 (sin ang)) 0)
  31.          (list (sin ang) (cos ang) 0)
  32.          '(0 0 1)
  33.        )
  34.       )
  35.       (setq T_r
  36.        (list
  37.          (list 1 0 0)
  38.          (list 0 1 0)
  39.          '(0 0 1)
  40.        )
  41.       )
  42.     )
  43.     (if  rotate_base
  44.       ;; 当旋转群的基点在rotate_base
  45.       (setq T_r_pt-1
  46.          (list
  47.            (list 1 0 (* (car rotate_base) -1))
  48.            (list 0 1 (* (cadr rotate_base) -1))
  49.            '(0 0 1)
  50.          )
  51.       T_r_pt
  52.          (list
  53.            (list 1 0 (car rotate_base))
  54.            (list 0 1 (cadr rotate_base))
  55.            '(0 0 1)
  56.          )
  57.       T_sum
  58.          (mapcar '(lambda (lst)
  59.         (setq lst (mxv T_r_pt-1 lst)
  60.               lst (mxv T_r lst)
  61.               lst (mxv T_r_pt lst)
  62.         )
  63.             )
  64.            (list
  65.              '(1 0 0)
  66.              '(0 1 0)
  67.              '(0 0 1)
  68.            )
  69.          )
  70.       T_sum
  71.          (list (mapcar 'car T_sum)
  72.          (mapcar 'cadr T_sum)
  73.          (mapcar 'caddr T_sum)
  74.          )

  75.       )
  76.       ;; 当旋转群的基点为原点时
  77.       (setq T_sum T_r)
  78.     )
  79.   )

  80.   ;; 定义一个镜像群,ang 为镜像轴的象限度,mirror_base 为镜像轴上的一点
  81.   ;; 当ang 为 nil 时, 程序便认为 镜像轴 平行于 X 轴
  82.   (defun group_mirror
  83.           (mirror_base       ang  /
  84.            T_mirror    T_sum       T_r  T_r-1
  85.            T_offset    T_reflelx
  86.           )
  87.     (if  ang
  88.       (setq
  89.   ;; 对镜像轴以mirror_base ,旋转 (* ang -1), 使得镜像轴平行于X 轴
  90.   T_r
  91.         (group_rotate mirror_base (* ang -1))
  92.   T_r-1
  93.         (group_rotate mirror_base ang)
  94.       )
  95.       (setq
  96.   T_r
  97.         (list
  98.     (list 1 0 0)
  99.     (list 0 1 0)
  100.     '(0 0 1)
  101.         )
  102.   T_r-1
  103.         (list
  104.     (list 1 0 0)
  105.     (list 0 1 0)
  106.     '(0 0 1)
  107.         )
  108.       )
  109.     )
  110.     (setq ;;对镜像轴 进行 平移,使成于X轴重合
  111.     T_offset
  112.          (list
  113.            (list 1 0 0)
  114.            (list 0 1 (* (cadr mirror_base) -1))
  115.            '(0 0 1)
  116.          )
  117.     T_offset-1
  118.          (list
  119.            (list 1 0 0)
  120.            (list 0 1 (cadr mirror_base))
  121.            '(0 0 1)
  122.          )
  123.     T_reflelx
  124.          (list
  125.            (list 1 0 0)
  126.            (list 0 -1 0)
  127.            '(0 0 1)
  128.          )
  129.     )
  130.     (setq T_sum
  131.     (mapcar  '(lambda (lst)
  132.          (setq lst (mxv T_r lst)
  133.          lst (mxv T_offset lst)
  134.          lst (mxv T_reflelx lst)
  135.          lst (mxv T_offset-1 lst)
  136.          lst (mxv T_r-1 lst)
  137.          )
  138.        )
  139.       (list
  140.         '(1 0 0)
  141.         '(0 1 0)
  142.         '(0 0 1)
  143.       )
  144.     )
  145.     T_sum
  146.     (list (mapcar 'car T_sum)
  147.           (mapcar 'cadr T_sum)
  148.           (mapcar 'caddr T_sum)
  149.     )
  150.     )
  151.   )
  152.   ;|
  153.      (setq T_test (group_mirror
  154.         (setq pt (getpoint "请选择镜像轴的基点:\n"))
  155.         (getangle "请选择镜像轴的方向:\n" pt)
  156.       )
  157.      )
  158.      (setq group_tang
  159.       (mapcar '(lambda (U)
  160.            (mxv T_test U)
  161.          )
  162.         (mapcar '(lambda (U)
  163.              (append U (list 1))
  164.            )
  165.           group_pt
  166.         )
  167.       )
  168.      )
  169.      (addpolyline group_tang)
  170.       |;
  171.   (if (= (length (car group_pt)) 2)
  172.     (setq group  (mapcar  '(lambda (U)
  173.          (append U (list 1))
  174.        )
  175.       group_pt
  176.     )
  177.     )
  178.     (setq group group_pt)
  179.   )
  180.   ;; 创建一个以 rotate_pt 为旋转中心,旋转角为φ 的群 T_rotation
  181.   (setq T_rotation (group_rotate rotate_pt φ))
  182.   ;;T_relfex 为镜像群,对点集合沿着以mirror_base为基点象限角ang的镜像轴 进行镜像  
  183.   (if (= reflelx -1)
  184.     (setq T_reflelx (group_mirror mirror_base ang))
  185.     (setq T_reflelx
  186.      (list
  187.        (list 1 0 0)
  188.        (list 0 1 0)
  189.        '(0 0 1)
  190.      )
  191.     )
  192.   )

  193.   (if U_move
  194.     (setq T_move
  195.      (list
  196.        (list 1 0 (car U_move))
  197.        (list 0 1 (cadr U_move))
  198.        '(0 0 1)
  199.      )
  200.     )
  201.     (setq T_move
  202.      (list
  203.        (list 1 0 0)
  204.        (list 0 1 0)
  205.        '(0 0 1)
  206.      )
  207.     )
  208.   )

  209.   (setq  T_综合
  210.    (mapcar '(lambda (lst)
  211.         (setq
  212.           lst (mxv T_rotation lst)
  213.           lst (mxv T_reflelx lst)
  214.           lst (mxv T_move lst)

  215.         )
  216.       )
  217.      (list
  218.        '(1 0 0)
  219.        '(0 1 0)
  220.        '(0 0 1)
  221.      )
  222.    )
  223.   )

  224.   (setq
  225.     ;; 对T_综合 进行装置
  226.     T_综合
  227.      (list (mapcar 'car T_综合)
  228.      (mapcar 'cadr T_综合)
  229.      (mapcar 'caddr T_综合)
  230.      )
  231.   )
  232.   (mapcar '(lambda (U)
  233.        (mxv T_综合 U)
  234.      )
  235.     group
  236.   )

  237. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 收起 理由
USER2128 + 1 赞一个!
songyujie928 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
    共1人打赏
发表于 2019-10-30 01:10 | 显示全部楼层
楼主对一个程序不断完善,孜孜不倦的精神,值得学习。
发表于 2019-10-30 09:39 | 显示全部楼层
谢谢楼主分享
 楼主| 发表于 2019-11-1 14:26 | 显示全部楼层
感谢支持,                              。
发表于 2019-11-4 10:06 | 显示全部楼层
支持楼主   
发表于 2020-10-31 15:54 | 显示全部楼层
大神可以提取出单个点中桩坐标计算的吗
发表于 2020-10-31 21:03 来自手机 | 显示全部楼层
大神呀,大神万岁
发表于 2021-11-6 00:14 | 显示全部楼层
很不错,希望能增加一个功能,在图上识取一个坐标,然后就可以反算出桩号、偏距、高程,这样就非常实用了。
发表于 2021-11-26 11:32 | 显示全部楼层
占座支持!  
发表于 2022-9-7 11:45 | 显示全部楼层
学习到很多知识,谢谢分享,支持不断完善
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 22:17 , Processed in 0.234281 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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