// // BoostGeometryTools.cpp // auto_fill_jewel_v3 // // Created by Red on 2024/11/26. // #include "BoostGeometryTools.hpp" #define BOOSTGEOMETRYTOOLS_BOX_PT_CNT 5 bool BoostGeometryTools::isAIntersectsB(BoostGeometryTools::BoostPolygon& polyA, BoostGeometryTools::BoostPolygon& polyB) { return boost::geometry::intersects(polyA, polyB) ; } bool BoostGeometryTools::isAWithinB(BoostGeometryTools::BoostPolygon& polyA, BoostGeometryTools::BoostPolygon& polyB) { return boost::geometry::within(polyA,polyB) ; } BoostGeometryTools::BoostPolygon BoostGeometryTools::makeBox( float lowerLeftX,float lowerLeftY,float wid,float hei ) { float xarr[BOOSTGEOMETRYTOOLS_BOX_PT_CNT] = { lowerLeftX, lowerLeftX+wid, lowerLeftX+wid , lowerLeftX , lowerLeftX } ; float yarr[BOOSTGEOMETRYTOOLS_BOX_PT_CNT] = { lowerLeftY , lowerLeftY , lowerLeftY+hei , lowerLeftY+hei , lowerLeftY } ; BoostPolygon poly ; for(int ip = 0 ; ip < BOOSTGEOMETRYTOOLS_BOX_PT_CNT;++ip ) { poly.outer().push_back( {xarr[ip],yarr[ip]} ) ; } return poly ; } BoostGeometryTools::BoostPolygon BoostGeometryTools::makeRotatedBox( float lowerLeftX,float lowerLeftY,float wid,float hei,float rotdeg) { const float DEG2RAD = 3.141592/180.0; float rad = DEG2RAD*rotdeg ; float xarr[BOOSTGEOMETRYTOOLS_BOX_PT_CNT] = { lowerLeftX, lowerLeftX+wid, lowerLeftX+wid , lowerLeftX , lowerLeftX } ; float yarr[BOOSTGEOMETRYTOOLS_BOX_PT_CNT] = { lowerLeftY , lowerLeftY , lowerLeftY+hei , lowerLeftY+hei , lowerLeftY } ; BoostPolygon poly ; for(int ip = 0 ; ip < BOOSTGEOMETRYTOOLS_BOX_PT_CNT;++ip ) { float x1 = 0 ; float y1 = 0 ; rotatePoint(xarr[ip], yarr[ip], rad, x1, y1) ; poly.outer().push_back( {x1,y1} ) ; } return poly ; } void BoostGeometryTools::rotatePoint( float x0, float y0, float rotRad, float& x1,float& y1) { float cosval = cosf(rotRad) ; float sinval = sinf(rotRad) ; x1 = x0*cosval - y0*sinval ; y1 = x0*sinval + y0*cosval ; } BoostGeometryTools::BoostPolygon BoostGeometryTools::makeRotateNTranslateBox( float lowerLeftX,float lowerLeftY,float wid,float hei,float rotdeg,float dx,float dy) { const float DEG2RAD = 3.141592/180.0; float rad = DEG2RAD*rotdeg ; float xarr[BOOSTGEOMETRYTOOLS_BOX_PT_CNT] = { lowerLeftX, lowerLeftX+wid, lowerLeftX+wid , lowerLeftX , lowerLeftX } ; float yarr[BOOSTGEOMETRYTOOLS_BOX_PT_CNT] = { lowerLeftY , lowerLeftY , lowerLeftY+hei , lowerLeftY+hei , lowerLeftY } ; BoostPolygon poly ; for(int ip = 0 ; ip < BOOSTGEOMETRYTOOLS_BOX_PT_CNT;++ip ) { float x1 = 0 ; float y1 = 0 ; rotatePoint(xarr[ip], yarr[ip], rad, x1, y1) ; poly.outer().push_back( {x1+dx,y1+dy} ) ; } return poly ; } BoostGeometryTools::BoostPolygon BoostGeometryTools::translatePolygon(BoostGeometryTools::BoostPolygon& poly,float dx,float dy) { BoostPolygon newPoly = poly ; for(auto it = newPoly.outer().begin(); it!=newPoly.outer().end();++it ) { it->set<0>( it->get<0>() + dx ) ; it->set<1>( it->get<1>() + dy ) ; } return newPoly ; } BoostGeometryTools::BoostPolygon BoostGeometryTools::convex_hull(BoostGeometryTools::BoostPolygon& poly) { BoostGeometryTools::BoostPolygon hull ; boost::geometry::convex_hull(poly, hull) ; return hull ; } bool BoostGeometryTools::pointIntersetsBox(BoostGeometryTools::BoostPoint& ptA,BoostGeometryTools::BoostPolygon& polyB) { return boost::geometry::intersects(ptA,polyB) ; }