yy1717
2023-03-31 4bd08f0355b6b2cf3c027202d5ad301b4e182953
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//
// Created by YY on 2019/4/30.
//
 
#ifndef GUI_GEOMETRY_H
#define GUI_GEOMETRY_H
 
#include <stdint.h>
#include <initializer_list>
#include <vector>
 
typedef enum
{
    GM_None,
    GM_Tangent,
    GM_Intersection,
    GM_Containment
} relation_t;
 
typedef struct PointF_ {
    double X;
    double Y;
} PointF;
 
typedef struct Line_ {
    double X1;
    double Y1;
    double X2;
    double Y2;
} Line;
 
typedef struct Polygon_ {
    int num;
    PointF *point;
} Polygon;
 
typedef struct Circle_ {
    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; }
 
 double toRadians(double degree);
 double toDegree(double radians);
 bool isEqual(double a, double b);
 bool isEqual2(double a, double b);
 
void MakeLine(Line *line, const PointF *p1, const PointF *p2);
void MakePolygon(Polygon *polygon, std::initializer_list<PointF> 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 L, char dir);
PointF PointExtend(PointF ori, double length, double yaw);
bool IsSamePoint(PointF p1, PointF p2);
double AvgYaw(std::vector<double> &angles);
bool Calc3PointCircle(PointF p1, PointF p2, PointF p3, Circle &circle);
 
#endif //GUI_GEOMETRY_H