4 #include "boost/geometry/geometry.hpp" 5 #include <boost/container_hash/hash.hpp> 16 #include "lsst/afw/table/io/Persistable.cc" 22 typedef boost::geometry::model::box<LsstPoint>
BoostBox;
40 typedef cs::cartesian
type;
43 struct dimension<
LsstPoint> : boost::mpl::int_<2> {};
44 template <std::
size_t dim>
45 struct access<LsstPoint, dim> {
46 static double get(LsstPoint
const& p) {
return p[dim]; }
117 for (
size_t i = 1; i < num; ++i) {
126 boost::geometry::intersection(poly, pixel, overlap);
129 double const polyArea = boost::geometry::area(*i);
137 int const xStart,
int const xStop,
int const y) {
140 x <= xStop; ++i, ++
x) {
141 *i = pixelOverlap(poly, x, y);
160 for (
size_t i = 0; i < num - 1; ++i) {
169 return os <<
"BoostPolygon(" << poly.outer() <<
")";
180 boost::geometry::assign(
poly, box);
184 boost::geometry::assign(
poly, vertices);
195 template <
class PolyT>
197 return !boost::geometry::disjoint(
poly, other);
200 template <
class PolyT>
203 template <
class PolyT>
206 template <
class PolyT>
209 template <
class PolyT>
212 template <
class PolyT>
229 template <
class PolyT>
232 boost::geometry::intersection(
poly, other, result);
233 if (result.
size() == 0) {
236 if (result.
size() > 1) {
244 template <
class PolyT>
247 boost::geometry::intersection(
poly, other, boostResult);
248 return convertBoostPolygons(boostResult);
251 template <
class PolyT>
254 boost::geometry::union_(
poly, other, result);
255 if (result.
size() != 1) {
263 template <
class PolyT>
266 boost::geometry::union_(
poly, other, boostResult);
267 return convertBoostPolygons(boostResult);
270 template <
class PolyT>
273 boost::geometry::sym_difference(
poly, other, boostResult);
274 return convertBoostPolygons(boostResult);
277 Polygon::Polygon(
Polygon const&) =
default;
278 Polygon::Polygon(
Polygon&&) =
default;
282 Polygon::~Polygon() =
default;
290 auto corners = transform.
applyForward(boxToCorners(box));
291 boost::geometry::assign(_impl->poly, corners);
301 boost::geometry::assign(_impl->poly, corners);
307 return boost::geometry::num_points(_impl->poly) - 1;
311 return boostBoxToLsst(boost::geometry::return_envelope<BoostBox>(_impl->poly));
315 return boost::geometry::return_centroid<LsstPoint>(_impl->poly);
327 j != vertices.
end(); ++i, ++j) {
338 return _impl->poly.outer().end() - 1;
342 return boost::geometry::equals(_impl->poly, other._impl->poly);
348 static boost::hash<BoostPolygon::ring_type> polygonHash;
349 return polygonHash(_impl->poly.outer());
359 return _impl->intersectionSingle(other._impl->poly);
363 return _impl->intersectionSingle(box);
367 return _impl->intersection(other._impl->poly);
371 return _impl->intersection(box);
375 return _impl->unionSingle(other._impl->poly);
381 return _impl->union_(other._impl->poly);
387 return _impl->symDifference(other._impl->poly);
391 return _impl->symDifference(box);
396 boost::geometry::simplify(_impl->poly, result, distance);
402 boost::geometry::convex_hull(_impl->poly, hull);
415 i != _impl->poly.outer().end(); ++i) {
426 addSubSampledEdge(vertices, i->first, i->second, num);
436 Point const &p1 = i->first, p2 = i->second;
438 addSubSampledEdge(vertices, p1, p2, static_cast<size_t>(::
ceil(dist / maxLength)));
446 image->setXY0(bbox.
getMin());
453 for (
int y = yMin;
y <= yMax; ++
y) {
454 double const yPixelMin = (double)
y - 0.5, yPixelMax = (
double)
y + 0.5;
456 boost::geometry::assign(
459 boost::geometry::intersection(_impl->poly, row, intersections);
461 if (intersections.
size() == 1 && boost::geometry::num_points(intersections[0]) == 5) {
470 double const xCoord = i->getX(), yCoord = i->getY();
471 if (yCoord == yPixelMin) {
473 }
else if (yCoord == yPixelMax) {
480 if (!failed && top.
size() == 2 && bottom.
size() == 2) {
483 int const xMin =
std::min(top[0], bottom[0]);
485 int const xStop =
std::min(top[1], bottom[1]) - 1;
490 for (Image::x_iterator i = image->x_at(
std::max(xStart, bbox.
getMinX()) - image->getX0(),
504 double xMinRow = xMax, xMaxRow = xMin;
507 double const x = q->getX();
508 if (x < xMinRow) xMinRow =
x;
509 if (x > xMaxRow) xMaxRow =
x;
512 pixelRowOverlap(image, _impl->poly,
std::max(static_cast<int>(xMinRow), bbox.
getMinX()),
526 struct PolygonSchema {
530 static PolygonSchema
const&
get() {
531 static PolygonSchema instance;
536 PolygonSchema(
const PolygonSchema&) =
delete;
537 PolygonSchema&
operator=(
const PolygonSchema&) =
delete;
540 PolygonSchema(PolygonSchema&&) =
delete;
541 PolygonSchema&
operator=(PolygonSchema&&) =
delete;
548 schema.getCitizen().markPersistent();
552 class PolygonFactory :
public table::io::PersistableFactory {
554 explicit PolygonFactory(
std::string const&
name) : table::io::PersistableFactory(name) {}
557 CatalogVector
const& catalogs)
const override {
558 static PolygonSchema
const&
keys = PolygonSchema::get();
565 vertices.
push_back(iter->get(keys.vertices));
572 std::string getPolygonPersistenceName() {
return "Polygon"; }
574 PolygonFactory registration(getPolygonPersistenceName());
581 static PolygonSchema
const&
keys = PolygonSchema::get();
587 record->set(keys.vertices, *i);
std::shared_ptr< Polygon > convexHull() const
Produce a polygon from the convex hull.
double getMinY() const noexcept
bool operator==(Polygon const &other) const
std::vector< Point >::const_iterator begin() const
Iterator for vertices.
std::vector< std::shared_ptr< Polygon > > intersection(Polygon const &other) const
Returns the intersection of two polygons.
Extent< int, N > ceil(Extent< double, N > const &input) noexcept
Return the component-wise ceil (round towards more positive).
Polygon & operator=(Polygon const &)
boost::geometry::model::box< LsstPoint > BoostBox
Impl(BoostPolygon const &_poly)
bool overlaps(Polygon const &other) const
Returns whether the polygons overlap each other.
A floating-point coordinate rectangle geometry.
CatalogT< BaseRecord > BaseCatalog
An object passed to Persistable::write to allow it to persist itself.
lsst::afw::geom::polygon::Polygon::Point LsstPoint
Low-level polynomials (including special polynomials) in C++.
double getMinX() const noexcept
A coordinate class intended to represent absolute positions.
Impl(std::vector< LsstPoint > const &vertices)
lsst::afw::geom::polygon::Polygon::Box LsstBox
Polygon(Box const &box)
Construct a rectangular Polygon whose vertices are the corners of a box.
_view_t::x_iterator x_iterator
An iterator for traversing the pixels in a row.
bool overlaps(PolyT const &other) const
static PointKey addFields(Schema &schema, std::string const &name, std::string const &doc, std::string const &unit)
Add a pair of _x, _y fields to a Schema, and return a PointKey that points to them.
double getMaxX() const noexcept
afw::table::PointKey< double > vertices
double calculateArea() const
Point2D const getMin() const noexcept
boost::geometry::model::linestring< LsstPoint > BoostLineString
std::vector< std::shared_ptr< Polygon > > symDifference(Polygon const &other) const
Return the symmetric difference of two polygons.
std::shared_ptr< Polygon > unionSingle(Polygon const &other) const
Returns the union of two polygons.
Point2I const getMin() const noexcept
Box getBBox() const
Return bounding box.
double getMaxY() const noexcept
A base class for image defects.
std::vector< LsstPoint > LsstRing
reference front() const
Return the first record.
std::vector< std::pair< Point, Point > > getEdges() const
Get vector of edges.
int getMaxY() const noexcept
std::vector< std::shared_ptr< Polygon > > union_(Polygon const &other) const
Returns the union of two polygons.
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
void write(OutputArchiveHandle &handle) const override
Whether Polygon is persistable which is always true.
Impl(Polygon::Box const &box)
boost::geometry::model::polygon< LsstPoint > BoostPolygon
int getMaxX() const noexcept
An exception that indicates the single-polygon assumption has been violated.
CatalogIterator< typename Internal::const_iterator > const_iterator
std::shared_ptr< Polygon > subSample(size_t num) const
Sub-sample each edge.
BaseCatalog makeCatalog(Schema const &schema)
Return a new, empty catalog with the given schema.
Point2D const getMax() const noexcept
Point calculateCenter() const
int getMinX() const noexcept
std::vector< Point > getVertices() const
Get vector of vertices.
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
#define LSST_ARCHIVE_ASSERT(EXPR)
An assertion macro used to validate the structure of an InputArchive.
std::size_t hash_value() const noexcept
Return a hash of this object.
size_t getNumEdges() const
Return number of edges.
std::shared_ptr< Polygon > simplify(double const distance) const
Return a simplified polygon.
std::shared_ptr< Polygon > intersectionSingle(Polygon const &other) const
Returns the intersection of two polygons.
std::ostream & operator<<(std::ostream &os, BoostPolygon const &poly)
std::vector< Point >::const_iterator end() const
Iterator for vertices.
table::PointKey< int > pixel
ItemVariant const * other
afw::table::Schema schema
void saveCatalog(BaseCatalog const &catalog)
Save a catalog in the archive.
std::string getPersistenceName() const override
Whether Polygon is persistable which is always true.
bool contains(Point const &point) const
Returns whether the polygon contains the point.
An integer coordinate rectangle.
std::shared_ptr< afw::image::Image< float > > createImage(lsst::geom::Box2I const &bbox) const
Create image of polygon.
A class to represent a 2-dimensional array of pixels.
std::shared_ptr< Polygon > transform(TransformPoint2ToPoint2 const &transform) const
Transform the polygon.
double distanceSquared(PointBase< T, N > const &other) const noexcept(Super::IS_ELEMENT_NOTHROW_COPYABLE)
int getMinY() const noexcept
std::shared_ptr< RecordT > addNew()
Create a new record, add it to the end of the catalog, and return a pointer to it.
double calculatePerimeter() const