You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.4 KiB
55 lines
1.4 KiB
// Copyright 2011 The Graphics-Go Authors. All rights reserved. |
|
// Use of this source code is governed by a BSD-style |
|
// license that can be found in the LICENSE file. |
|
|
|
package detect |
|
|
|
import ( |
|
"image" |
|
) |
|
|
|
// projector allows projecting from a source Rectangle onto a target Rectangle. |
|
type projector struct { |
|
// rx, ry is the scaling factor. |
|
rx, ry float64 |
|
// dx, dy is the translation factor. |
|
dx, dy float64 |
|
// r is the clipping region of the target. |
|
r image.Rectangle |
|
} |
|
|
|
// newProjector creates a Projector with source src and target dst. |
|
func newProjector(dst image.Rectangle, src image.Rectangle) *projector { |
|
return &projector{ |
|
rx: float64(dst.Dx()) / float64(src.Dx()), |
|
ry: float64(dst.Dy()) / float64(src.Dy()), |
|
dx: float64(dst.Min.X - src.Min.X), |
|
dy: float64(dst.Min.Y - src.Min.Y), |
|
r: dst, |
|
} |
|
} |
|
|
|
// pt projects p from the source rectangle onto the target rectangle. |
|
func (s *projector) pt(p image.Point) image.Point { |
|
return image.Point{ |
|
clamp(s.rx*float64(p.X)+s.dx, s.r.Min.X, s.r.Max.X), |
|
clamp(s.ry*float64(p.Y)+s.dy, s.r.Min.Y, s.r.Max.Y), |
|
} |
|
} |
|
|
|
// rect projects r from the source rectangle onto the target rectangle. |
|
func (s *projector) rect(r image.Rectangle) image.Rectangle { |
|
return image.Rectangle{s.pt(r.Min), s.pt(r.Max)} |
|
} |
|
|
|
// clamp rounds and clamps o to the integer range [x0, x1]. |
|
func clamp(o float64, x0, x1 int) int { |
|
x := int(o + 0.5) |
|
if x < x0 { |
|
return x0 |
|
} |
|
if x > x1 { |
|
return x1 |
|
} |
|
return x |
|
}
|
|
|