坐标计算公式

坐标计算公式直线 x x0 L K cosa0 D cos a0 b x x 0 L K cdotcosa 0 D cdotcos a 0 b x x0 L K cosa0 D

大家好,欢迎来到IT知识分享网。

直线:

x = x 0 + ( L − K ) ⋅ c o s a 0 + D ⋅ c o s ( a 0 ± b ) x=x_{0}+(L-K)\cdot cosa_{0}+D\cdot cos(a_{0}±b) x=x0+(LK)cosa0+Dcos(a0±b)
y = y 0 + ( L − K ) ⋅ s i n a 0 + D ⋅ s i n ( a 0 ± b ) y=y_{0}+(L-K)\cdot sina_{0}+D\cdot sin(a_{0}±b) y=y0+(LK)sina0+Dsin(a0±b)

( x 0 , y 0 ) — — 起 点 坐 标 , K , L — — 起 终 点 桩 号 (x_{0},y_{0})——起点坐标,K,L——起终点桩号 (x0,y0)K,L
( x 0 , y 0 ) — — 起 点 坐 标 , K , L — — 起 终 点 桩 号 (x_{0},y_{0})——起点坐标,K,L——起终点桩号 (x0,y0)K,L
a 0 — — 起 点 方 位 角 , b — — 偏 移 角 度 , D — — 偏 距 a_{0}——起点方位角,b——偏移角度,D——偏距 a0bD

圆曲线:

a = a 0 ± 180 ⋅ ( L − K ) π R ( 单 位 是 角 度 ) a=a_{0}±\frac{180\cdot (L-K)}{πR}(单位是角度) a=a0±πR180(LK)
x = x 0 + R ⋅ [ c o s ( a 0 ± 90 ) + c o s ( a ± 90 ) ] + D ⋅ c o s ( a ± b ) x=x_{0}+R\cdot [ cos(a_{0}±90)+cos(a±90)]+D\cdot cos(a±b) x=x0+R[cos(a0±90)+cos(a±90)]+Dcos(a±b)
y = y 0 + R ⋅ [ s i n ( a 0 ± 90 ) + s i n ( a ± 90 ) ] + D ⋅ s i n ( a ± b ) y=y_{0}+R\cdot [ sin(a_{0}±90)+sin(a±90)]+D\cdot sin(a±b) y=y0+R[sin(a0±90)+sin(a±90)]+Dsin(a±b)

( x 0 , y 0 ) : 起 点 坐 标 ; K , L : 起 终 点 桩 号 ; R : 半 径 ; D : 偏 距 ( 左 减 右 加 ) (x_{0},y_{0}):起点坐标;K,L:起终点桩号;R:半径;D:偏距(左减右加) (x0,y0):;K,L:;R:;D:
a 0 : 起 点 方 位 角 ; a : 待 求 点 方 位 角 ; b : 偏 移 角 度 a_{0}:起点方位角;a:待求点方位角;b:偏移角度 a0:;a:;b:
第 一 个 ± 是 左 减 右 加 , 第 二 个 ± 是 左 加 右 减 第一个±是左减右加,第二个±是左加右减 ±±

缓和曲线:

A = R ⋅ L h A=\sqrt{R\cdot L_{h}} A=RLh

△ x = ( L − K ) − ( L − K ) 5 40 A 4 + ( L − K ) 9 3456 A 8 \triangle x=(L-K)-\frac{(L-K)^{5}}{40A^{4}}+\frac{(L-K)^{9}}{3456A^{8}} x=(LK)40A4(LK)5+3456A8(LK)9
△ y = ( L − K ) 3 6 A 2 − ( L − K ) 7 336 A 6 + ( L − K ) 11 42240 A 10 \triangle y=\frac{(L-K)^{3}}{6A^{2}}-\frac{(L-K)^{7}}{336A^{6}}+\frac{(L-K)^{11}}{42240A^{10}} y=6A2(LK)3336A6(LK)7+42240A10(LK)11
△ L = △ x 2 + △ y 2 \triangle L=\sqrt{\triangle x^2+\triangle y^2} L=x2+y2

△ a = a r c t a n ( △ y △ x ) \triangle a=arctan(\frac{\triangle y}{\triangle x}) a=arctan(xy)
a = a 0 ± 90 ⋅ ( L − K ) 2 π A 2 ( 单 位 是 角 度 ) a=a_{0}±\frac{90\cdot (L-K)^{2}}{πA^{2}}(单位是角度) a=a0±πA290(LK)2
x = x 0 + △ L ⋅ c o s ( a 0 ± △ a ) + D ⋅ c o s ( a ± b ) x=x_{0}+\triangle L\cdot cos(a_{0}±\triangle a)+D\cdot cos(a±b) x=x0+Lcos(a0±a)+Dcos(a±b)
y = y 0 + △ L ⋅ s i n ( a 0 ± △ a ) + D ⋅ s i n ( a ± b ) y=y_{0}+\triangle L\cdot sin(a_{0}±\triangle a)+D\cdot sin(a±b) y=y0+Lsin(a0±a)+Dsin(a±b)






A : 缓 和 曲 线 参 数 ; R : 半 径 ; L h : 缓 和 曲 线 长 度 ; △ x △ y : 坐 标 增 量 A:缓和曲线参数;R:半径;L_{h}:缓和曲线长度;\triangle x\triangle y:坐标增量 A:线;R:;Lh:线;xy:
K , L : 起 终 点 桩 号 ; △ L : 距 离 ; △ a : 切 线 夹 角 ( 左 减 右 加 ) ; ( x 0 , y 0 ) : 起 点 坐 标 K,L:起终点桩号;\triangle L:距离;\triangle a:切线夹角(左减右加);(x_{0},y_{0}):起点坐标 K,L:;L:;a:线;(x0,y0):
a 0 : 起 点 方 位 角 ; a : 待 求 点 方 位 角 ; b : 偏 移 角 度 a_{0}:起点方位角;a:待求点方位角;b:偏移角度 a0:;a:;b:

n — — 项 数 序 号 , ! — — 阶 乘 , R — — 圆 曲 线 半 径 , L s — — 缓 和 曲 线 长 , A — — 缓 和 曲 线 参 数 n——项数序号,!——阶乘,R——圆曲线半径,L_{s}——缓和曲线长,A——缓和曲线参数 nR线Ls线A线
P S : 一 般 取 公 式 前 6 项 满 足 小 半 径 的 缓 和 曲 线 计 算 精 度 PS:一般取公式前6项满足小半径的缓和曲线计算精度 PS6线

卵曲线:

解 决 卵 曲 线 的 的 问 题 , 重 点 在 于 将 其 转 换 为 完 整 的 缓 和 曲 线 ; 解决卵曲线的的问题,重点在于将其转换为完整的缓和曲线; 线线;
找 出 真 正 的 起 点 坐 标 , 起 点 方 位 角 , 以 及 起 点 桩 号 , 然 后 代 入 缓 和 曲 线 公 式 进 行 计 算 ; 找出真正的起点坐标,起点方位角,以及起点桩号,然后代入缓和曲线公式进行计算; 线;
残 缺 段 为 半 径 ∞ 的 卵 曲 线 计 算 方 法 : 残缺段为半径\infty的卵曲线计算方法: 线

C = A 2 = l R 大 R 小 R 大 − R 小 C=A^{2}=\frac{lR_{大}R_{小}}{R_{大}-R_{小}} C=A2=RRlRR
l 弦 = C R 大 − C 3 90 ⋅ R 大 5 l_{弦}=\frac{C}{R_{大}}-\frac{C^{3}}{90\cdot R_{大}^{5}} l=RC90R5C3
a 弦 = a ± C 3 R 大 2 ( 弧 度 ) a_{弦}=a±\frac{C}{3R_{大}^{2}}(弧度) a=a±3R2C
a 0 = a ± C 2 R 大 2 ( 弧 度 ) a_{0}=a±\frac{C}{2R_{大}^{2}}(弧度) a0=a±2R2C
x 0 = x + l 弦 ⋅ c o s ( a 弦 + 180 ) x_{0}=x+l_{弦}\cdot cos(a_{弦}+180) x0=x+lcos(a+180)
y 0 = y + l 弦 ⋅ s i n ( a 弦 + 180 ) y_{0}=y+l_{弦}\cdot sin(a_{弦}+180) y0=y+lsin(a+180)
K = L − C R 小 K = L-\frac{C}{R_{小}} K=LRC





A : 缓 和 曲 线 参 数 , l : 非 完 整 缓 和 曲 线 长 度 , R 大 , R 小 : 非 完 整 缓 和 曲 线 两 端 的 半 径 A:缓和曲线参数,l:非完整缓和曲线长度,R_{大},R_{小}:非完整缓和曲线两端的半径 A:线l线R,R线
l 弦 : 残 缺 段 缓 和 曲 线 的 弦 长 , a 弦 : 残 缺 段 缓 和 曲 线 弦 的 方 位 角 , a 0 : 起 点 方 位 角 l_{弦}:残缺段缓和曲线的弦长,a_{弦}:残缺段缓和曲线弦的方位角,a_{0}:起点方位角 l线a线a0
x 0 , y 0 : 起 点 坐 标 , K , L : 起 终 点 桩 号 x_{0},y_{0}:起点坐标,K,L:起终点桩号 x0,y0:K,L:

源码:

# -*- coding: utf-8 -*- # @Author:  # @Date: 2019-10-30 18:23:29 # @Last Modified by:  # @Last Modified time: 2019-11-06 16:37:29 # data = [x0,y0,a0,k,l,r0,r1,t,L,d,b]  继承  # (x0,y0) 起点坐标(data[0],data[1]) # a0 起点方位角(data[2]) # k 起点里程(data[3])  提供  # l 终点里程(data[4]) # r0 起点半径(data[5]) # r1 终点半径(data[6]) # t 转向(data[7])  固定  # L 待求里程(data[8]) # d 偏距(data[9]) # b 旋转角度(data[10])  待求  # (x,y) 待求点坐标 # a 待求点方位角  输出  # (x1,y1) 终点坐标 # a1 终点方位角 # l 终点里程 import math as m import numpy as np def data(name): if name == '松岗主线': # 起点坐标(x,y),起点方位角,起点里程 data_start = [42814.2898, 91516.6697, dfm_to_x(119, 13, 28.1), 7715.405] # 曲线类型,终点里程,起点半径,终点半径,偏向(无穷大和没有都视为零) data = [['直线', 8384.071, 0, 0, 0], ['缓和曲线', 8614.071, 0, 1560, -1], ['圆曲线', 9134.734, 1560, 1560, -1], ['缓和曲线', 9364.734, 1560, 0, -1], ['直线', 10017.163, 0, 0, 0], ['缓和曲线', 10197.163, 0, 1290, 1], ['圆曲线', 11248.951, 1290, 1290, 1], ['缓和曲线', 11428.951, 1290, 0, 1], ['直线', 11648.042, 0, 0, 0], ['缓和曲线', 11828.042, 0, 1290, -1], ['圆曲线', 12372.275, 1290, 1290, -1], ['缓和曲线', 12552.275, 1290, 0, -1], ['直线', 13355.558, 0, 0, 0], ['缓和曲线', 13555.558, 0, 1550, 1], ['圆曲线', 14699.663, 1550, 1550, 1], ['缓和曲线', 14899.663, 1550, 0, 1]] return data_start, data def dfm_to_x(x, y, z): # 度分秒-弧度 x = x + y / 60 + z / 3600 return m.radians(x) def z(data): # x0,y0,a0,k,l,r0,r1,t,L,d,b if data[8] <= data[3]: # 待求点里程小于等于起点里程 return data[:3] + [data[4]] # 直接返回初始值 else: if data[8] > data[4]: # 待求点里程大于终点里程 L = data[4] # 取终点里程 data[9] = 0 # 偏距归零 else: L = data[8] # 取待求点里程 x = data[0] + (L - data[3]) * m.cos(data[2]) + data[9] * m.cos(data[2] + m.radians(data[10])) y = data[1] + (L - data[3]) * m.sin(data[2]) + data[9] * m.sin(data[2] + m.radians(data[10])) return [x, y, data[2], data[4]] def y(data): # x0,y0,a0,k,l,r0,r1,t,L,d,b if data[8] <= data[3]: # 待求点里程小于等于起点里程 return data[:3] + [data[4]] # 直接返回初始值 else: if data[8] > data[4]: # 待求点里程大于终点里程 L = data[4] # 取终点里程 data[9] = 0 # 偏距归零 else: L = data[8] # 取待求点里程 a = data[2] + np.sign(data[7]) * (L - data[3]) / data[5] x = data[0] + data[5] * (m.cos(data[2] + np.sign(data[7]) * 0.5 * m.pi) + m.cos(a - np.sign(data[7]) * 0.5 * m.pi)) + data[9] * m.cos(a + m.radians(data[10])) y = data[1] + data[5] * (m.sin(data[2] + np.sign(data[7]) * 0.5 * m.pi) + m.sin(a - np.sign(data[7]) * 0.5 * m.pi)) + data[9] * m.sin(a + m.radians(data[10])) return [x, y, a, data[4]] def h(data): # x0,y0,a0,k,l,r0,r1,t,L,d,b if data[8] <= data[3]: # 待求点里程小于等于起点里程 return data[:3] + [data[4]] # 直接返回初始值 else: if data[5] == 0: # 入缓和曲线 if data[8] > data[4]: # 待求点里程大于终点里程 L = data[4] # 取终点里程 data[9] = 0 # 偏距归零 else: L = data[8] # 取待求点里程 A = m.pow(data[6] * (data[4] - data[3]), 0.5) dx = dy = 0 for i in range(1, 7): dx = dx + m.pow(-1, i + 1) * m.pow(L - data[3], 4 * i - 3) / (m.factorial(2 * i - 2) * m.pow(2, 2 * i - 2) * (4 * i - 3) * m.pow(A, 4 * i - 4)) dy = dy + m.pow(-1, i + 1) * m.pow(L - data[3], 4 * i - 1) / (m.factorial(2 * i - 1) * m.pow(2, 2 * i - 1) * (4 * i - 1) * m.pow(A, 4 * i - 2)) dl = m.hypot(dx, dy) dx = dx + m.pow(10, -100) da = m.atan(dy / dx) a = data[2] + np.sign(data[7]) * m.pow(L - data[3], 2) / (2 * A * A) x = data[0] + dl * m.cos(data[2] + np.sign(data[7]) * da) + data[9] * m.cos(a + m.radians(data[10])) y = data[1] + dl * m.sin(data[2] + np.sign(data[7]) * da) + data[9] * m.sin(a + m.radians(data[10])) return [x, y, a, data[4]] if data[6] == 0: # 出缓和曲线 A = m.pow(data[5] * (data[4] - data[3]), 0.5) dx = dy = 0 for i in range(1, 7): dx = dx + m.pow(-1, i + 1) * m.pow(data[4] - data[3], 4 * i - 3) / (m.factorial(2 * i - 2) * m.pow(2, 2 * i - 2) * (4 * i - 3) * m.pow(A, 4 * i - 4)) dy = dy + m.pow(-1, i + 1) * m.pow(data[4] - data[3], 4 * i - 1) / (m.factorial(2 * i - 1) * m.pow(2, 2 * i - 1) * (4 * i - 1) * m.pow(A, 4 * i - 2)) dl = m.hypot(dx, dy) dx = dx + m.pow(10, -100) da = m.atan(dy / dx) a0 = data[2] + np.sign(data[7]) * m.pow(data[4] - data[3], 2) / (2 * A * A) x = data[0] - dl * m.cos(a0 + m.pi - np.sign(data[7]) * da) y = data[1] - dl * m.sin(a0 + m.pi - np.sign(data[7]) * da) if data[8] > data[4]: # 待求点里程大于终点里程 L = data[4] # 取终点里程 data[9] = 0 # 偏距归零 else: L = data[8] # 取待求点里程 dx = dy = 0 for i in range(1, 7): dx = dx + m.pow(-1, i + 1) * m.pow(data[4] - L, 4 * i - 3) / (m.factorial(2 * i - 2) * m.pow(2, 2 * i - 2) * (4 * i - 3) * m.pow(A, 4 * i - 4)) dy = dy + m.pow(-1, i + 1) * m.pow(data[4] - L, 4 * i - 1) / (m.factorial(2 * i - 1) * m.pow(2, 2 * i - 1) * (4 * i - 1) * m.pow(A, 4 * i - 2)) dl = m.hypot(dx, dy) dx = dx + m.pow(10, -100) da = m.atan(dy / dx) a = a0 - np.sign(data[7]) * m.pow(data[4] - L, 2) / (2 * A * A) x = x + dl * m.cos(a0 + m.pi - np.sign(data[7]) * da) + data[9] * m.cos(a + m.radians(data[10])) y = y + dl * m.sin(a0 + m.pi - np.sign(data[7]) * da) + data[9] * m.sin(a + m.radians(data[10])) return [x, y, a, data[4]] # 卵曲线 # x0,y0,a0,k,l,r0,r1,t,L,d,b if data[5] > data[6] > 0: # 入卵曲线r0>r1 dL = data[4] - data[3] # 卵曲线全长 c = dL * data[5] * data[6] / (data[5] - data[6]) l_xuan = c / data[5] - m.pow(c, 3) / (90 * m.pow(data[5], 5)) a_xuan = data[2] - np.sign(data[7]) * c / 3 / m.pow(data[5], 2) a = data[2] - np.sign(data[7]) * c / 2 / m.pow(data[5], 2) x = data[0] + l_xuan * m.cos(a_xuan + m.pi) y = data[1] + l_xuan * m.sin(a_xuan + m.pi) L_start = data[4] - c / data[6] return h([x, y, a, L_start, data[4], 0] + data[6:]) if data[6] > data[5] > 0: # 出卵曲线r0<r1 if data[8] > data[4]: # 待求点里程大于终点里程 data[8] = data[4] # 取终点里程 data[9] = 0 # 偏距归零 # x0,y0,a0,k,l,r0,r1,t,L,d,b dL = data[4] - data[3] # 卵曲线全长 c = dL * data[5] * data[6] / (data[6] - data[5]) l = c / data[5] return h(data[:4] + [data[3] + l] + [data[5], 0] + data[7:])[:3] + [data[4]] def main(data_start, data, data_dq): for i in range(len(data)): if data[i][0] == '直线': data_start = z(data_start + data[i][1:] + data_dq) if data[i][0] == '缓和曲线': data_start = h(data_start + data[i][1:] + data_dq) if data[i][0] == '圆曲线': data_start = y(data_start + data[i][1:] + data_dq) # 格式化输出结果 data_start[0] = round(data_start[0], 4) data_start[1] = round(data_start[1], 4) data_start[2] = m.degrees(data_start[2]) return data_start if __name__ == '__main__': name = '松岗主线' data_dq = [10000, 0, 90] print(main(data(name)[0], data(name)[1], data_dq)) 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/136332.html

(0)
上一篇 2025-06-28 14:00
下一篇 2025-06-28 14:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信