git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6000 dfc29bdd-3216-0410-991c-e03cc46cb475
		
			
				
	
	
		
			302 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			302 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright (C) 2008-2012 Colin MacDonald
 | |
| // No rights reserved: this software is in the public domain.
 | |
| 
 | |
| #include "testUtils.h"
 | |
| 
 | |
| using namespace irr;
 | |
| using namespace core;
 | |
| 
 | |
| static bool testLines(line2df const & line1,
 | |
| 					  line2df const & line2,
 | |
| 					  bool expectedHit,
 | |
| 					  const vector2df & expectedIntersection)
 | |
| {
 | |
| 	bool gotExpectedResult = true;
 | |
| 
 | |
| 	logTestString("\nLine 1 = %.1f %.1f to %.1f %.1f \n",
 | |
| 		line1.start.X, line1.start.Y,
 | |
| 		line1.end.X, line1.end.Y);
 | |
| 	logTestString("Line 2 = %.1f %.1f to %.1f %.1f\n",
 | |
| 		line2.start.X, line2.start.Y,
 | |
| 		line2.end.X, line2.end.Y);
 | |
| 
 | |
| 	vector2df intersection;
 | |
| 	logTestString("line1 with line2 = ");
 | |
| 	if(line1.intersectWith(line2, intersection))
 | |
| 	{
 | |
| 		logTestString("hit at %.1f %.1f - ",
 | |
| 			intersection.X, intersection.Y);
 | |
| 
 | |
| 		if(!line1.isPointOnLine(intersection) || !line2.isPointOnLine(intersection))
 | |
| 		{
 | |
| 			logTestString("ERROR! point is not on both lines - ");
 | |
| 			gotExpectedResult = false;
 | |
| 		}
 | |
| 
 | |
| 		if(expectedHit)
 | |
| 		{
 | |
| 			if(intersection == expectedIntersection)
 | |
| 			{
 | |
| 				logTestString("expected\n");
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				logTestString("unexpected intersection (expected %.1f %.1f)\n",
 | |
| 					expectedIntersection.X, expectedIntersection.Y);
 | |
| 				gotExpectedResult = false;
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			logTestString("UNEXPECTED\n");
 | |
| 			gotExpectedResult = false;
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		logTestString("miss - ");
 | |
| 		if(!expectedHit)
 | |
| 		{
 | |
| 			logTestString("expected\n");
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			logTestString("UNEXPECTED\n");
 | |
| 			gotExpectedResult = false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	logTestString("line2 with line1 = ");
 | |
| 	if(line2.intersectWith(line1, intersection))
 | |
| 	{
 | |
| 		logTestString("hit at %.1f %.1f - ",
 | |
| 			intersection.X, intersection.Y);
 | |
| 		if(!line1.isPointOnLine(intersection) || !line2.isPointOnLine(intersection))
 | |
| 		{
 | |
| 			logTestString("ERROR! point is not on both lines - ");
 | |
| 			gotExpectedResult = false;
 | |
| 		}
 | |
| 
 | |
| 		if(expectedHit)
 | |
| 		{
 | |
| 			if(intersection == expectedIntersection)
 | |
| 			{
 | |
| 				logTestString("expected\n");
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				logTestString("unexpected intersection (expected %.1f %.1f)\n",
 | |
| 					expectedIntersection.X, expectedIntersection.Y);
 | |
| 				gotExpectedResult = false;
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			logTestString("UNEXPECTED\n");
 | |
| 			gotExpectedResult = false;
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		logTestString("miss - ");
 | |
| 		if(!expectedHit)
 | |
| 		{
 | |
| 			logTestString("expected\n");
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			logTestString("UNEXPECTED\n");
 | |
| 			gotExpectedResult = false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return gotExpectedResult;
 | |
| }
 | |
| 
 | |
| // Test the functionality of line2d>T>::intersectWith().
 | |
| /** Validation is done with assert_log() against expected results. */
 | |
| bool line2dIntersectWith(void)
 | |
| {
 | |
| 	bool allExpected = true;
 | |
| 
 | |
| 	// Crossing lines, horizontal and vertical
 | |
| 	allExpected &= testLines(line2df(vector2df(1,1),vector2df(1,3)),
 | |
| 							line2df(vector2df(0,2),vector2df(2,2)),
 | |
| 							true, vector2df(1,2));
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 	// Crossing lines, both diagonal
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(2,2)),
 | |
| 							line2df(vector2df(0,2),vector2df(2,0)),
 | |
| 							true, vector2df(1,1));
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 	// Non-crossing lines, horizontal and vertical
 | |
| 	allExpected &= testLines(line2df(vector2df(1,1),vector2df(1,3)),
 | |
| 							line2df(vector2df(0,4),vector2df(2,4)),
 | |
| 							false, vector2df());
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 	// Non-crossing lines, both diagonal
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(2,2)),
 | |
| 							line2df(vector2df(3,4),vector2df(4,3)),
 | |
| 							false, vector2df());
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 	// Meeting at a common point
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,0)),
 | |
| 							line2df(vector2df(1,0),vector2df(2,0)),
 | |
| 							true, vector2df(1,0));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,0)),
 | |
| 							line2df(vector2df(1,0),vector2df(0,1)),
 | |
| 							true, vector2df(1,0));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,0)),
 | |
| 							line2df(vector2df(1,0),vector2df(0,-1)),
 | |
| 							true, vector2df(1,0));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(0,1)),
 | |
| 							line2df(vector2df(0,1),vector2df(1,1)),
 | |
| 							true, vector2df(0,1));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(0,1)),
 | |
| 							line2df(vector2df(0,1),vector2df(1,-1)),
 | |
| 							true, vector2df(0,1));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(0,1)),
 | |
| 							line2df(vector2df(0,1),vector2df(0,2)),
 | |
| 							true, vector2df(0,1));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,0)),
 | |
| 							line2df(vector2df(1,0),vector2df(2,0)),
 | |
| 							true, vector2df(1,0));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,1)),
 | |
| 							line2df(vector2df(1,1),vector2df(0,2)),
 | |
| 							true, vector2df(1,1));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,1)),
 | |
| 							line2df(vector2df(1,1),vector2df(2,0)),
 | |
| 							true, vector2df(1,1));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,1)),
 | |
| 							line2df(vector2df(1,1),vector2df(2,2)),
 | |
| 							true, vector2df(1,1));
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 
 | |
| 	// Parallel lines, no intersection
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,0)),
 | |
| 							line2df(vector2df(0,1),vector2df(1,1)),
 | |
| 							false, vector2df());
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(0,1)),
 | |
| 							line2df(vector2df(1,0),vector2df(1,1)),
 | |
| 							false, vector2df());
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 	// Non parallel lines, no intersection
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,0)),
 | |
| 							line2df(vector2df(0,1),vector2df(0,2)),
 | |
| 							false, vector2df());
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(0,1)),
 | |
| 							line2df(vector2df(1,0),vector2df(2,0)),
 | |
| 							false, vector2df());
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 	// Coincident (and thus parallel) lines
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,0)),
 | |
| 							line2df(vector2df(0,0),vector2df(1,0)),
 | |
| 							true, vector2df(0,0));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(2,0),vector2df(0,2)),
 | |
| 							line2df(vector2df(2,0),vector2df(0,2)),
 | |
| 							true, vector2df(2,0));
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 	// Two segments of the same unlimited line, but no intersection
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,1)),
 | |
| 							line2df(vector2df(2,2),vector2df(3,3)),
 | |
| 							false, vector2df());
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(1,0)),
 | |
| 							line2df(vector2df(2,0),vector2df(3,0)),
 | |
| 							false, vector2df());
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(0,1)),
 | |
| 							line2df(vector2df(0,2),vector2df(0,3)),
 | |
| 							false, vector2df());
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 	// Overlapping parallel lines
 | |
| 	allExpected &= testLines(line2df(vector2df(1,0),vector2df(2,0)),
 | |
| 							line2df(vector2df(0,0),vector2df(3,0)),
 | |
| 							true, vector2df(1.5f, 0));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,1),vector2df(0,2)),
 | |
| 							line2df(vector2df(0,0),vector2df(0,3)),
 | |
| 							true, vector2df(0, 1.5f));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(1,0),vector2df(2,0)),
 | |
| 							line2df(vector2df(0,0),vector2df(3,0)),
 | |
| 							true, vector2df(1.5f, 0));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,1),vector2df(0,2)),
 | |
| 							line2df(vector2df(0,0),vector2df(0,3)),
 | |
| 							true, vector2df(0, 1.5f));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(1,1),vector2df(2,2)),
 | |
| 							line2df(vector2df(0,0),vector2df(3,3)),
 | |
| 							true, vector2df(1.5f, 1.5f));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(1,2),vector2df(2,1)),
 | |
| 							line2df(vector2df(0,3),vector2df(3,0)),
 | |
| 							true, vector2df(1.5f, 1.5f));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(10,8)),
 | |
| 							line2df(vector2df(2.5f,2.0f),vector2df(5.0f,4.0f)),
 | |
| 							true, vector2df(3.75f, 3.0f));
 | |
| 	assert_log(allExpected);
 | |
| 	allExpected &= testLines(line2df(vector2df(0,0),vector2df(2000,1000)),
 | |
| 							line2df(vector2df(2,1),vector2df(2.2f,1.4f)),
 | |
| 							true, vector2df(2.0f, 1.0f));
 | |
| 	assert_log(allExpected);
 | |
| 
 | |
| 	if(!allExpected)
 | |
| 		logTestString("\nline2dIntersectWith failed\n");
 | |
| 
 | |
| 	return allExpected;
 | |
| }
 | |
| 
 | |
| bool getClosestPoint(void)
 | |
| {
 | |
| 	// testcase that fails when integers are handled like floats
 | |
| 	irr::core::line2di line(-283, -372, 374, 289);
 | |
| 	irr::core::vector2di p1 = line.getClosestPoint( irr::core::vector2di(290,372) );
 | |
| 	irr::core::vector2di p2 = line.getClosestPoint( irr::core::vector2di(135,372) );
 | |
| 	if( p1 == p2 )
 | |
| 	{
 | |
| 		logTestString("getClosestPoint failed\n");
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| bool testLine2d(void)
 | |
| {
 | |
| 	bool allExpected = true;
 | |
| 
 | |
| 	allExpected &= line2dIntersectWith();
 | |
| 	allExpected &= getClosestPoint();
 | |
| 
 | |
| 	if(allExpected)
 | |
| 		logTestString("\nAll tests passed\n");
 | |
| 	else
 | |
| 		logTestString("\nFAIL!\n");
 | |
| 
 | |
| 	return allExpected;
 | |
| }
 |