Ticket #3541: 3451.1.diff

File 3451.1.diff, 2.0 KB (added by Stan, 9 years ago)

Documented Version of Above Patch

  • source/simulation2/helpers/Geometry.cpp

     
    236236    return false;
    237237}
    238238
     239/**
     240 * This function does the same as Geometry::TestRaySquare except it ignores rotations. This saves some computation time
     241 * for units which have a round obstruction.
     242 */
    239243bool Geometry::TestRayAASquare(CFixedVector2D a, CFixedVector2D b, CFixedVector2D halfSize)
    240244{
    241     // Exactly like TestRaySquare with u=(1,0), v=(0,1)
    242 
    243     // Assume the compiler is clever enough to inline and simplify all this
    244     // (TODO: stop assuming that)
    245245    CFixedVector2D u (fixed::FromInt(1), fixed::Zero());
    246246    CFixedVector2D v (fixed::Zero(), fixed::FromInt(1));
    247 
    248     fixed hw = halfSize.X;
    249     fixed hh = halfSize.Y;
    250 
    251     fixed au = a.Dot(u);
    252     fixed av = a.Dot(v);
    253 
    254     if (-hw <= au && au <= hw && -hh <= av && av <= hh)
    255         return false; // a is inside
    256 
    257     fixed bu = b.Dot(u);
    258     fixed bv = b.Dot(v);
    259 
    260     if (-hw <= bu && bu <= hw && -hh <= bv && bv <= hh) // TODO: isn't this subsumed by the next checks?
    261         return true; // a is outside, b is inside
    262 
    263     if ((au < -hw && bu < -hw) || (au > hw && bu > hw) || (av < -hh && bv < -hh) || (av > hh && bv > hh))
    264         return false; // ab is entirely above/below/side the square
    265 
    266     CFixedVector2D abp = (b - a).Perpendicular();
    267     fixed s0 = abp.Dot((u.Multiply(hw) + v.Multiply(hh)) - a);
    268     fixed s1 = abp.Dot((u.Multiply(hw) - v.Multiply(hh)) - a);
    269     fixed s2 = abp.Dot((-u.Multiply(hw) - v.Multiply(hh)) - a);
    270     fixed s3 = abp.Dot((-u.Multiply(hw) + v.Multiply(hh)) - a);
    271     if (s0.IsZero() || s1.IsZero() || s2.IsZero() || s3.IsZero())
    272         return true; // ray intersects the corner
    273 
    274     bool sign = (s0 < fixed::Zero());
    275     if ((s1 < fixed::Zero()) != sign || (s2 < fixed::Zero()) != sign || (s3 < fixed::Zero()) != sign)
    276         return true; // ray cuts through the square
    277 
    278     return false;
     247   
     248    return TestRaySquare(a, b, u, v, halfSize);
    279249}
    280250
    281251/**