/* Test the method 'distance'*/ TEST_F(PositionVectorTest, test_method_distance) { { PositionVector vec1; vec1.push_back(Position(1,0)); vec1.push_back(Position(10,0)); vec1.push_back(Position(10,5)); vec1.push_back(Position(20,5)); Position on(4,0); Position left(4,1); Position right(4,-1); Position left2(4,2); Position right2(4,-2); Position cornerRight(13,-4); Position cornerLeft(7,9); Position before(-3,-3); Position beyond(24,8); EXPECT_EQ(0, vec1.distance(on)); EXPECT_EQ(1, vec1.distance(left)); EXPECT_EQ(1, vec1.distance(right)); EXPECT_EQ(2, vec1.distance(left2)); EXPECT_EQ(2, vec1.distance(right2)); EXPECT_EQ(5, vec1.distance(cornerRight)); EXPECT_EQ(5, vec1.distance(cornerLeft)); EXPECT_EQ(GeomHelper::INVALID_OFFSET, vec1.distance(before, true)); EXPECT_EQ(GeomHelper::INVALID_OFFSET, vec1.distance(beyond, true)); EXPECT_EQ(5, vec1.distance(before)); EXPECT_EQ(5, vec1.distance(beyond)); } { PositionVector vec1; // the same tests as before, mirrored on x-axis vec1.push_back(Position(1,0)); vec1.push_back(Position(10,0)); vec1.push_back(Position(10,-5)); vec1.push_back(Position(20,-5)); Position on(4,0); Position left(4,-1); Position right(4,1); Position left2(4,-2); Position right2(4,2); Position cornerRight(13,4); Position cornerLeft(7,-9); Position before(-3,3); Position beyond(24,-8); EXPECT_EQ(0, vec1.distance(on)); EXPECT_EQ(1, vec1.distance(left)); EXPECT_EQ(1, vec1.distance(right)); EXPECT_EQ(2, vec1.distance(left2)); EXPECT_EQ(2, vec1.distance(right2)); EXPECT_EQ(5, vec1.distance(cornerRight)); EXPECT_EQ(5, vec1.distance(cornerLeft)); EXPECT_EQ(GeomHelper::INVALID_OFFSET, vec1.distance(before, true)); EXPECT_EQ(GeomHelper::INVALID_OFFSET, vec1.distance(beyond, true)); EXPECT_EQ(5, vec1.distance(before)); EXPECT_EQ(5, vec1.distance(beyond)); } }
// Checks if two sprites collide with each other // By the nature of this project, s1 is always upright and located at 320,240 bool collision(Sprite s1, Sprite s2) { // Performs a quick check comparing radii if ((s1.position - s2.position).Magnitude() > s1.radius + s2.radius) { return false; } // Move everything to (0,0) Vector2 translate(s1.position); s1.position -= translate; s2.position -= translate; // Corners of s1 double halfWidth1 = s1.size.x / 2; double halfHeight1 = s1.size.y / 2; Vector2 TR1 = s1.position + Vector2(halfWidth1, halfHeight1); Vector2 TL1 = s1.position + Vector2(-halfWidth1, halfHeight1); Vector2 BR1 = s1.position + Vector2(halfWidth1, -halfHeight1); Vector2 BL1 = s1.position + Vector2(-halfWidth1, -halfHeight1); std::vector<Vector2> s1corners = { TR1, TL1, BR1, BL1 }; // Corners of s2 double halfWidth2 = s2.size.x / 2; Vector2 right2(cos(s2.rotation) * halfWidth2, sin(s2.rotation) * halfWidth2); Vector2 left2 = -right2; double halfHeight2 = s2.size.y / 2; Vector2 up2(cos(s2.rotation + M_PI / 2) * halfHeight2, sin(s2.rotation + M_PI / 2) * halfHeight2); Vector2 down2 = -up2; Vector2 TR2 = s2.position + right2 + up2; Vector2 TL2 = s2.position + left2 + up2; Vector2 BR2 = s2.position + right2 + down2; Vector2 BL2 = s2.position + left2 + down2; std::vector<Vector2> s2corners = { TR2, TL2, BR2, BL2 }; // Axes Vector2 axis1 = TR2 - TL2; Vector2 axis2 = TR2 - BR2; std::vector<Vector2> axes = { Vector2(1, 0), Vector2(0, 1), axis1, axis2 }; for (auto axis : axes) { double min1 = s1corners[0].Dot(axis); double max1 = s1corners[0].Dot(axis); for (auto corner : s1corners) { Vector2 projection = corner.Project(axis); double scalar = projection.Dot(axis); if (scalar < min1) { min1 = scalar; } if (scalar > max1) { max1 = scalar; } } double min2 = s2corners[0].Dot(axis); double max2 = s2corners[0].Dot(axis); for (auto corner : s2corners) { Vector2 projection = corner.Project(axis); double scalar = projection.Dot(axis); if (scalar < min2) { min2 = scalar; } if (scalar > max2) { max2 = scalar; } } // Checks for no overlaps if (min2 >= max1 || max2 <= min1) { return false; } } return true; }
/* Test the method 'transformToVectorCoordinates'*/ TEST_F(PositionVectorTest, test_method_transformToVectorCoordinates) { { PositionVector vec1; vec1.push_back(Position(1,0)); vec1.push_back(Position(10,0)); vec1.push_back(Position(10,5)); vec1.push_back(Position(20,5)); Position on(4,0); Position left(4,1); Position right(4,-1); Position left2(4,2); Position right2(4,-2); Position cornerRight(13,-4); Position cornerLeft(7,9); Position before(0,-1); Position beyond(24,9); EXPECT_EQ(Position(3, 0), vec1.transformToVectorCoordinates(on)); EXPECT_EQ(Position(3, -1), vec1.transformToVectorCoordinates(left)); EXPECT_EQ(Position(3, 1), vec1.transformToVectorCoordinates(right)); EXPECT_EQ(Position(3, -2), vec1.transformToVectorCoordinates(left2)); EXPECT_EQ(Position(3, 2), vec1.transformToVectorCoordinates(right2)); EXPECT_EQ(Position(9, 5), vec1.transformToVectorCoordinates(cornerRight)); EXPECT_EQ(Position(14, -5), vec1.transformToVectorCoordinates(cornerLeft)); EXPECT_EQ(Position::INVALID, vec1.transformToVectorCoordinates(before)); EXPECT_EQ(Position::INVALID, vec1.transformToVectorCoordinates(beyond)); EXPECT_EQ(Position(-1, 1), vec1.transformToVectorCoordinates(before, true)); EXPECT_EQ(Position(28, -4), vec1.transformToVectorCoordinates(beyond, true)); } { PositionVector vec1; // the same tests as before, mirrored on x-axis vec1.push_back(Position(1,0)); vec1.push_back(Position(10,0)); vec1.push_back(Position(10,-5)); vec1.push_back(Position(20,-5)); Position on(4,0); Position left(4,-1); Position right(4,1); Position left2(4,-2); Position right2(4,2); Position cornerRight(13,4); Position cornerLeft(7,-9); Position before(0,1); Position beyond(24,-9); EXPECT_EQ(Position(3, 0), vec1.transformToVectorCoordinates(on)); EXPECT_EQ(Position(3, 1), vec1.transformToVectorCoordinates(left)); EXPECT_EQ(Position(3, -1), vec1.transformToVectorCoordinates(right)); EXPECT_EQ(Position(3, 2), vec1.transformToVectorCoordinates(left2)); EXPECT_EQ(Position(3, -2), vec1.transformToVectorCoordinates(right2)); EXPECT_EQ(Position(9, -5), vec1.transformToVectorCoordinates(cornerRight)); EXPECT_EQ(Position(14, 5), vec1.transformToVectorCoordinates(cornerLeft)); EXPECT_EQ(Position::INVALID, vec1.transformToVectorCoordinates(before)); EXPECT_EQ(Position::INVALID, vec1.transformToVectorCoordinates(beyond)); EXPECT_EQ(Position(-1, -1), vec1.transformToVectorCoordinates(before, true)); EXPECT_EQ(Position(28, 4), vec1.transformToVectorCoordinates(beyond, true)); } }