예제 #1
0
/* 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));
    }
}
예제 #2
0
// 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;
}
예제 #3
0
/* 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));
    }
}