坐标计算公式

直线:

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:

缓和曲线切线支距通式:
X n = ( − 1 ) n + 1 ⋅ L 4 n − 3 ( 2 n − 2 ) ! ⋅ 2 2 n − 2 ⋅ ( 4 n − 3 ) ⋅ A 4 n − 4 X_{n}=\frac{(-1)^{n+1} \cdot L^{4n-3}}{(2n-2)! \cdot 2^{2n-2} \cdot (4n-3) \cdot A^{4n-4}} Xn=(2n2)!22n2(4n3)A4n4(1)n+1L4n3
Y n = ( − 1 ) n + 1 ⋅ L 4 n − 1 ( 2 n − 1 ) ! ⋅ 2 2 n − 1 ⋅ ( 4 n − 1 ) ⋅ A 4 n − 2 Y_{n}=\frac{(-1)^{n+1} \cdot L^{4n-1}}{(2n-1)! \cdot 2^{2n-1} \cdot (4n-1) \cdot A^{4n-2}} Yn=(2n1)!22n1(4n1)A4n2(1)n+1L4n1
A 2 = R ⋅ L s A^{2} = R\cdot L_{s} A2=RLs

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: 963561673
# @Date:   2019-10-30 18:23:29
# @Last Modified by:   963561673
# @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))
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值