diff --git a/src/simulation/simtools/Cyclone.cpp b/src/simulation/simtools/Cyclone.cpp index 79d9debf1..dd7a30502 100644 --- a/src/simulation/simtools/Cyclone.cpp +++ b/src/simulation/simtools/Cyclone.cpp @@ -16,19 +16,23 @@ int Tool_Cycl::Perform(Simulation * sim, Particle * cpart, int x, int y, int bru { /* Air velocity calculation. - Air velocity X = cosine of cell angle - Angle of cell is calculated via cells X/Y relation to the brush center and arctangent - Angle has 1.57 radians added to it (90 degrees) in order to make the velocity be at 90 degrees to the centerpoint. - Ditto for Y, except Y uses sine + (x, y) -- turn 90 deg -> (-y, x) */ // only trigger once per cell (less laggy) if ((x%CELL) == 0 && (y%CELL) == 0) { + if(brushX == x && brushY == y) + return 1; + float *vx = &sim->air->vx[y / CELL][x / CELL]; float *vy = &sim->air->vy[y / CELL][x / CELL]; - *vx -= (strength / 16) * (tpt::cos(1.57f + (tpt::atan2(brushY - y, brushX - x)))); - *vy -= (strength / 16) * (tpt::sin(1.57f + (tpt::atan2(brushY - y, brushX - x)))); + float dvx = brushX - x; + float dvy = brushY - y; + float invsqr = 1/sqrtf(dvx*dvx + dvy*dvy); + + *vx -= (strength / 16) * (-dvy)*invsqr; + *vy -= (strength / 16) * dvx*invsqr; // Clamp velocities if (*vx > 256.0f)