package gojts
const DISTMIN = 0.000001
type Segment struct {
Start, End geom.XY
}
func (s Segment) Length() float64 {
return s.End.Sub(s.Start).Length()
}
/**
x := segment.Start.X + (segment.End.X-segment.Start.X)*0.4
y := segment.Start.Y + (segment.End.Y-segment.Start.Y)*0.4
fmt.Println(x, y)
fmt.Println(segment.Start.Add(segment.End.Sub(segment.Start).Scale(rate)))
**/
func distValid(dist float64) {
if dist < DISTMIN {
panic("dist can not < 0")
}
}
func (s Segment) Interpolate(dist float64) geom.XY {
distValid(dist)
length := s.Length()
if dist < length {
rate := dist / length
return s.Start.Add(s.End.Sub(s.Start).Scale(rate))
} else {
return s.End
}
}
func Interpolate(linestring geom.LineString, dist float64) geom.XY {
distValid(dist)
seq := linestring.Coordinates()
for i := 0; i < seq.Length(); i++ {
segment := Segment{Start: seq.GetXY(i), End: seq.GetXY(i + 1)}
length := segment.Length()
if dist <= length {
return segment.Interpolate(dist)
} else {
dist -= length
}
}
return geom.XY{X: -9999, Y: -9999}
}
package gojts
type Segment2 struct {
Start, End r2.Vec
}
func (s Segment2) Length() float64 {
return r2.Norm(r2.Sub(s.End, s.Start))
}
func (s Segment2) Interpolate(dist float64) r2.Vec {
distValid(dist)
length := s.Length()
if dist < length {
rate := dist / length
return r2.Add(s.Start, r2.Scale(rate, r2.Sub(s.End, s.Start)))
} else {
return s.End
}
}
func Interpolate2(linestring geom.LineString, dist float64) r2.Vec {
distValid(dist)
coords := linestring.Coords()
for i := 0; i < len(coords); i++ {
start := coords[i]
end := coords[i+1]
segment := Segment2{Start: r2.Vec{X: start[0], Y: start[1]}, End: r2.Vec{X: end[0], Y: end[1]}}
length := segment.Length()
if dist <= length {
return segment.Interpolate(dist)
} else {
dist -= length
}
}
return r2.Vec{X: -9999, Y: -9999}
}
网友评论