142 lines
2.5 KiB
Go
142 lines
2.5 KiB
Go
|
package model
|
|||
|
|
|||
|
import "log/slog"
|
|||
|
|
|||
|
// link端口
|
|||
|
type Link_Port int
|
|||
|
|
|||
|
const (
|
|||
|
LinkPort_A Link_Port = -1
|
|||
|
LinkPort_B Link_Port = 1
|
|||
|
)
|
|||
|
|
|||
|
// Link
|
|||
|
type Link interface {
|
|||
|
Model
|
|||
|
// Link总长度
|
|||
|
Length() int64
|
|||
|
// 获取端口A关联的道岔
|
|||
|
GetPaTurnout() Turnout
|
|||
|
// 获取端口B关联的道岔
|
|||
|
GetPbTurnout() Turnout
|
|||
|
// 下一个link及端口
|
|||
|
// port - 当前link端口
|
|||
|
// tpos - 当前道岔位置
|
|||
|
Next(port Link_Port, tpos TurnoutPosition) *LinkPort
|
|||
|
}
|
|||
|
|
|||
|
type LinkPort struct {
|
|||
|
link Link
|
|||
|
port Link_Port
|
|||
|
}
|
|||
|
|
|||
|
func NewLinkPort(link Link, port Link_Port) *LinkPort {
|
|||
|
return &LinkPort{
|
|||
|
link: link,
|
|||
|
port: port,
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// link偏移位置
|
|||
|
// 默认linkA端口偏移为0,从A到B为增大,从B到A为减小
|
|||
|
type LinkOffset struct {
|
|||
|
link Link
|
|||
|
offset int64 // 偏移坐标,link相当于一个一维坐标系,以端口A为原点
|
|||
|
}
|
|||
|
|
|||
|
// 创建link偏移位置,若offset超出link长度则返回nil
|
|||
|
func NewLinkOffset(link Link, offset int64) *LinkOffset {
|
|||
|
if offset < 0 || offset > link.Length() {
|
|||
|
return nil
|
|||
|
}
|
|||
|
return &LinkOffset{
|
|||
|
link: link,
|
|||
|
offset: offset,
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func (l *LinkOffset) Link() Link {
|
|||
|
return l.link
|
|||
|
}
|
|||
|
func (l *LinkOffset) Offset() int64 {
|
|||
|
return l.offset
|
|||
|
}
|
|||
|
|
|||
|
// link偏移范围
|
|||
|
type LinkRange struct {
|
|||
|
link Link
|
|||
|
start int64
|
|||
|
end int64
|
|||
|
}
|
|||
|
|
|||
|
func NewLinkRange(link Link, a int64, b int64) *LinkRange {
|
|||
|
if a < 0 || a > link.Length() {
|
|||
|
slog.Error("创建link偏移范围失败: 超出link长度范围", slog.Int64("a", a))
|
|||
|
return nil
|
|||
|
} else if b < 0 || b > link.Length() {
|
|||
|
slog.Error("创建link偏移范围失败: 超出link长度范围", slog.Int64("b", b))
|
|||
|
return nil
|
|||
|
}
|
|||
|
var start int64
|
|||
|
var end int64
|
|||
|
if a > b {
|
|||
|
start = b
|
|||
|
end = a
|
|||
|
} else {
|
|||
|
start = a
|
|||
|
end = b
|
|||
|
}
|
|||
|
return &LinkRange{
|
|||
|
link: link,
|
|||
|
start: start,
|
|||
|
end: end,
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 是否相交
|
|||
|
func (l *LinkRange) IsIntersect(other *LinkRange) bool {
|
|||
|
if l.link != other.link {
|
|||
|
return false
|
|||
|
}
|
|||
|
if l.start > other.end || other.start > l.end {
|
|||
|
return false
|
|||
|
}
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
// 是否相交
|
|||
|
func (l *LinkRange) IsIntersect2(a, b int64) bool {
|
|||
|
var start int64
|
|||
|
var end int64
|
|||
|
if a > b {
|
|||
|
start = b
|
|||
|
end = a
|
|||
|
} else {
|
|||
|
start = a
|
|||
|
end = b
|
|||
|
}
|
|||
|
if start > l.end || end < l.start {
|
|||
|
return false
|
|||
|
}
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
// 是否在范围内
|
|||
|
func (l *LinkRange) IsInRange(lo *LinkOffset) bool {
|
|||
|
if lo.link != l.link {
|
|||
|
return false
|
|||
|
}
|
|||
|
if lo.offset < l.start || lo.offset > l.end {
|
|||
|
return false
|
|||
|
}
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
// 偏移坐标是否在范围内
|
|||
|
func (l *LinkRange) IsInRange2(offset int64) bool {
|
|||
|
if offset < l.start || offset > l.end {
|
|||
|
return false
|
|||
|
}
|
|||
|
return true
|
|||
|
}
|