mirror of
https://github.com/minetest/irrlicht.git
synced 2024-11-16 23:40:25 +01:00
line2d::intersectWith now using f64 instead of f32 internally
Avoid losing precision when working with line2d<f64> git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6305 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
parent
709cbe9df6
commit
530ddbf32f
|
@ -159,20 +159,20 @@ class line2d
|
||||||
{
|
{
|
||||||
// Uses the method given at:
|
// Uses the method given at:
|
||||||
// http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/
|
// http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/
|
||||||
const f32 commonDenominator = (f32)((l.end.Y - l.start.Y)*(end.X - start.X) -
|
const f64 commonDenominator = (f64)((l.end.Y - l.start.Y)*(end.X - start.X) -
|
||||||
(l.end.X - l.start.X)*(end.Y - start.Y));
|
(l.end.X - l.start.X)*(end.Y - start.Y));
|
||||||
|
|
||||||
const f32 numeratorA = (f32)((l.end.X - l.start.X)*(start.Y - l.start.Y) -
|
const f64 numeratorA = (f64)((l.end.X - l.start.X)*(start.Y - l.start.Y) -
|
||||||
(l.end.Y - l.start.Y)*(start.X -l.start.X));
|
(l.end.Y - l.start.Y)*(start.X -l.start.X));
|
||||||
|
|
||||||
const f32 numeratorB = (f32)((end.X - start.X)*(start.Y - l.start.Y) -
|
const f64 numeratorB = (f64)((end.X - start.X)*(start.Y - l.start.Y) -
|
||||||
(end.Y - start.Y)*(start.X -l.start.X));
|
(end.Y - start.Y)*(start.X -l.start.X));
|
||||||
|
|
||||||
if(equals(commonDenominator, 0.f))
|
if(equals(commonDenominator, 0.0))
|
||||||
{
|
{
|
||||||
// The lines are either coincident or parallel
|
// The lines are either coincident or parallel
|
||||||
// if both numerators are 0, the lines are coincident
|
// if both numerators are 0, the lines are coincident
|
||||||
if(!ignoreCoincidentLines && equals(numeratorA, 0.f) && equals(numeratorB, 0.f))
|
if(!ignoreCoincidentLines && equals(numeratorA, 0.0) && equals(numeratorB, 0.0))
|
||||||
{
|
{
|
||||||
// Try and find a common endpoint
|
// Try and find a common endpoint
|
||||||
if(l.start == start || l.end == start)
|
if(l.start == start || l.end == start)
|
||||||
|
@ -235,14 +235,14 @@ class line2d
|
||||||
|
|
||||||
// Get the point of intersection on this line, checking that
|
// Get the point of intersection on this line, checking that
|
||||||
// it is within the line segment.
|
// it is within the line segment.
|
||||||
const f32 uA = numeratorA / commonDenominator;
|
const f64 uA = numeratorA / commonDenominator;
|
||||||
if (checkOnlySegments)
|
if (checkOnlySegments)
|
||||||
{
|
{
|
||||||
if(uA < 0.f || uA > 1.f)
|
if(uA < 0.0 || uA > 1.0)
|
||||||
return false; // Outside the line segment
|
return false; // Outside the line segment
|
||||||
|
|
||||||
const f32 uB = numeratorB / commonDenominator;
|
const f64 uB = numeratorB / commonDenominator;
|
||||||
if(uB < 0.f || uB > 1.f)
|
if(uB < 0.0 || uB > 1.0)
|
||||||
return false; // Outside the line segment
|
return false; // Outside the line segment
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Tests finished. 72 tests of 72 passed.
|
Tests finished. 72 tests of 72 passed.
|
||||||
Compiled as DEBUG
|
Compiled as DEBUG
|
||||||
Test suite pass at GMT Thu Feb 03 14:40:09 2022
|
Test suite pass at GMT Mon Mar 14 15:09:21 2022
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user