// // Created by YY on 2019/4/30. // #ifndef GUI_GEOMETRY_H #define GUI_GEOMETRY_H #include #include #include typedef enum { GM_None, GM_Tangent, GM_Intersection, GM_Containment } relation_t; typedef struct { double X; double Y; } PointF; /*typedef struct { double X1; double Y1; double X2; double Y2; } Line;*/ typedef struct { PointF p1; PointF p2; } Line; typedef struct { int num = 0; PointF *point = nullptr; } Polygon; typedef struct { PointF centre; double radius; } Circle; //#define MAKE_LINE(a, b, c) { a.X1=b.X; a.Y1=b.Y; a.X2=c.X; a.Y2=c.Y; } void MAKE_LINE(Line &a, PointF &b, PointF &c); double toRadians(double degree); double toDegree(double radians); bool isEqual(double a, double b); bool isEqual2(double a, double b); class MakePolygon { public: MakePolygon(std::initializer_list points) { polygon.num = 0; if (points.size() > 0) { polygon.point = new PointF[points.size()]; int n = 0; for (auto ptr: points) { polygon.point[n++] = ptr; } polygon.num = n; } } MakePolygon(int pre_num) { polygon.num = 0; polygon.point = new PointF[pre_num]; } ~MakePolygon() { if (polygon.point != nullptr) { delete []polygon.point; } } void AddPoints(std::initializer_list points) { if (polygon.point != nullptr) { delete []polygon.point; } polygon.num = 0; if (points.size() > 0) { int n = 0; polygon.point = new PointF[points.size()]; for (auto p: points) { polygon.point[n++] = p; } polygon.num = n; } } void AddPoint(PointF &point) { polygon.point[polygon.num] = point; polygon.num++; } Polygon *GetPolygon(void) { return &polygon; } private: Polygon polygon; }; //void MakePolygon(Polygon *polygon, std::initializer_list point_set); void CleanPolygon(Polygon *polygon); void MakeHidePoint(PointF *point, const PointF *bp, const Line *bl); relation_t IntersectionOf(const Polygon *polygon1, const Polygon *polygon2); relation_t IntersectionOf(Line line, const Polygon *polygon); relation_t IntersectionOf(PointF point, const Polygon *polygon); relation_t IntersectionOf(PointF point, Line line); relation_t IntersectionOf(Line line1, Line line2); double DistanceOf(PointF point1, PointF point2); double DistanceOf(PointF point, Line line); double YawOf(PointF p1, PointF p2); double YawOf(Line &line); double AngleOf(PointF p1, PointF p2, PointF p3); double AngleOfTowLine(Line base, Line dest); double DeltaYaw(double yaw1, double yaw2); double CalculateAngle(Line base, Line dest); PointF rotatePoint(PointF oldPoint, PointF centre, double degree); PointF centerOfTwoPoint(PointF p1, PointF p2); bool InsidePolygon(const Polygon *t1, const Polygon *t2); bool PartInsidePolygon(const Polygon *t1, const Polygon *t2); bool OutsidePolygon(const Polygon *t1, const Polygon *t2); typedef enum { REL_POS_ON, REL_POS_LEFT, REL_POS_RIGHT, REL_POS_FRONT, REL_POS_REAR } relational_position_t; relational_position_t IntersectionOfLine(PointF p1, PointF p2, PointF p3); relational_position_t IntersectionOfLine(PointF p, Line line); PointF GetVerticalPoint(PointF p1, PointF p2, PointF p3); bool VerticalPointOnLine(PointF point, Line line); bool VerticalPointOnLine(PointF point, Line line, PointF &vp); PointF Calc3Point(PointF p1, PointF p2, double length, char dir); PointF PointExtend(PointF ori, double length, double yaw); bool IsSamePoint(PointF p1, PointF p2); double AvgYaw(std::vector &angles); bool Calc3PointCircle(PointF p1, PointF p2, PointF p3, Circle &circle); #endif //GUI_GEOMETRY_H