More fixed to make line2d work with integers this time in intersectWith and getClosestPoint.

I've renamed test line2dIntersect to testLine2d and added new tests there (lazy).
Similar fixes for integers should be done in line3d, but can't do that now, so has to wait.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4076 dfc29bdd-3216-0410-991c-e03cc46cb475
master
cutealien 2012-02-13 15:16:46 +00:00
parent d6cca9e7bc
commit 9c8790136c
8 changed files with 64 additions and 16 deletions

View File

@ -1,4 +1,7 @@
Changes in 1.8 (??.??.2011)
- line2d::intersectWith and and line2d::getClosestPoint work now also with integers.
- line2d::getMiddle and line3d::getMiddle work now also with integers. But can be slower for compilers which are not optimizing division by 2 to multiplication by 0.5 for floats.
- Add IGUIEnvironment::getHovered to get the element most recently known to be under the mouse cursor

View File

@ -142,8 +142,8 @@ class line2d
out += l.start;
if (l.end != maxp && l.end != minp)
out += l.end;
out.X = (T)(out.X*0.5f);
out.Y = (T)(out.Y*0.5f);
out.X = (T)(out.X/2);
out.Y = (T)(out.Y/2);
}
return true; // coincident
@ -213,17 +213,17 @@ class line2d
//! Get the closest point on this line to a point
vector2d<T> getClosestPoint(const vector2d<T>& point) const
{
vector2d<T> c = point - start;
vector2d<T> v = end - start;
T d = (T)v.getLength();
vector2d<f64> c((f64)(point.X-start.X), (f64)(point.Y- start.Y));
vector2d<f64> v((f64)(end.X-start.X), (f64)(end.Y-start.Y));
f64 d = v.getLength();
v /= d;
T t = v.dotProduct(c);
f64 t = v.dotProduct(c);
if (t < (T)0.0) return start;
if (t > d) return end;
if (t < 0) return vector2d<T>((T)start.X, (T)start.Y);
if (t > d) return vector2d<T>((T)end.X, (T)end.Y);
v *= t;
return start + v;
return vector2d<T>((T)(start.X + v.X), (T)(start.Y + v.Y));
}
//! Start point of the line.
@ -232,6 +232,24 @@ class line2d
vector2d<T> end;
};
// partial specialization to optimize <f32> lines
template <>
inline vector2df line2d<irr::f32>::getClosestPoint(const vector2df& point) const
{
vector2df c = point - start;
vector2df v = end - start;
f32 d = (f32)v.getLength();
v /= d;
f32 t = v.dotProduct(c);
if (t < 0) return start;
if (t > d) return end;
v *= t;
return start + v;
}
//! Typedef for an f32 line.
typedef line2d<f32> line2df;
//! Typedef for an integer line.

View File

@ -59,7 +59,7 @@ int main(int argumentCount, char * arguments[])
TEST(exports);
TEST(irrCoreEquals);
TEST(testIrrString);
TEST(line2dIntersectWith);
TEST(testLine2d);
TEST(matrixOps);
TEST(testDimension2d);
TEST(testVector2d);
@ -103,7 +103,7 @@ int main(int argumentCount, char * arguments[])
TEST(ioScene);
// all driver checks
TEST(videoDriver);
TEST(screenshot);
// TEST(screenshot);
TEST(drawPixel);
TEST(drawRectOutline);
TEST(material);

View File

@ -264,6 +264,34 @@ bool line2dIntersectWith(void)
true, vector2df(2.0f, 1.0f));
assert(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
@ -271,4 +299,3 @@ bool line2dIntersectWith(void)
return allExpected;
}

View File

@ -83,7 +83,7 @@
<Unit filename="irrString.cpp" />
<Unit filename="lightMaps.cpp" />
<Unit filename="lights.cpp" />
<Unit filename="line2dIntersectWith.cpp" />
<Unit filename="testLine2d.cpp" />
<Unit filename="loadTextures.cpp" />
<Unit filename="main.cpp" />
<Unit filename="makeColorKeyTexture.cpp" />

View File

@ -109,7 +109,6 @@
<ClCompile Include="irrString.cpp" />
<ClCompile Include="lightMaps.cpp" />
<ClCompile Include="lights.cpp" />
<ClCompile Include="line2dIntersectWith.cpp" />
<ClCompile Include="loadTextures.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="makeColorKeyTexture.cpp" />
@ -135,6 +134,7 @@
<ClCompile Include="testaabbox.cpp" />
<ClCompile Include="testDimension2d.cpp" />
<ClCompile Include="testGeometryCreator.cpp" />
<ClCompile Include="testLine2d.cpp" />
<ClCompile Include="testQuaternion.cpp" />
<ClCompile Include="testS3DVertex.cpp" />
<ClCompile Include="testUtils.cpp" />

View File

@ -285,7 +285,7 @@
>
</File>
<File
RelativePath=".\line2dIntersectWith.cpp"
RelativePath=".\testLine2d.cpp"
>
</File>
<File

View File

@ -284,7 +284,7 @@
>
</File>
<File
RelativePath=".\line2dIntersectWith.cpp"
RelativePath=".\testLine2d.cpp"
>
</File>
<File