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-e03cc46cb475master
parent
d6cca9e7bc
commit
9c8790136c
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -285,7 +285,7 @@
|
|||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\line2dIntersectWith.cpp"
|
||||
RelativePath=".\testLine2d.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
|
|
|
@ -284,7 +284,7 @@
|
|||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\line2dIntersectWith.cpp"
|
||||
RelativePath=".\testLine2d.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
|
|
Loading…
Reference in New Issue