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 }