Ticket #3541: 3451.3.diff

File 3451.3.diff, 2.2 KB (added by Stan, 9 years ago)

Assert the previous comments, though we cannot remove u and v for now.

  • 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 * @return true if the vector cross the square, false otherwise.
     243 */
    239244bool Geometry::TestRayAASquare(CFixedVector2D a, CFixedVector2D b, CFixedVector2D halfSize)
    240245{
    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)
    245246    CFixedVector2D u (fixed::FromInt(1), fixed::Zero());
    246247    CFixedVector2D v (fixed::Zero(), fixed::FromInt(1));
    247248
     
    248249    fixed hw = halfSize.X;
    249250    fixed hh = halfSize.Y;
    250251
    251     fixed au = a.Dot(u);
    252     fixed av = a.Dot(v);
    253 
    254     if (-hw <= au && au <= hw && -hh <= av && av <= hh)
     252    if (-hw <= a.X && a.X <= hw && -hh <= a.Y && a.Y <= hh)
    255253        return false; // a is inside
    256254
    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?
     255    if (-hw <= b.X && b.X <= hw && -hh <= b.Y && b.Y <= hh) // TODO: isn't this subsumed by the next checks?
    261256        return true; // a is outside, b is inside
    262257
    263     if ((au < -hw && bu < -hw) || (au > hw && bu > hw) || (av < -hh && bv < -hh) || (av > hh && bv > hh))
     258    if ((a.X < -hw && b.X < -hw) || (a.X > hw && b.X > hw) || (a.Y < -hh && b.Y < -hh) || (a.Y > hh && b.Y > hh))
    264259        return false; // ab is entirely above/below/side the square
    265260
    266261    CFixedVector2D abp = (b - a).Perpendicular();
    267     fixed s0 = abp.Dot((u.Multiply(hw) + v.Multiply(hh)) - a);
     262    fixed s0 = abp.Dot(halfSize - a);
    268263    fixed s1 = abp.Dot((u.Multiply(hw) - v.Multiply(hh)) - a);
    269     fixed s2 = abp.Dot((-u.Multiply(hw) - v.Multiply(hh)) - a);
     264    fixed s2 = abp.Dot(- halfSize - a);
    270265    fixed s3 = abp.Dot((-u.Multiply(hw) + v.Multiply(hh)) - a);
    271266    if (s0.IsZero() || s1.IsZero() || s2.IsZero() || s3.IsZero())
    272267        return true; // ray intersects the corner