2022-10-14 08:08:22 +00:00
|
|
|
package dnmshared
|
2022-09-20 15:50:01 +00:00
|
|
|
|
|
|
|
import (
|
2022-11-09 06:20:26 +00:00
|
|
|
. "dnmshared/sharedprotos"
|
2022-09-20 15:50:01 +00:00
|
|
|
"math"
|
|
|
|
)
|
|
|
|
|
2022-10-19 09:32:18 +00:00
|
|
|
func NormVec2D(dx, dy float64) Vec2D {
|
2022-11-09 06:20:26 +00:00
|
|
|
return Vec2D{X: dy, Y: -dx}
|
2022-10-19 09:32:18 +00:00
|
|
|
}
|
|
|
|
|
2022-11-09 04:19:29 +00:00
|
|
|
func AlignPolygon2DToBoundingBox(input *Polygon2D) *Polygon2D {
|
|
|
|
// Transform again to put "anchor" at the top-left point of the bounding box for "resolv"
|
|
|
|
boundingBoxTL := &Vec2D{
|
|
|
|
X: math.MaxFloat64,
|
|
|
|
Y: math.MaxFloat64,
|
|
|
|
}
|
|
|
|
for _, p := range input.Points {
|
|
|
|
if p.X < boundingBoxTL.X {
|
|
|
|
boundingBoxTL.X = p.X
|
|
|
|
}
|
|
|
|
if p.Y < boundingBoxTL.Y {
|
|
|
|
boundingBoxTL.Y = p.Y
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now "input.Anchor" should move to "input.Anchor+boundingBoxTL", thus "boundingBoxTL" is also the value of the negative diff for all "input.Points"
|
|
|
|
output := &Polygon2D{
|
|
|
|
Anchor: &Vec2D{
|
|
|
|
X: input.Anchor.X + boundingBoxTL.X,
|
|
|
|
Y: input.Anchor.Y + boundingBoxTL.Y,
|
|
|
|
},
|
2022-11-09 06:20:26 +00:00
|
|
|
Points: make([]*Vec2D, len(input.Points)),
|
2022-11-09 04:19:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for i, p := range input.Points {
|
|
|
|
output.Points[i] = &Vec2D{
|
|
|
|
X: p.X - boundingBoxTL.X,
|
|
|
|
Y: p.Y - boundingBoxTL.Y,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return output
|
2022-09-20 15:50:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func Distance(pt1 *Vec2D, pt2 *Vec2D) float64 {
|
|
|
|
dx := pt1.X - pt2.X
|
|
|
|
dy := pt1.Y - pt2.Y
|
|
|
|
return math.Sqrt(dx*dx + dy*dy)
|
|
|
|
}
|