-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathline.cpp
78 lines (64 loc) · 1.66 KB
/
line.cpp
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
#include "line.h"
Line::Line(const Point& point1, const Point& point2) :
point1_(point1), point2_(point2) {
a_ = point2.Y() - point1.Y();
b_ = point1.X() - point2.X();
c_ = point2.X() * point1.Y() - point1.X() * point2.Y();
}
Line::Line(double a, double b, double c) : a_(a), b_(b), c_(c) {
if (Math::IsZero(a) && Math::IsZero(b)) {
qWarning() << "A and B are zero";
}
}
bool Line::Contains(const Point& point) const {
return Math::IsZero(this->DistanceTo(point));
}
std::vector<Point> Line::Intersected(const Line& other) const {
double a1 = a_;
double b1 = b_;
double c1 = c_;
double a2 = other.a_;
double b2 = other.b_;
double c2 = other.c_;
if (Math::IsZero(b2 * a1 - b1 * a2)) {
return {};
}
double x = (b1 * c2 - b2 * c1) / (b2 * a1 - b1 * a2);
double y;
if (Math::IsNotEqual(b1, 0)) {
y = -(a1 * x + c1) / b1;
} else {
y = -(a2 * x + c2) / b2;
}
return {{x, y}};
}
Line Line::Rotated(const Point& point, double angle) const {
return Line(point1_.Rotated(point, angle),
point2_.Rotated(point, angle));
}
Line Line::Normal() const {
Line line(point1_, point2_);
line.a_ = b_;
line.b_ = -a_;
line.c_ = c_;
return line;
}
double Line::DistanceTo(const Point& point) const {
return std::fabs(a_ * point.X() + b_ * point.Y() + c_)
/ sqrt(a_ * a_ + b_ * b_);
}
bool Line::IsOnRightSide(const Point& point) const {
return (point2_ - point1_).IsRightTurn(point - point2_);
}
QLineF Line::ToQLineF() const {
return QLineF(point1_.ToQPointF(), point2_.ToQPointF());
}
double Line::A() const {
return a_;
}
double Line::B() const {
return b_;
}
double Line::C() const {
return c_;
}