/******************************************************************************* * Procedure: radian_direction * Purpose: To compute a direction of the gradient image from component dx and * dy images. Because not all derriviatives are computed in the same way, this * code allows for dx or dy to have been calculated in different ways. * * FOR X: xdirtag = -1 for [-1 0 1] * xdirtag = 1 for [ 1 0 -1] * * FOR Y: ydirtag = -1 for [-1 0 1]' * ydirtag = 1 for [ 1 0 -1]' * * The resulting angle is in radians measured counterclockwise from the * xdirection. The angle points "up the gradient". *******************************************************************************/ void radian_direction(short int *delta_x, short int *delta_y, int rows, int cols, float **dir_radians, int xdirtag, int ydirtag) { int r, c, pos; float *dirim=NULL; double dx, dy; /**************************************************************************** * Allocate an image to store the direction of the gradient. ****************************************************************************/ if((dirim = (float *) calloc(rows*cols, sizeof(float))) == NULL){ fprintf(stderr, "Error allocating the gradient direction image.\n"); exit(1); } *dir_radians = dirim; for(r=0,pos=0;r<rows;r++){ for(c=0;c<cols;c++,pos++){ dx = (double)delta_x[pos]; dy = (double)delta_y[pos]; if(xdirtag == 1) dx = -dx; if(ydirtag == -1) dy = -dy; dirim[pos] = (float)angle_radians(dx, dy); } } }
bool physical_object::apply_physics(double aElapsedTime, const vec3& aForce) { auto ax = angle_radians()[0]; auto ay = angle_radians()[1]; auto az = angle_radians()[2]; auto rotation = [ax, ay, az]() -> mat33 { if (ax != 0.0 || ay != 0.0) { mat33 rx = { { 1.0, 0.0, 0.0 },{ 0.0, std::cos(ax), -std::sin(ax) },{ 0.0, std::sin(ax), std::cos(ax) } }; mat33 ry = { { std::cos(ay), 0.0, std::sin(ay) },{ 0.0, 1.0, 0.0 },{ -std::sin(ay), 0.0, std::cos(ay) } }; mat33 rz = { { std::cos(az), -std::sin(az), 0.0 },{ std::sin(az), std::cos(az), 0.0 },{ 0.0, 0.0, 1.0 } }; return rz * ry * rx; } else { return mat33{ { std::cos(az), -std::sin(az), 0.0 },{ std::sin(az), std::cos(az), 0.0 },{ 0.0, 0.0, 1.0 } }; } }(); next_physics().iVelocity = current_physics().iVelocity + ((current_physics().iMass == 0 ? vec3{} : aForce / current_physics().iMass) + (rotation * current_physics().iAcceleration)) * vec3(aElapsedTime, aElapsedTime, aElapsedTime); // v = u + at next_physics().iPosition = current_physics().iPosition + vec3(1.0, 1.0, 1.0) * (current_physics().iVelocity * aElapsedTime + ((next_physics().iVelocity - current_physics().iVelocity) * aElapsedTime / 2.0)); next_physics().iAngle = (current_physics().iAngle + current_physics().iSpin * aElapsedTime) % (2.0 * boost::math::constants::pi<scalar>()); return next_physics().iPosition != current_physics().iPosition || next_physics().iAngle != current_physics().iAngle; }