- 积分
- 5488
- 明经币
- 个
- 注册时间
- 2014-4-27
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|

楼主 |
发表于 2016-10-13 16:14:50
|
显示全部楼层
把还有一些代码补上

- ;;对一个二维点集合group_point 绕 点center 旋转 ang 弧度
- (defun rotate_group_point (group_point ang center / lst)
- (setq group_point
- (mapcar '(lambda (point)
- (list (- (car point) (car center))
- (- (cadr point) (cadr center))
- )
- )
- group_point
- )
- )
- (setq lst (list (list (cos ang) (* (sin ang) -1))
- (list (sin ang) (cos ang))
- )
- )
- (setq group_point
- (mapcar '(lambda (point)
- (apply '(lambda (element_1 element_2)
- (list (+ (* (car element_1) (car point))
- (* (cadr element_1) (cadr point))
- )
- (+ (* (car element_2) (car point))
- (* (cadr element_2) (cadr point))
- )
- )
- )
- lst
- )
- )
- group_point
- )
- )
- (setq
- group_point
- (mapcar '(lambda (x)
- (list (+ (car x) (car center))
- (+ (cadr x) (cadr center))
- )
- )
- group_point
- )
- )
- )
- ;; 8888888888888888 88888888888888888888888 88888888888888888
- ;;定义一个队group_data_out 数组进行群变换的函数 ,group_data_out 结构为:(Z_桩号 U ang_象限角 )
- ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度
- (defun transformation_group_data_out
- (group_data_out
- reflex data_origin
- data_insert /
- group_point quadrant_ang
- ang_Δ ang
- U_origin U_insert
- group i
- )
- (setq group (append (list data_origin) group_data_out))
- (if (= reflex -1)
- (setq group
- (mapcar '(lambda (lst / Z U ang)
- (setq Z (car lst)
- U (cadr lst)
- ang (caddr lst)
- )
- (list Z
- (list (car U)
- (* (cadr U) -1)
- )
- (* ang -1)
- )
- )
- group
- )
- )
- ) ; (if (= reflex -1) 函数结束
- (setq data_origin (car group)
- group_data_out (cdr group)
- )
- ;; 对group_data_out 数组进行平移,使得原坐标系中的U_origin点,和实际线元的起点U_insert向符合
- (setq U_origin (cadr data_origin)
- U_insert (cadr data_insert)
- )
- (setq group_data_out
- (mapcar '(lambda (lst / Z U x y ang)
- (setq Z (car lst)
- U (cadr lst)
- x (+ (- (car U) (car U_origin))
- (car U_insert)
- )
- y (+ (- (cadr U) (cadr U_origin))
- (cadr U_insert)
- )
- ang (caddr lst)
- )
- (list Z (list x Y) ang)
- )
- group_data_out
- )
- )
- ;; 对 group_data_out 数组,以线元的起点U_insert进行旋转 quadrant_ang- ang 角度操作
- (setq ang (caddr data_origin)
- quadrant_ang (caddr data_insert)
- )
- (setq group_point
- (mapcar 'cadr group_data_out)
- )
- (setq ang_Δ (- quadrant_ang ang)
- group_point (rotate_group_point group_point ang_Δ U_insert)
- )
- (setq i 0
- group_data_out
- (mapcar '(lambda (lst / U ang)
- (setq U (nth i group_point)
- ang (caddr lst)
- i (+ i 1)
- )
- (list (car lst) U (+ ang ang_Δ))
- )
- group_data_out
- )
- )
- ) ; (defun transformation_group_data_out 函数结束
- ;; (transformation_group_data_out group_data_out reflex data_origin data_insert)
- ;;888888888888888888888888888888888888888888888888888888888888888888888888888888
- ;; 人口变量, 缓和曲线参数A, 缓和曲线长L
- (defun solve_transition_curve_sub (A L /
- group U deflection
- functon_parameter
- )
- ;; (setq L 40.0 A 200 )
- (if (> L 0.000001)
- (progn
- (setq L (* L 1.0)
- A (* A 1.0)
- )
- (setq functon_parameter
- '(((1 0 1.0 1)
- (5 4 40.0 -1)
- (9 8 3456.0 1)
- (13 12 599040.0 -1)
- (17 16 1.75473e+007 1)
- )
- ((3 2 6.0 1)
- (7 6 336.0 -1)
- (11 10 42240.0 1)
- (15 14 9.6768e+006 -1)
- (19 18 3.5301e+009 1)
- )
- )
- )
- ;; 把 L A 带入函数 进行求值
- (setq group
- (mapcar '(lambda (subset)
- (mapcar '(lambda (lst)
- (apply '(lambda (a_1 a_2 a_3 a_4)
- (* (/ (expt L a_1)
- (* (expt A a_2) a_3)
- )
- a_4
- )
- )
- lst
- )
- )
- subset
- )
- )
- functon_parameter
- )
- )
- (setq U
- (mapcar '(lambda (subset)
- (apply '+ subset)
- )
- group
- )
- )
- (setq deflection
- (/ (expt L 2.0) (* (expt A 2.0) 2.0))
- ) ; J为弧度
- (list U deflection)
- ) ; progn函数结束
- ;; 当缓和曲线长L很小时
- (list '(0 0) 0)
- ) ; if 函数结束
- )
- ;; 输出参数为切线支距坐标复数U,偏角deflection
- ;;888888888888888888888888888888888888888888888888888888888888888888888888888888888
- ;; 当线元是缓和曲线时, subset 数据结构为
- ;; ( R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert )
- (defun solve_transition_curve (group_Z subset /
- A Lh lst
- Lh_start Lh_end U_Z_start
- β_start Z_end group_data_out
- data_origin data_insert
- )
- (apply
- '(lambda (R_start R_end transition_parameter
- reflex quadrant_ang Z_start
- U_insert
- )
- (setq Lh (car transition_parameter) ; 缓和曲线长度
- A (cadr transition_parameter) ; 缓和曲线参数
- R_start (* R_start 1.0)
- R_end (* R_end 1.0)
- )
- (if (= R_start 0)
- (setq R_start (expt 10.0 30))
- )
- (if (= R_end 0)
- (setq R_end (expt 10.0 30))
- )
- (if (> R_start R_end)
- ;; 正向缓和曲线时
- (progn
- (setq Lh_start (/ (expt A 2) R_start) ; 起点缓和曲线长度
- lst (solve_transition_curve_sub A Lh_start)
- U_Z_start (car lst) ; 缓和曲线的起点切线支距坐标
- β_start (cadr lst) ;缓和曲线起点象限角
- )
- ;; 对桩号集合group_Z 进行操作
- (setq group_data_out
- (mapcar '(lambda (z / L lst U_Z β_Z)
- (setq L (+ (- Z Z_start) Lh_start))
- (setq lst (solve_transition_curve_sub A L)
- U_Z (car lst)
- β_Z (cadr lst)
- )
- (list Z U_Z β_Z)
- )
- group_Z
- )
- )
- )
- ;; 反向缓和曲线时
- (progn
- (setq Lh_start (/ (expt A 2) R_start)
- lst (solve_transition_curve_sub A Lh_start)
- U_Z_start (car lst)
- β_start (cadr lst)
- )
- (setq Lh_end (/ (expt A 2) R_end) ; 终点缓和曲线长度
- Z_end (+ Z_start Lh)
- )
- (setq group_data_out
- (mapcar '(lambda (z / L lst U_Z β_Z)
- (setq L (+ (- Z_end Z) Lh_end))
- ; 加桩点的缓和曲线长度,从完整缓和曲线的起点算起
- (setq lst (solve_transition_curve_sub A L)
- U_Z (car lst)
- β_Z (cadr lst)
- )
- (list Z U_Z β_Z)
- )
- group_Z
- )
- )
- ;;此时生成的group_data_out与标准的正向缓和曲线线(原点0,启始方位角0,右手螺旋坐标系) 沿着X轴对称 ,
- ;;所以要对group_data_ou 进行沿x轴镜像
- (setq group_data_out
- (mapcar '(lambda (lst / Z U ang)
- (setq Z (car lst)
- U (cadr lst)
- ang (caddr lst)
- )
- (list Z
- (list (* (car U) -1)
- (cadr U)
- )
- (* ang -1)
- )
- )
- group_data_out
- )
- U_Z_start
- (list (* (car U_Z_start) -1)
- (cadr U_Z_start)
- )
- β_start
- (* β_start -1)
- )
- )
- ) ; (if (> R_start R_end) 函数结束
- ;; 创建transformation_group_data_out 函数用参数 data_origin data_insert
- (setq data_origin (list 0 U_Z_start β_start)
- data_insert (list 0 U_insert quadrant_ang)
- )
- ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度
- (transformation_group_data_out
- group_data_out
- reflex
- data_origin
- data_insert
- )
- )
- subset
- )
- )
- ;;88888888888888888888888888888888888888888888888888888888888888888 (expt 10.0 30)
- ;; 当线元是圆曲线时 subset 数据结构为
- ;; ( R_start R_end lenth reflex quadrant_ang Z_start U_insert )
- (defun solve_circular_arc (group_Z subset /
- i group_data_out
- U_center data_origin data_insert
- )
- ;; (tang_test group_data_out )
- (apply
- '(lambda (R_start R_end lenth reflex quadrant_ang Z_start U_insert)
- ;; 设定圆曲线圆心为原点(0 R_start),方向为 右手坐标系,圆曲线线起点坐标(0 0 ),切线为X轴
- (setq R_start (* R_start 1.0)
- U_center (list 0 R_start)
- )
- (setq group_data_out
- (mapcar '(lambda (Z / L β U_Z ang)
- (setq L (- Z Z_start)
- β (/ L R_start)
- ang (- β (/ pi 2))
- U_Z (polar U_center ang R_start)
- )
- (list Z U_Z β)
- )
- group_Z
- )
- )
- ;; 创建transformation_group_data_out 函数用参数 data_origin data_insert
- (setq data_origin (list 0 (list 0 0) 0)
- data_insert (list 0 U_insert quadrant_ang)
- )
- ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度
- (transformation_group_data_out
- group_data_out
- reflex
- data_origin
- data_insert
- )
- )
- subset
- )
- )
- ;;88888888888888888888888888888888888888888888888888888888888888888
- ;; 当线元是直线时 subset 数据结构为
- ;; ( R_start R_end lenth reflex quadrant_ang Z_start U_insert )
- (defun solve_straightway
- (group_Z subset / group_data_out)
- ;; (tang_test group_data_out )
- (apply
- '(lambda (R_start R_end lenth reflex quadrant_ang Z_start U_insert)
- (setq group_data_out
- (mapcar '(lambda (Z / L U_Z)
- (setq L (- Z Z_start)
- U_Z (polar U_insert quadrant_ang L)
- )
- (list Z U_Z quadrant_ang)
- )
- group_Z
- )
- )
- )
- subset
- )
- )
- ;;88888888888888888888888888888888888888888888888888888888888888888
-
-
- ;;888888888888888888888888888888888888888888888888888888888888888888888888888888
- ;; 人口变量缓和曲线长Lh, 缓和曲线半径R, 出口变量缓和曲线出口段内移值p,切线增量q ,偏角β,缓和曲线参数A
- (defun evaluation_transition_curve
- (Lh R /
- A p q
- β group
- functon_parameter
- )
- ;; (setq lh 50 r 480 )
- (setq R (* 1.0 R)
- Lh (* 1.0 Lh)
- )
- (setq functon_parameter
- '(((2 1 24.0)
- (4 3 -2688.0)
- (6 5 506880.0)
- (8 7 -1.54829e+008)
- )
- ((1 0 2.0)
- (3 2 -240.0)
- (5 4 34560.0)
- (7 6 -8.38656e+006)
- (9 8 3.15851e+009)
- )
- )
- )
- ;;把参数parameter_easement_curve 带入求值,
- (setq group
- (mapcar '(lambda (subset)
- (mapcar '(lambda (lst)
- (apply '(lambda (a_1 a_2 a_3)
- (/ (expt Lh a_1)
- (* (expt R a_2) a_3)
- )
- )
- lst
- )
- )
- subset
- )
- )
- functon_parameter
- )
- )
- (setq group
- (mapcar '(lambda (subset)
- (apply '+ subset)
- )
- group
- )
- )
- (setq p (car group)
- q (cadr group)
- β (/ Lh (* R 2.0))
- A (sqrt (* R Lh))
- )
- ;; 出口变量缓和曲线出口段内移值p,切线增量q ,偏角β,缓和曲线参数A
- (list p q β A)
- ) ; evaluation_easement_curve 函数结束
- ;; (evaluation_transition_curve 50 480 ) (evaluation_transition_curve 50 480 )
- ;;888888888888888888888888888888888888888888888888888888888888888888888888888888888
- ;;888888888888888888888888888888888888888888888888888888888888888888888888888888
- ;; (setq group_turning_point ( create_turning_point_group ) )
- ;; 求基本对称路线平曲线的 曲线要素 入口变量: [ ( 转点号I nil) U_转点 ( Lh R Lh )(α1 α2 Δ Dist_1 Dist_2 )]
- ;; 出口变量:该转点各线元的数据[( 转点号I j) R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert ) ]
- (defun evaluation_symmetrical_curve (subset / Z_I U group_data_out)
- ;; (setq subset (nth 15 group_turning_point ))
- (setq Z_I (car (car subset)) ; 转点编号
- subset (cdr subset)
- )
- ;; (setq U_ZD_real (car subset) lst1 (cadr subset) lst2 (caddr subset) )
- (apply '(lambda (U_ZD_real lst1 lst2 /
- ;; 计算交点用参数
- quadrant_ang Δ
- ;; 计算切线长度 T1 T2 所用参数
- T1 T2 a_1 a_2 tangent
- cscΔ cotΔ
- ;; 计算缓和曲线的内蕴参数
- parameter Lh1 Lh2 R
- A1 A2 p1 p2 q1
- q2 β1 β2 βy E
- Ly L adjusted_value reflex
- ;; 建立线元坐标系所用参数
- U_center U_JD U_ZH U_HY U_QZ
- U_YH U_HZ
- ;; 桩号用参数
- Z_JD Z_ZH Z_HY Z_QZ Z_YH
- Z_HZ
- ;; 切线角用参数
- ang_JD ang_ZH ang_HY ang_QZ ang_YH
- ang_HZ
- ;; 对数组 group_data_out 进行移位,镜像,旋转 用参数
- quadrant_ang data_origin data_insert
- ;;创建线元列表所用参数
- lst lst2 lst3 lst4 Line_segments
- )
- (setq Lh1 (car lst1)
- R (cadr lst1)
- Lh2 (caddr lst1)
- quadrant_ang
- (car lst2) ; 设计交点的入口方位角
- Δ (caddr lst2) ; 设计交点偏转系数
- )
- (if (>= Δ 0)
- (setq reflex 1)
- (setq reflex -1
- Δ (* -1 Δ)
- )
- )
- (setq
- parameter
- (evaluation_transition_curve Lh1 R)
- ;; 出口变量缓和曲线出口段内移值p,切线增量q ,偏角β,缓和曲线参数A
- p1 (car parameter)
- q1 (cadr parameter)
- β1 (caddr parameter)
- A1 (nth 3 parameter)
- )
- (cond
- ((= Lh1 Lh2)
- (setq
- β2 β1
- A2 A1
- )
- (setq tangent (/ (sin (/ Δ 2)) (cos (/ Δ 2)))
- T1 (+ (* (+ R p1) tangent) q1)
- T2 T1
- ; 切线长度
- )
- )
- ;; 当出口、进口缓和曲线长度不相等时
- ((/= Lh1 Lh2)
- (setq
- parameter
- (evaluation_transition_curve Lh2 R)
- ;; 出口变量缓和曲线出口段内移值p,切线增量q ,偏角β,缓和曲线参数A
- p2 (car parameter)
- q2 (cadr parameter)
- β2 (caddr parameter)
- A2 (nth 3 parameter)
- )
- (setq cscΔ (/ 1.0 (sin Δ))
- cotΔ (/ (cos Δ) (sin Δ))
- a_1 (* (+ R p2) cscΔ)
- a_2 (* (+ R p1) cotΔ)
- T1 (+ (- a_1 a_2)
- q1
- )
- a_1 (* (+ R p1) cscΔ)
- a_2 (* (+ R p2) cotΔ)
- T2 (+ (- a_1 a_2)
- q2
- )
- )
- )
- ) ; (cond 函数 结束
- (setq a_1 (expt (+ R p1) 2)
- a_2 (expt (- T1 q1) 2)
- E (- (sqrt (+ a_1 a_2)) R) ; 外距
- βy (- Δ (+ β1 β2))
- Ly (* βy R)
- ; 圆曲线长度
- L (+ Ly (+ Lh1 Lh2))
- adjusted_value (- (+ T1 T2) L) ; 切曲差
- )
- ;; 以ZH点为坐标原点,该点的切线方向为X轴,建立右手螺旋坐标系 ,转角 Δ取正数
- ;;转点的桩号 Z_JD = z_QZ + adjusted_value
- (setq ang_JD (/ Δ 2)
- ;; 设置为U_JD ->U_center的垂直方向
- ang_ZH 0
- ang_HY β1
- ang_QZ (+ β1 (/ βy 2))
- ang_YH (- Δ β2)
- ang_HZ Δ
- )
- ;; (angtos (+(/ (- pi Δ) 2)Δ) 1 6 )
- (setq
- U_JD (list T1 0)
- U_center (list q1 (+ R p1))
- U_ZH (list 0 0) ;向量U_center ->U_JD 的方位角 (+ (/ Δ 2)pi)
- U_HY (polar U_center (- ang_HY (* pi 0.5)) R)
- U_QZ (polar U_center (- ang_QZ (* pi 0.5)) R)
- U_YH (polar U_center (- ang_YH (* pi 0.5)) R)
- U_HZ (polar U_JD Δ T2)
- )
- (setq Z_JD T1
- Z_ZH 0
- Z_HY Lh1
- Z_QZ (+ Lh1 (/ Ly 2))
- Z_YH (+ Lh1 Ly)
- Z_HZ L
- )
- (setq group_data_out
- (list
- (list Z_JD U_JD ang_JD)
- (list Z_ZH U_ZH ang_ZH)
- (list Z_HY U_HY ang_HY)
- (list Z_QZ U_QZ ang_QZ)
- (list Z_YH U_YH ang_YH)
- (list Z_HZ U_HZ ang_HZ)
- )
- )
- ;; 创建transformation_group_data_out 函数用参数 data_origin data_insert
- (setq
- data_origin (list 0 U_JD 0)
- data_insert (list 0 U_ZD_real quadrant_ang)
- )
- ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度quadrant_ang
- (setq group_data_out
- (transformation_group_data_out
- group_data_out
- reflex
- data_origin
- data_insert
- )
- )
- ;;利用group_data_out数组 设置线元参数: (( 转点号I j) R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert )
- (cond
- ((and (/= Lh1 0)
- (/= Lh2 0)
- )
- (setq lst (list 1 2 4)
- lst3 (list 0 1 2)
- )
- )
- ((and (= Lh1 0)
- (/= Lh2 0)
- )
- (setq lst (list 2 4)
- lst3 (list 1 2)
- )
- )
- ((and (/= Lh1 0)
- (= Lh2 0)
- )
- (setq lst (list 1 2)
- lst3 (list 0 1)
- )
- )
- ((and (= Lh1 0)
- (= Lh2 0)
- )
- (setq lst (list 2)
- lst3 (list 1)
- )
- )
- ) ; cond 函数结束
- (setq
- group
- (mapcar '(lambda (i / lst2)
- (setq lst2 (nth i group_data_out))
- (list (caddr lst2) (car lst2) (cadr lst2))
- )
- (list 1 2 4)
- )
- lst_4 (list (list (list Z_I 0) 0 R (list Lh1 A1) reflex)
- (list (list Z_I 1) R R Ly reflex)
- (list (list Z_I 2) R 0 (list Lh2 A2) reflex)
- )
- Line_segments (mapcar '(lambda (i)
- (append (nth i lst_4) (nth i group))
- )
- lst3
- )
- )
- (list Line_segments (list T1 T2 adjusted_value))
- )
- subset
- )
- ) ; evaluation_easement_curve 函数结束
- ;;888888888888888888888888888888888888888888888888888888888888888888888888888888888
- ;;888888888888888888888888888888888888888888888888888888888888888888888888888888 (setq tgg ( evaluation_no_symmetrical_curve subset ) )
- ;; (setq group_turning_point_original (car ( create_turning_point_group_original ) ) )
- ;; (setq group_turning_point (car( create_turning_point_group group_turning_point_original Z_road_start )))
- ;; 求包含非完整缓和曲线的线元要素 入口变量: [ ( 转点号I T) U_转点 ( R_start R R_end Lh1 Lh2 )(α1 α2 Δ Dist_1 Dist_2 )]
- ;; 出口变量:该转点各线元的数据[( 转点号I j) R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert ) ]
- (defun evaluation_no_symmetrical_curve (subset / Z_I U group_data_out)
- ;; (setq subset (nth 11 group_turning_point ))
- (setq Z_I (car (car subset)) ; 转点编号
- subset_2 (cdr subset)
- )
- ;; (setq U_ZD_real (car subset_2) lst1 (cadr subset_2) lst2 (caddr subset_2) )
- (apply '(lambda (U_ZD_real lst1 lst2 /
- ;; 计算交点用参数
- quadrant_ang Δ
- ;; 计算切线长度 T1 T2 所用参数
- T1 T2 group_Z Lh1_start Lh2_start
- ;; 计算缓和曲线的内蕴参数
- parameter Lh1 Lh2 R A1
- A2 p1 p2 q1 q2
- β1 β2 βy E Ly
- L adjusted_value reflex
- ;; 建立线元坐标系所用参数
- U_center U_ZD U_ZH U_HY U_QZ
- U_YH U_HZ
- ;; 桩号用参数
- Z_JD Z_ZH Z_HY Z_QZ Z_YH
- Z_HZ
- ;; 切线角用参数
- ang_JD ang_ZH ang_HY ang_QZ ang_YH
- ang_HZ
- ;; 对数组 group_data_out 进行移位,镜像,旋转 用参数
- quadrant_ang data_origin data_insert
- ;;创建线元列表所用参数
- lst lst2 lst3 lst4 Line_segments
- )
- (setq R_start (car lst1)
- R (cadr lst1)
- R_end (caddr lst1)
- Lh1 (nth 3 lst1)
- Lh2 (nth 4 lst1)
- quadrant_ang
- (car lst2) ; 设计交点的入口方位角
- Δ (caddr lst2) ; 设计交点偏转系数
- )
- (if (= R_start 0)
- (setq R_start (expt 10.0 30))
- )
- (if (= R_end 0)
- (setq R_end (expt 10.0 30))
- )
- (if (>= Δ 0)
- (setq reflex 1)
- (setq reflex -1
- Δ (* -1 Δ)
- ) ; (setq Δ (/ pi 3))
- )
- ;; 当出口 缓和曲线长度不相等时
- (if (/= Lh1 0)
- (progn
- ;; 创建lst结构 ( ( 转点号I j) R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert )
- (setq
- A1
- (abs (- (/ 1.0 R)
- (/ 1.0 R_start)
- )
- )
- A1
- (sqrt (/ Lh1 A1))
- )
- ;; 求入口非完整缓和曲线的HY点 ( z_桩号 U_z ang )
- (setq lst (list R_start
- R
- (list Lh1 A1)
- 1
- 0 ; 线元的起点方位角
- 0
- (list 0 0)
- )
- group_Z (list Lh1)
- )
- (setq group (solve_transition_curve group_Z lst)
- U_HY (cadr (car group))
- β1 (caddr (car group))
- )
- ;; (setq group_data_out (solve_transition_curve ( create_group_Z 0 Lh1 1) lst )) (tang_test group_data_out )
- )
- (setq β1 0) ; 当Lh1长度为0 时 , β1 偏角为0
- )
- ;; 求出口口非完整缓和曲线的HY点 ( z_桩号 U_z ang ) (以YH点为0点,右手螺旋坐标系,过YH点的切线为0度 )
- (if (/= Lh2 0)
- (progn
- ;; 创建lst结构 ( R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert )
- (setq
- A2
- (abs (- (/ 1.0 R)
- (/ 1.0 R_end)
- )
- )
- A2
- (sqrt (/ Lh2 A2))
- )
- (setq lst (list R
- R_end
- (list Lh2 A2)
- 1
- 0 ; 线元的起点方位角
- 0
- (list 0 0)
- )
- group_Z (list Lh2)
- )
- (setq group (solve_transition_curve group_Z lst)
- β2 (caddr (car group))
- )
- )
- (setq β2 0) ; 当Lh2长度为0 时 , β2 偏角为0
- ) ; (if (/= Lh2 0) 函数结束
- ;; 计算圆曲线的偏角
- (setq βy (- Δ (+ β2 β1))
- Ly (* R βy) ; 圆曲线长度
- )
- ;; 创建lst结构 ( R_start R_end lenth reflex quadrant_ang Z_start U_insert )
- (setq lst (list R R Ly 1 β1 0 U_HY)
- group_Z (list Ly) ; YH 点的桩号
- )
- (setq group (solve_circular_arc group_Z lst)
- ; 求圆曲线的终点坐标
- U_YH (cadr (car group))
- )
- ;; (setq group_data_out (solve_circular_arc ( create_group_Z 0 Ly 1) lst )) (tang_test group_data_out )
- (if (/= Lh2 0)
- (progn
- ;;求HZ点的 group_data_out 的数组( z_桩号 U_z ang )
- (setq lst (list R
- R_end
- (list Lh2 A2)
- 1
- (+ βy β1) ; 线元的起点方位角
- 0 ; 线元的起始桩号
- U_YH
- )
- group_Z (list Lh2) ; HZ点桩号
- )
- (setq group (solve_transition_curve group_Z lst)
- U_HZ (cadr (car group))
- ; 求第二缓和曲线在 以HZ点为坐标原点,起点缓和曲线切线为X轴方向
- )
- ;; (setq group_data_out (solve_transition_curve ( create_group_Z 0 Lh2 1) lst )) (tang_test group_data_out )
- )
- (setq U_HZ U_YH)
- ) ; (if (/= Lh2 0) 函数结束
- ;; 求次坐标系中的转点坐标 U_ZD
- (setq U_HZ_2 (polar U_HZ Δ 100.0)
- U_ZD (inters U_HZ
- U_HZ_2
- (list 0 0)
- (list 10000 0)
- nil
- )
- )
- ;; (setq tang99 (list (list 0 0) U_HY U_YH U_HZ U_ZD ))( create_LWPOLYLINE tang99 nil "0" )
- (setq T1 (car U_ZD)
- T2 (distance U_ZD U_HZ)
- L (+ Ly (+ Lh1 Lh2))
- adjusted_value (- (+ T1 T2) L) ; 切曲差
- )
- ;; 以ZH点为坐标原点,该点的切线方向为X轴,建立右手螺旋坐标系 ,转角 Δ取正数
- ;;转点的桩号 Z_JD = z_QZ + adjusted_value
- (setq ang_JD (/ Δ 2)
- ;; 设置为U_JD ->U_center的垂直方向
- ang_ZH 0
- ang_HY β1
- ang_QZ (+ β1 (/ βy 2))
- ang_YH (- Δ β2)
- ang_HZ Δ
- )
- ;; (angtos (+(/ (- pi Δ) 2)Δ) 1 6 )
- (setq
- U_center (polar U_HY (+ ang_HY (* pi 0.5)) R)
- U_ZH (list 0 0) ;向量U_center ->U_JD 的方位角 (+ (/ Δ 2)pi)
- U_QZ (polar U_center (- ang_QZ (* pi 0.5)) R)
- )
- (setq Z_JD T1
- Z_ZH 0
- Z_HY Lh1
- Z_QZ (+ Lh1 (/ Ly 2))
- Z_YH (+ Lh1 Ly)
- Z_HZ L
- )
- (setq group_data_out
- (list
- (list Z_JD U_ZD ang_JD)
- (list Z_ZH U_ZH ang_ZH)
- (list Z_HY U_HY ang_HY)
- (list Z_QZ U_QZ ang_QZ)
- (list Z_YH U_YH ang_YH)
- (list Z_HZ U_HZ ang_HZ)
- )
- )
- ;; 创建transformation_group_data_out 函数用参数 data_origin data_insert
- (setq
- data_origin (list 0 U_ZD 0)
- data_insert (list 0 U_ZD_real quadrant_ang)
- )
- ;; 对点集合 group_point 首先进行镜像变换,然后把变换后的点集合从U_origin 以为到U_insert ,然后围绕U_insert点旋转制定的角度quadrant_ang
- (setq group_data_out
- (transformation_group_data_out
- group_data_out
- reflex
- data_origin
- data_insert
- )
- )
- ;;利用group_data_out数组 设置线元参数: ( R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert )
- (cond
- ((and (/= Lh1 0)
- (/= Lh2 0)
- )
- (setq lst (list 1 2 4)
- lst3 (list 0 1 2)
- )
- )
- ((and (= Lh1 0)
- (/= Lh2 0)
- )
- (setq lst (list 2 4)
- lst3 (list 1 2)
- )
- )
- ((and (/= Lh1 0)
- (= Lh2 0)
- )
- (setq lst (list 1 2)
- lst3 (list 0 1)
- )
- )
- ((and (= Lh1 0)
- (= Lh2 0)
- )
- (setq lst (list 2)
- lst3 (list 1)
- )
- )
- ) ; cond 函数结束
- (setq
- group
- (mapcar '(lambda (i / lst2)
- (setq lst2 (nth i group_data_out))
- (list (caddr lst2) (car lst2) (cadr lst2))
- )
- (list 1 2 4)
- )
- lst_4 (list (list (list Z_I 0) R_start R (list Lh1 A1) reflex)
- (list (list Z_I 1) R R Ly reflex)
- (list (list Z_I 2) R R_end (list Lh2 A2) reflex)
- )
- Line_segments (mapcar '(lambda (i)
- (append (nth i lst_4) (nth i group))
- )
- lst3
- )
- )
- (list Line_segments (list T1 T2 adjusted_value))
- )
- subset_2
- )
- ) ; evaluation_easement_curve 函数结束
- ;;888888888888888888888888888888888888888888888888888888888888888888888888888888888
- ;; (setq group_turning_point ( create_turning_point_group ) )
- ;; 求线路的线元参数group_Line_segments [( 转点号I j) R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert ]
- ;; 以及转点参数 group_data_JD ( Z_JD U ang JD reflex )
- (defun create_group_Line_segments
- (group_turning_point
- Z_road_start /
- group_turning_point_2
- lst state
- i dist
- quadrant_ang num
- T_front Δ
- U_insert U
- Z group_parameter
- group_Line_segments
- group_data_JD
- )
- ;; 去掉group_turning_point 中的第一和最后一个转点,不进行处理
- (setq group_turning_point_2
- (cdr group_turning_point)
- group_turning_point_2
- (reverse group_turning_point_2)
- group_turning_point_2
- (cdr group_turning_point_2)
- group_turning_point_2
- (reverse group_turning_point_2)
- )
- ;; 创建线元集合group_Line_segments [( 转点号I j) R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert ]
- ;; 和 转点用的参数集合 group_parameter (list T1 T2 adjusted_value)
- (setq
- group_Line_segments
- nil
- group_parameter
- nil
- )
- (mapcar '(lambda ; (setq subset (nth 9 group_turning_point ) )
- (subset / Line_segments state lst lst2)
- (setq state (cadr (car subset)))
- ; 判断该转点是否包含非完整缓和曲线
- (if state
- (setq lst
- (evaluation_no_symmetrical_curve subset)
- Line_segments
- (car lst)
- lst2 (cadr lst)
- )
- (setq lst
- (evaluation_symmetrical_curve subset)
- Line_segments
- (car lst)
- lst2 (cadr lst)
- )
- )
- (setq group_Line_segments
- (cons Line_segments group_Line_segments)
- group_parameter
- (cons lst2 group_parameter)
- )
- )
- group_turning_point_2
- )
- (setq group_Line_segments
- (reverse group_Line_segments)
- group_parameter
- (reverse group_parameter)
- )
- ;;利用参数group_parameter (list T1 T2 adjusted_value) 和group_turning_point 把直线线元加进group_Line_segments 中
- (setq i 0
- n (length group_Line_segments)
- )
- ;; 把第二个转点至最后一个转点的直线线元加进数组group_Line_segments 中
- (setq group_Line_segments
- (mapcar
- '(lambda
- (lst / dist lst2 T_back
- T_now T_front Δ U_JD quadrant_ang
- U_insert element num Z_start
- )
- (cond
- ((/= i (- n 1)) ; 当转点num 不是最后一个转点时
- (setq T_now (cadr (nth i group_parameter))
- T_back (car (nth i group_parameter))
- adjusted_value (caddr (nth i group_parameter))
- T_front (car (nth (+ i 1) group_parameter))
- lst2 (nth (+ i 1) group_turning_point)
- ; 线元所对应的转点号
- dist (nth 4 (nth 3 lst2))
- quadrant_ang (cadr (nth 3 lst2))
- Δ (- dist (+ T_now T_front))
- ;直线线元的长度
- num (car (car lst2)) ; 转点号
- Z_start (- (+ T_now T_back) adjusted_value)
- ;线元的起点桩号
- )
- )
- ;; 当转点num 是最后一个转点时
- ((= i (- n 1))
- (setq T_now (cadr (nth i group_parameter))
- T_back (car (nth i group_parameter))
- adjusted_value (caddr (nth i group_parameter))
- T_front 0; 最后一个转点的切线长度设置为0
- lst2 (nth (+ i 1) group_turning_point)
- ; 线元所对应的转点号
- dist (nth 4 (nth 3 lst2))
- quadrant_ang (cadr (nth 3 lst2))
- Δ (- dist (+ T_now T_front))
- num (car (car lst2)) ; 转点号
- Z_start (- (+ T_now T_back) adjusted_value)
- ;线元的起点桩号
- )
- )
- )
- (setq i (+ i 1))
- ;; 当 Δ 长度大于0.1米 时, 在该转点处加进直线线元
- (if (> Δ 0.1)
- (progn
- (setq U_JD (cadr lst2)
- U_insert (polar U_JD quadrant_ang T_now)
- num (car (car lst2))
- )
- ;; 创建直线线元[( 转点号I 3) 0 0 Δ reflex quadrant_ang Z_start U_insert ]
- (setq element (list (list num 3)
- 0
- 0
- Δ
- 1
- quadrant_ang
- Z_start
- U_insert
- )
- lst (append lst (list element))
- )
- )
- ) ; (if (> Δ 0.1) 函数结束
- lst
- )
- group_Line_segments
- )
- )
- ;; 把第一直线线元加进数组 group_Line_segments
- (setq lst (car group_turning_point)
- dist (nth 4 (nth 3 lst))
- quadrant_ang (cadr (nth 3 lst))
- U_insert (cadr lst) ; 第一个转点的 坐标
- num (car (car lst)) ; 第一个线元的转点号
- lst (car group_parameter)
- T_front (car lst) ; 第二个转点 的入口方向切线长度
- Δ (- dist T_front)
- )
- ;; 判断第一个线元的转点是否存在
- (if (> Δ 0.1)
- (progn
- (setq element (list (list num 3)
- 0
- 0
- Δ
- 1
- quadrant_ang
- 0
- U_insert
- )
- )
- (setq group_Line_segments
- (append (list (list element)) group_Line_segments)
- )
- )
- )
- ;; 对线元数组 group_Line_segments 中的起始桩号进行处理,
- (if (not Z_road_start)
- (setq Z_road_start 0) ; 当线路起始桩号没有定义时,设置为0
- )
- (setq Z Z_road_start) ; 初始化桩号Z 为路线的起始桩号
- (setq group_Line_segments
- (mapcar
- '(lambda (lst / element lenth)
- (setq lst
- (mapcar
- '(lambda (subset)
- (apply '(lambda (x_0 x_1 x_2 x_3 x_4 x_5 x_6 x_7)
- (list x_0 x_1 x_2 x_3 x_4 x_5 (+ Z x_6) x_7)
- )
- subset
- )
- )
- lst
- )
- ) ; (mapcar '(lambda (subset) 函数结束
- ;; 当一个转点 的全部线元处理完毕后, 对该转点的最后一个线元的结束桩号,赋值给Z
- (setq element (last lst)) ; 该转点的最后一个线元
- (if (= (cadr (car element)) 2)
- (setq lenth (car (nth 3 element)))
- ; 当最后一个线元是缓和曲线时
- (setq lenth (nth 3 element))
- )
- (setq Z (+ (nth 6 element) lenth))
- lst ; 保证输出结果为想要的group_Line_segments 数组
- )
- group_Line_segments
- )
- )
- ;; 对group_turning_point 中的交点 ,求其交点桩号,病并求其象限角,以转角的一半为切线方向
- (setq group_data_JD nil) ; 利用数组group_Line_segments和group_parameter (list T1 T2 adjusted_value) 求解
- (setq i 1)
- (setq group_data_JD
- (mapcar '(lambda (lst / T1 Z Z_JD lst2 U ang JD Δ reflex)
- (setq T1 (car lst)
- lst2 (nth i group_Line_segments)
- Z (nth 6 (car lst2))
- ; 该交点中的第一个线元的起点桩号
- Z_JD (+ Z T1)
- reflex (nth 4 (car lst2))
- )
- (setq lst2 (nth i group_turning_point)
- U (cadr lst2)
- JD (car (car lst2))
- Δ (caddr (nth 3 lst2))
- ang (car (nth 3 lst2))
- ang (+ (* 0.5 Δ) ang)
- )
- (setq i (+ i 1))
- (list Z_JD U ang JD reflex)
- )
- group_parameter
- )
- )
- (list group_Line_segments group_data_JD)
- )
- ;; 88888888888 88888888888888 88888888888888888 88888888888888888888
- ;; 输入参数 线元 Line_segments [( 转点号I j) R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert ]
- ;; mold加宽类型 ,mold为0时, 绘制普通加宽,mold=1 时,按直线加宽
- (defun calculate_Transition-curve_widen
- (Z group_widen
- Line_segments mold
- / L widen
- k k_2 k_3
- l_x T_1 T_2
- T_3 widen_x lenth
- lst Z_end
- )
- (apply
- '(lambda (x_0 x_1 x_2 transition_parameter reflex x_5 Z_start x_7)
- (setq I (car x_0) ; 转点的编号
- num (cadr x_0) ; 线元在转点中的编号
- )
- (setq lst (assoc I group_widen)
- ; 寻找转点I 所对应的加宽值
- widen (cadr lst)
- )
- (if (not widen)
- (setq widen 0)
- )
- (if (or (= num 0)
- (= num 2)
- )
- ;; 当线元为缓和曲线时
- (progn
- (setq lenth (car transition_parameter)
- lenth (* lenth 1.0)
- Z_end (+ Z_start lenth)
- )
- (if (and
- (>= Z z_start)
- (<= Z z_end)
- )
- (progn
- (cond
- ;; 当线元为进口缓和曲线时
- ((= num 0)
- (setq L (- Z z_start))
- )
- ;; 当线元为出口缓和曲线时
- ((= num 2)
- (setq L (- z_end z))
- )
- ) ; cond 函数结束
- (setq k (/ L lenth))
- ;; 当 mold为0时, 绘制普通加宽,mold=1 时,按直线加宽
- (cond
- ((= mold 0)
- (setq k_2 (* (expt k 3) 4)
- k_3 (* (expt k 4) 3)
- widen_x (* (- k_2 k_3) widen)
- )
- )
- ((= mold 1)
- (setq widen_x (* k widen))
- )
- ) ; 判断 缓和曲线是否为普通或直线加宽的函数 结束
- )
- ) ; (if (and (>= Z z_start) (< Z z_end) ) 函数结束
- )
- ) ; 处理缓和曲线线元加宽值的 函数结束
- (if (= num 1)
- ;; 当线元为圆曲线时
- (progn
- (setq lenth (* transition_parameter 1.0)
- Z_end (+ Z_start lenth)
- )
- (if (and
- (>= Z z_start)
- (<= Z z_end)
- )
- (setq widen_x widen)
- ) ; (if (and (>= Z z_start) (< Z z_end) ) 函数结束
- )
- ) ; 处理圆曲线线元加宽值的 函数结束
- (if (not widen_x)
- (setq widen_x 0)
- widen_x
- )
- )
- Line_segments
- )
- ) ; calculate_Transition-curve_widen函数结束
- ;; (calculate_Transition-curve_widen 7530 group_widen Line_segments 0 )
- ;; (setq group_widen (write_into_group_widen))
- ;; (setq Line_segments (cadr(nth 2 tang99 ))) (setq mold 0 z 7570 I 25 )
- ;; 对线元参数group_Line_segments [( 转点号num j) R_start R_end transition_parameter reflex quadrant_ang Z_start U_insert ]
- ;; 求出一个新的数组 group_transition ( 转点号num j) (i j k) ,i 和 k 分别为该线元的 前后线元编号 i k 取值为0 ,1 ,2 ,3
- (defun create_group_transition
- (group_Line_segments
- / group_transition
- group n_1
- n group_i
- lst num
- )
- (setq group (apply 'append group_Line_segments))
- ;; 为了计算方便,在数组group的头和尾巴各加入一个数组
- (setq lst (car (car group))
- num (car lst)
- lst (list (list num 3))
- group (append (list lst) group)
- lst (car (last group))
- num (car lst)
- lst (list (list num 3))
- group (append group (list lst))
- )
- (setq n (length group)
- n_1 1
- group_i nil
- )
- (repeat (- n 2)
- (setq group_i (cons n_1 group_i))
- (setq n_1 (+ n_1 1))
- )
- (setq group_i (reverse group_i))
- (setq group_transition nil)
- (mapcar '(lambda (n_1 / lst lst_back lst_front i j k)
- (setq lst (nth n_1 group)
- j (cadr (car lst))
- )
- (setq lst_back (nth (- n_1 1) group)
- lst_front
- (nth (+ n_1 1) group)
- )
- (setq i (cadr (car lst_back))
- k (cadr (car lst_front))
- )
- (setq group_transition
- (cons (list (car lst) (list i j k))
- group_transition
- )
- )
- )
- group_i
- )
- (reverse group_transition)
- ) ; (defun create_group_transition 函数结束
- ;; (setq group_transition ( create_group_transition group_Line_segments ) )
|
|