Ticket #3541: 3451.3.diff
File 3451.3.diff, 2.2 KB (added by , 9 years ago) |
---|
-
source/simulation2/helpers/Geometry.cpp
236 236 return false; 237 237 } 238 238 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 */ 239 244 bool Geometry::TestRayAASquare(CFixedVector2D a, CFixedVector2D b, CFixedVector2D halfSize) 240 245 { 241 // Exactly like TestRaySquare with u=(1,0), v=(0,1)242 243 // Assume the compiler is clever enough to inline and simplify all this244 // (TODO: stop assuming that)245 246 CFixedVector2D u (fixed::FromInt(1), fixed::Zero()); 246 247 CFixedVector2D v (fixed::Zero(), fixed::FromInt(1)); 247 248 … … 248 249 fixed hw = halfSize.X; 249 250 fixed hh = halfSize.Y; 250 251 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) 255 253 return false; // a is inside 256 254 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? 261 256 return true; // a is outside, b is inside 262 257 263 if ((a u < -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)) 264 259 return false; // ab is entirely above/below/side the square 265 260 266 261 CFixedVector2D abp = (b - a).Perpendicular(); 267 fixed s0 = abp.Dot( (u.Multiply(hw) + v.Multiply(hh))- a);262 fixed s0 = abp.Dot(halfSize - a); 268 263 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); 270 265 fixed s3 = abp.Dot((-u.Multiply(hw) + v.Multiply(hh)) - a); 271 266 if (s0.IsZero() || s1.IsZero() || s2.IsZero() || s3.IsZero()) 272 267 return true; // ray intersects the corner