@@ -40,6 +40,49 @@ TEST(Line2Test, Constructor)
4040 EXPECT_NO_THROW (lineB[2 ].X ());
4141 EXPECT_DOUBLE_EQ (lineB[2 ].X (), lineB[1 ].X ());
4242 EXPECT_NO_THROW (lineA[0 ].X ());
43+
44+ // Test Set method with Vector2
45+ lineA.Set (math::Vector2d (5 , 6 ), math::Vector2d (7 , 8 ));
46+ EXPECT_EQ (lineA[0 ], math::Vector2d (5 , 6 ));
47+ EXPECT_EQ (lineA[1 ], math::Vector2d (7 , 8 ));
48+ }
49+
50+ // ///////////////////////////////////////////////
51+ TEST (Line2Test, CrossProduct)
52+ {
53+ math::Line2d lineA (0 , 0 , 10 , 0 );
54+ math::Line2d lineB (0 , 0 , 0 , 10 );
55+ EXPECT_DOUBLE_EQ (lineA.CrossProduct (lineB), 100.0 );
56+
57+ math::Vector2d pt (5 , 5 );
58+ EXPECT_DOUBLE_EQ (lineA.CrossProduct (pt), 50.0 );
59+ }
60+
61+ // ///////////////////////////////////////////////
62+ TEST (Line2Test, OnSegmentAndWithin)
63+ {
64+ math::Line2d line (0 , 0 , 10 , 10 );
65+
66+ // Point on segment
67+ math::Vector2d pt1 (5 , 5 );
68+ EXPECT_TRUE (line.Within (pt1));
69+ EXPECT_TRUE (line.OnSegment (pt1));
70+
71+ // Point collinear with line, but outside segment bounds
72+ math::Vector2d pt2 (15 , 15 );
73+ EXPECT_FALSE (line.Within (pt2));
74+ EXPECT_FALSE (line.OnSegment (pt2));
75+
76+ // Point within bounding box of segment, but not collinear
77+ math::Vector2d pt3 (5 , 6 );
78+ EXPECT_TRUE (line.Within (pt3));
79+ EXPECT_FALSE (line.OnSegment (pt3));
80+
81+ // Endpoints
82+ EXPECT_TRUE (line.Within (line[0 ]));
83+ EXPECT_TRUE (line.OnSegment (line[0 ]));
84+ EXPECT_TRUE (line.Within (line[1 ]));
85+ EXPECT_TRUE (line.OnSegment (line[1 ]));
4386}
4487
4588// ///////////////////////////////////////////////
@@ -83,29 +126,34 @@ TEST(Line2Test, ParallelLine)
83126 // Line is always parallel with itself
84127 math::Line2d line (0 , 0 , 10 , 0 );
85128 EXPECT_TRUE (line.Parallel (line, 1e-10 ));
129+ EXPECT_DOUBLE_EQ (line.CrossProduct (line), 0.0 );
86130 }
87131
88132 {
89133 // Degenerate line segment
90134 // Still expect Line is parallel with itself
91135 math::Line2d line (0 , 0 , 0 , 0 );
92136 EXPECT_TRUE (line.Parallel (line, 1e-10 ));
137+ EXPECT_DOUBLE_EQ (line.CrossProduct (line), 0.0 );
93138 }
94139
95140 math::Line2d lineA (0 , 0 , 10 , 0 );
96141 math::Line2d lineB (0 , 0 , 10 , 0 );
97142 EXPECT_TRUE (lineA.Parallel (lineB, 1e-10 ));
143+ EXPECT_DOUBLE_EQ (lineA.CrossProduct (lineB), 0.0 );
98144
99145 lineB.Set (0 , 0 , 0 , 10 );
100146 EXPECT_FALSE (lineA.Parallel (lineB));
101147
102148 lineB.Set (0 , 10 , 10 , 10 );
103149 EXPECT_TRUE (lineA.Parallel (lineB));
150+ EXPECT_DOUBLE_EQ (lineA.CrossProduct (lineB), 0.0 );
104151
105152 lineB.Set (0 , 10 , 10 , 10.00001 );
106153 EXPECT_FALSE (lineA.Parallel (lineB, 1e-10 ));
107154 EXPECT_FALSE (lineA.Parallel (lineB));
108155 EXPECT_TRUE (lineA.Parallel (lineB, 1e-3 ));
156+ EXPECT_NEAR (lineA.CrossProduct (lineB), 0.0 , 1e-3 );
109157}
110158
111159// ///////////////////////////////////////////////
@@ -234,6 +282,28 @@ TEST(Line2Test, Intersect)
234282 lineB.Set (0 , 10 , 10 , 0 );
235283 EXPECT_TRUE (lineA.Intersect (lineB, pt));
236284 EXPECT_EQ (pt, math::Vector2d (5 , 5 ));
285+
286+ // Collinear parallel non-overlapping lines
287+ lineA.Set (0 , 0 , 10 , 0 );
288+ lineB.Set (20 , 0 , 30 , 0 );
289+ EXPECT_FALSE (lineA.Intersect (lineB, pt));
290+ EXPECT_FALSE (lineA.Intersect (lineB));
291+
292+ // Collinear lines where lineB end point is within lineA but start point isn't
293+ lineA.Set (0 , 0 , 10 , 0 );
294+ lineB.Set (-5 , 0 , 5 , 0 );
295+ EXPECT_TRUE (lineA.Intersect (lineB, pt));
296+ EXPECT_EQ (pt, math::Vector2d (5 , 0 ));
297+
298+ // Lines whose extensions intersect, but intersection Y is outside bounds
299+ lineA.Set (-10 , 0 , 10 , 0 );
300+ lineB.Set (0 , 2 , 0 , 10 );
301+ EXPECT_FALSE (lineA.Intersect (lineB, pt));
302+
303+ // Lines whose extensions intersect, but intersection X is outside bounds
304+ lineA.Set (0 , -10 , 0 , 10 );
305+ lineB.Set (2 , 0 , 10 , 0 );
306+ EXPECT_FALSE (lineA.Intersect (lineB, pt));
237307}
238308
239309// ///////////////////////////////////////////////
@@ -243,7 +313,9 @@ TEST(Line2Test, Equality)
243313 math::Line2d lineB (1 , 2 , 2 , 2 );
244314
245315 EXPECT_TRUE (lineA != lineB);
316+ EXPECT_FALSE (lineA == lineB);
246317 EXPECT_TRUE (lineA == lineA);
318+ EXPECT_FALSE (lineA != lineA);
247319
248320 lineB.Set (1 , 1 , 2 , 1.1 );
249321 EXPECT_FALSE (lineA == lineB);
@@ -266,3 +338,18 @@ TEST(Line2Test, OperatorStreamOut)
266338 stream << line;
267339 EXPECT_EQ (stream.str (), " 0 1 2 3" );
268340}
341+
342+ // ///////////////////////////////////////////////
343+ TEST (Line2Test, TemplateTypes)
344+ {
345+ math::Line2i lineI (0 , 0 , 10 , 10 );
346+ EXPECT_EQ (lineI[0 ], math::Vector2i (0 , 0 ));
347+ EXPECT_EQ (lineI[1 ], math::Vector2i (10 , 10 ));
348+ EXPECT_EQ (lineI.Length (), 14 );
349+
350+ math::Line2f lineF (0 .0f , 0 .0f , 10 .0f , 10 .0f );
351+ EXPECT_FLOAT_EQ (lineF[0 ].X (), 0 .0f );
352+ EXPECT_FLOAT_EQ (lineF[1 ].Y (), 10 .0f );
353+ EXPECT_NEAR (lineF.Length (), 14 .1421356f , 1e-4f );
354+ }
355+
0 commit comments