rtss-core/model/kilometer_mark.go

88 lines
2.5 KiB
Go
Raw Normal View History

package model
import (
"fmt"
"strconv"
)
// 公里标
// 类似地铁线路一般正线都是双线公里标一般以类似YDK/ZDK开头
// 虽然从信号布置图上看YDK/ZDK相近位置的值似乎是一样的以为他们是同一个坐标系
// 但这种情况的原因其实是因为两条线的起始点很接近,他们依然是两个独立的坐标系。
// 左线和右线中间有渡线可以相互切换,但公里标如何转换暂时不清楚,
// 暂时考虑先通过添加转换配置来实现比如转换可以配置0或根据道岔处勾股定理大概估算虽然不同道岔处可能不一样但暂时不考虑复杂情况
type KilometerMark struct {
// 公里标坐标系
coordinate string
// 公里标值
value int64
}
func NewKilometerMark(coordinate string, value int64) *KilometerMark {
return &KilometerMark{
coordinate: coordinate,
value: value,
}
}
func (km *KilometerMark) Coordinate() string {
return km.coordinate
}
func (km *KilometerMark) Value() int64 {
return km.value
}
// 是否为同一坐标系
func (km *KilometerMark) IsCoordinateEqual(coordinate string) bool {
return km.coordinate == coordinate
}
// 公里标转换配置
type KilometerMarkConverter struct {
km1 *KilometerMark
km2 *KilometerMark
// 趋势是否相同
trendSame bool
}
func NewKilometerMarkConverter(km1, km2 *KilometerMark, trendSame bool) *KilometerMarkConverter {
if km1 == nil || km2 == nil {
panic("km1 or km2 is nil")
}
return &KilometerMarkConverter{
km1: km1,
km2: km2,
trendSame: trendSame,
}
}
func (kmc *KilometerMarkConverter) Debug() string {
return fmt.Sprintf("{%s<->%s(%s)}", kmc.km1.coordinate, kmc.km2.coordinate, strconv.FormatBool(kmc.trendSame))
}
func (kmc *KilometerMarkConverter) IsMatch(km *KilometerMark, coordinate2 string) bool {
coordinate1 := km.coordinate
return kmc.km1.coordinate == coordinate1 && kmc.km2.coordinate == coordinate2 ||
kmc.km1.coordinate == coordinate2 && kmc.km2.coordinate == coordinate1
}
// 将源公里标km转换为目标坐标系targetCoordinate的公里标值
func (kmc *KilometerMarkConverter) Convert(km *KilometerMark, targetCoordinate string) int64 {
var tvalue int64 = 0
if kmc.km1.IsCoordinateEqual(km.coordinate) {
if kmc.trendSame {
tvalue = km.value - kmc.km1.value + kmc.km2.value
} else {
tvalue = kmc.km1.value - km.value + kmc.km2.value
}
} else {
if kmc.trendSame {
tvalue = km.value - kmc.km2.value + kmc.km1.value
} else {
tvalue = kmc.km2.value - km.value + kmc.km1.value
}
}
return tvalue
}