8 #include "gtest/gtest.h"
14 for (
int i = 0; i < 21; i++) {
15 EXPECT_EQ(
Point(i, 0).GetLengthSquared(), i * i) <<
"i: " << i;
16 EXPECT_EQ(
Point(0, i).GetLengthSquared(), i * i) <<
"i: " << i;
17 EXPECT_EQ(
Point(-i, 0).GetLengthSquared(), i * i) <<
"i: " << i;
18 EXPECT_EQ(
Point(0, -i).GetLengthSquared(), i * i) <<
"i: " << i;
20 EXPECT_EQ(
Point(i, 0).GetLength(), i) <<
"i: " << i;
21 EXPECT_EQ(
Point(0, i).GetLength(), i) <<
"i: " << i;
22 EXPECT_EQ(
Point(-i, 0).GetLength(), i) <<
"i: " << i;
23 EXPECT_EQ(
Point(0, -i).GetLength(), i) <<
"i: " << i;
25 EXPECT_EQ(
Point(i, i).GetLengthSquared(), 2 * i * i) <<
"i: " << i;
26 EXPECT_EQ(
Point(-i, i).GetLengthSquared(), 2 * i * i) <<
"i: " << i;
27 EXPECT_EQ(
Point(i, -i).GetLengthSquared(), 2 * i * i) <<
"i: " << i;
28 EXPECT_EQ(
Point(-i, -i).GetLengthSquared(), 2 * i * i) <<
"i: " << i;
30 EXPECT_FLOAT_EQ(
Point(i, i).GetLength(),
kSqrt2 * i) <<
"i: " << i;
31 EXPECT_FLOAT_EQ(
Point(-i, i).GetLength(),
kSqrt2 * i) <<
"i: " << i;
32 EXPECT_FLOAT_EQ(
Point(i, -i).GetLength(),
kSqrt2 * i) <<
"i: " << i;
33 EXPECT_FLOAT_EQ(
Point(-i, -i).GetLength(),
kSqrt2 * i) <<
"i: " << i;
37 TEST(PointTest, Distance) {
38 for (
int j = 0; j < 21; j++) {
39 for (
int i = 0; i < 21; i++) {
43 EXPECT_EQ(
Point(i, 0).GetDistanceSquared(
Point(j, 0)), d * d)
44 <<
"i: " << i <<
", j: " << j;
45 EXPECT_EQ(
Point(0, i).GetDistanceSquared(
Point(0, j)), d * d)
46 <<
"i: " << i <<
", j: " << j;
47 EXPECT_EQ(
Point(j, 0).GetDistanceSquared(
Point(i, 0)), d * d)
48 <<
"i: " << i <<
", j: " << j;
49 EXPECT_EQ(
Point(0, j).GetDistanceSquared(
Point(0, i)), d * d)
50 <<
"i: " << i <<
", j: " << j;
52 EXPECT_EQ(
Point(i, 0).GetDistance(
Point(j, 0)), std::abs(d))
53 <<
"i: " << i <<
", j: " << j;
54 EXPECT_EQ(
Point(0, i).GetDistance(
Point(0, j)), std::abs(d))
55 <<
"i: " << i <<
", j: " << j;
56 EXPECT_EQ(
Point(j, 0).GetDistance(
Point(i, 0)), std::abs(d))
57 <<
"i: " << i <<
", j: " << j;
58 EXPECT_EQ(
Point(0, j).GetDistance(
Point(0, i)), std::abs(d))
59 <<
"i: " << i <<
", j: " << j;
63 Scalar d_squared = i * i + j * j;
65 EXPECT_EQ(
Point(i, 0).GetDistanceSquared(
Point(0, j)), d_squared)
66 <<
"i: " << i <<
", j: " << j;
67 EXPECT_EQ(
Point(-i, 0).GetDistanceSquared(
Point(0, j)), d_squared)
68 <<
"i: " << i <<
", j: " << j;
69 EXPECT_EQ(
Point(i, 0).GetDistanceSquared(
Point(0, -j)), d_squared)
70 <<
"i: " << i <<
", j: " << j;
71 EXPECT_EQ(
Point(-i, 0).GetDistanceSquared(
Point(0, -j)), d_squared)
72 <<
"i: " << i <<
", j: " << j;
74 Scalar d = std::sqrt(d_squared);
76 EXPECT_FLOAT_EQ(
Point(i, 0).GetDistance(
Point(0, j)), d)
77 <<
"i: " << i <<
", j: " << j;
78 EXPECT_FLOAT_EQ(
Point(-i, 0).GetDistance(
Point(0, j)), d)
79 <<
"i: " << i <<
", j: " << j;
80 EXPECT_FLOAT_EQ(
Point(i, 0).GetDistance(
Point(0, -j)), d)
81 <<
"i: " << i <<
", j: " << j;
82 EXPECT_FLOAT_EQ(
Point(-i, 0).GetDistance(
Point(0, -j)), d)
83 <<
"i: " << i <<
", j: " << j;
89 TEST(PointTest, PerpendicularLeft) {
90 EXPECT_EQ(
Point(1, 0).PerpendicularLeft(),
Point(0, -1));
91 EXPECT_EQ(
Point(0, 1).PerpendicularLeft(),
Point(1, 0));
92 EXPECT_EQ(
Point(-1, 0).PerpendicularLeft(),
Point(0, 1));
93 EXPECT_EQ(
Point(0, -1).PerpendicularLeft(),
Point(-1, 0));
95 EXPECT_EQ(
Point(1, 1).PerpendicularLeft(),
Point(1, -1));
96 EXPECT_EQ(
Point(-1, 1).PerpendicularLeft(),
Point(1, 1));
97 EXPECT_EQ(
Point(-1, -1).PerpendicularLeft(),
Point(-1, 1));
98 EXPECT_EQ(
Point(1, -1).PerpendicularLeft(),
Point(-1, -1));
101 TEST(PointTest, PerpendicularRight) {
102 EXPECT_EQ(
Point(1, 0).PerpendicularRight(),
Point(0, 1));
103 EXPECT_EQ(
Point(0, 1).PerpendicularRight(),
Point(-1, 0));
104 EXPECT_EQ(
Point(-1, 0).PerpendicularRight(),
Point(0, -1));
105 EXPECT_EQ(
Point(0, -1).PerpendicularRight(),
Point(1, 0));
107 EXPECT_EQ(
Point(1, 1).PerpendicularRight(),
Point(-1, 1));
108 EXPECT_EQ(
Point(-1, 1).PerpendicularRight(),
Point(-1, -1));
109 EXPECT_EQ(
Point(-1, -1).PerpendicularRight(),
Point(1, -1));
110 EXPECT_EQ(
Point(1, -1).PerpendicularRight(),
Point(1, 1));
114 typedef std::pair<Scalar, Scalar> PtSegmentDistanceFunc(
Point);
116 void TestPointToSegmentGroup(
Point segment0,
121 PtSegmentDistanceFunc calc_distance) {
122 for (
int i = 0; i < count; i++) {
123 auto [
distance, squared] = calc_distance(p0);
125 << p0 <<
" => [" << segment0 <<
", " << segment1 <<
"]";
127 << p0 <<
" => [" << segment0 <<
", " << segment1 <<
"]";
129 << p0 <<
" => [" << segment0 <<
", " << segment1 <<
"]";
131 << p0 <<
" => [" << segment0 <<
", " << segment1 <<
"]";
137 TEST(PointTest, PointToSegment) {
139 TestPointToSegmentGroup(
147 return std::make_pair(d, d * d);
151 TestPointToSegmentGroup(
158 return std::make_pair(0.0f, 0.0f);
162 TestPointToSegmentGroup(
166 {20, 10}, {1, 0}, 11,
170 return std::make_pair(d, d * d);
174 TestPointToSegmentGroup(
182 return std::make_pair(d, d * d);
186 TestPointToSegmentGroup(
193 return std::make_pair(0.0f, 0.0f);
197 TestPointToSegmentGroup(
201 {10, 20}, {0, 1}, 11,
205 return std::make_pair(d, d * d);
210 TestPointToSegmentGroup(
217 Scalar d_sq = (10 - p.x) * (10 - p.x) + 25;
218 return std::make_pair(std::sqrt(d_sq), d_sq);
222 TestPointToSegmentGroup(
229 return std::make_pair(5.0f, 25.0f);
234 TestPointToSegmentGroup(
241 Scalar d_sq = (p.x - 20) * (p.x - 20) + 25;
242 return std::make_pair(std::sqrt(d_sq), d_sq);
247 TestPointToSegmentGroup(
254 Scalar d_sq = 25 + (10 - p.y) * (10 - p.y);
255 return std::make_pair(std::sqrt(d_sq), d_sq);
259 TestPointToSegmentGroup(
266 return std::make_pair(5.0f, 25.0f);
271 TestPointToSegmentGroup(
278 Scalar d_sq = 25 + (p.y - 20) * (p.y - 20);
279 return std::make_pair(std::sqrt(d_sq), d_sq);
283 TestPointToSegmentGroup(
290 Scalar d_sq = (p.x - 10) * (p.x - 10) + (p.y - 10) * (p.y - 10);
291 return std::make_pair(std::sqrt(d_sq), d_sq);
295 TestPointToSegmentGroup(
303 return std::make_pair(std::sqrt(d_sq), d_sq);
308 TestPointToSegmentGroup(
312 {25, 15}, {1, 1}, 11,
315 Scalar d_sq = (p.x - 20) * (p.x - 20) + (p.y - 20) * (p.y - 20);
316 return std::make_pair(std::sqrt(d_sq), d_sq);
320 TestPointToSegmentGroup(
327 Scalar d_sq = (p.x - 10) * (p.x - 10) + (p.y - 10) * (p.y - 10);
328 return std::make_pair(std::sqrt(d_sq), d_sq);
332 TestPointToSegmentGroup(
340 return std::make_pair(std::sqrt(d_sq), d_sq);
345 TestPointToSegmentGroup(
349 {15, 25}, {1, 1}, 11,
352 Scalar d_sq = (p.x - 20) * (p.x - 20) + (p.y - 20) * (p.y - 20);
353 return std::make_pair(std::sqrt(d_sq), d_sq);
357 TEST(PointTest, CrossProductThreePoints) {
TEST(AllocationSizeTest, CanCreateTypedAllocations)
Type GetDistanceToSegmentSquared(TPoint p0, TPoint p1) const
constexpr Type GetDistanceToSegment(TPoint p0, TPoint p1) const
constexpr Type Cross(const TPoint &p) const