/*! \brief rotate a net object around a centerpoint * \par Function Description * This function rotates a net \a object around the point * (\a world_centerx, \a world_centery). * * \param [in] toplevel The TOPLEVEL object * \param [in] world_centerx x-coord of the rotation center * \param [in] world_centery y-coord of the rotation center * \param [in] angle The angle to rotat the net object * \param [in] object The net object * \note only steps of 90 degrees are allowed for the \a angle */ void o_net_rotate_world(TOPLEVEL *toplevel, int world_centerx, int world_centery, int angle, OBJECT *object) { int newx, newy; if (angle == 0) return; /* translate object to origin */ o_net_translate_world(toplevel, -world_centerx, -world_centery, object); rotate_point_90(object->line->x[0], object->line->y[0], angle, &newx, &newy); object->line->x[0] = newx; object->line->y[0] = newy; rotate_point_90(object->line->x[1], object->line->y[1], angle, &newx, &newy); object->line->x[1] = newx; object->line->y[1] = newy; o_net_translate_world(toplevel, world_centerx, world_centery, object); }
/*! \brief Rotate BOX OBJECT using WORLD coordinates. * \par Function Description * The function #o_box_rotate_world() rotate the box described by * <B>*object</B> around the (<B>world_centerx</B>, <B>world_centery</B>) point by * <B>angle</B> degrees. * The center of rotation is in world unit. * * \param [in] toplevel The TOPLEVEL object. * \param [in] world_centerx Rotation center x coordinate in WORLD units. * \param [in] world_centery Rotation center y coordinate in WORLD units. * \param [in] angle Rotation angle in degrees (See note below). * \param [in,out] object BOX OBJECT to rotate. * */ void o_box_rotate_world(TOPLEVEL *toplevel, int world_centerx, int world_centery, int angle, OBJECT *object) { int newx1, newy1; int newx2, newy2; /*! \note * Only 90 degree multiple and positive angles are allowed. */ /* angle must be positive */ if(angle < 0) angle = -angle; /* angle must be a 90 multiple or no rotation performed */ if((angle % 90) != 0) return; /*! \note * The center of rotation (<B>world_centerx</B>, <B>world_centery</B>) is * translated to the origin. The rotation of the upper left and lower right * corner are then performed. Finally, the rotated box is translated back * to its previous location. */ /* translate object to origin */ object->box->upper_x -= world_centerx; object->box->upper_y -= world_centery; object->box->lower_x -= world_centerx; object->box->lower_y -= world_centery; /* rotate the upper left corner of the box */ rotate_point_90(object->box->upper_x, object->box->upper_y, angle, &newx1, &newy1); /* rotate the lower left corner of the box */ rotate_point_90(object->box->lower_x, object->box->lower_y, angle, &newx2, &newy2); /* reorder the corners after rotation */ object->box->upper_x = min(newx1,newx2); object->box->upper_y = max(newy1,newy2); object->box->lower_x = max(newx1,newx2); object->box->lower_y = min(newy1,newy2); /* translate object back to normal position */ object->box->upper_x += world_centerx; object->box->upper_y += world_centery; object->box->lower_x += world_centerx; object->box->lower_y += world_centery; /* recalc boundings and world coords */ o_box_recalc(toplevel, object); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_complex_rotate_world(TOPLEVEL *toplevel, int centerx, int centery, int angle, OBJECT *object) { int x, y; int newx, newy; g_return_if_fail (object!=NULL); g_return_if_fail ((object->type == OBJ_COMPLEX) || (object->type == OBJ_PLACEHOLDER)); x = object->complex->x + (-centerx); y = object->complex->y + (-centery); rotate_point_90(x, y, angle, &newx, &newy); x = newx + (centerx); y = newy + (centery); o_complex_translate_world(toplevel, -object->complex->x, -object->complex->y, object); o_glist_rotate_world (toplevel, 0, 0, angle, object->complex->prim_objs); object->complex->x = 0; object->complex->y = 0; o_complex_translate_world(toplevel, x, y, object); object->complex->angle = ( object->complex->angle + angle ) % 360; }
/*! \brief * \par Function Description * This function rotates the world coordinates of an arc of an angle * specified by <B>angle</B>. The center of the rotation is given by * (<B>world_centerx</B>,<B>world_centery</B>). * * The arc is translated in order to put the center of the rotation * on the origin. The center of the arc is then rotated of the angle * specified by <B>angle</B>. The start angle of the arc is incremented by <B>angle</B>. * * The arc is finally back translated to its previous location on the page. * * <B>world_centerx</B> and <B>world_centery</B> are in world units, <B>angle</B> is in degrees. * * \param [in] toplevel The TOPLEVEL object. * \param [in] world_centerx * \param [in] world_centery * \param [in] angle * \param [in] object */ void o_arc_rotate_world(TOPLEVEL *toplevel, int world_centerx, int world_centery, int angle, OBJECT *object) { int x, y, newx, newy; /* translate object to origin */ object->arc->x -= world_centerx; object->arc->y -= world_centery; /* get center, and rotate center */ x = object->arc->x; y = object->arc->y; if(angle % 90 == 0) { rotate_point_90(x, y, angle % 360, &newx, &newy); } else { rotate_point(x, y, angle % 360, &newx, &newy); } object->arc->x = newx; object->arc->y = newy; /* apply rotation to angles */ object->arc->start_angle = (object->arc->start_angle + angle) % 360; /* end_angle is unchanged as it is the sweep of the arc */ /* object->arc->end_angle = (object->arc->end_angle); */ /* translate object to its previous place */ object->arc->x += world_centerx; object->arc->y += world_centery; /* update the screen coords and the bounding box */ o_arc_recalc(toplevel, object); }
/*! \brief Rotate Line OBJECT using WORLD coordinates. * \par Function Description * This function rotates the line described by * <B>*object</B> around the (<B>world_centerx</B>,<B>world_centery</B>) * point by <B>angle</B> degrees. * The center of rotation is in world units. * * \param [in] toplevel The TOPLEVEL object. * \param [in] world_centerx Rotation center x coordinate in WORLD units. * \param [in] world_centery Rotation center y coordinate in WORLD units. * \param [in] angle Rotation angle in degrees (See note below). * \param [in,out] object Line OBJECT to rotate. */ void o_line_rotate_world(TOPLEVEL *toplevel, int world_centerx, int world_centery, int angle, OBJECT *object) { int newx, newy; if (angle == 0) return; /* angle must be positive */ if(angle < 0) angle = -angle; /* angle must be 90 multiple or no rotation performed */ if((angle % 90) != 0) return; /* * The center of rotation (<B>world_centerx</B>,<B>world_centery</B>) * is translated to the origin. The rotation of the two ends of * the line is performed. FInally, the rotated line is translated * back to its previous location. */ /* translate object to origin */ o_line_translate_world(toplevel, -world_centerx, -world_centery, object); /* rotate line end 1 */ rotate_point_90(object->line->x[0], object->line->y[0], angle, &newx, &newy); object->line->x[0] = newx; object->line->y[0] = newy; /* rotate line end 2 */ rotate_point_90(object->line->x[1], object->line->y[1], angle, &newx, &newy); object->line->x[1] = newx; object->line->y[1] = newy; /* translate object back to normal position */ o_line_translate_world(toplevel, world_centerx, world_centery, object); }
/*! \brief Rotate Circle OBJECT using WORLD coordinates. * \par Function Description * The function #o_circle_rotate_world() rotate the circle described by * <B>*object</B> around the (<B>world_centerx</B>,<B>world_centery</B>) point by * angle <B>angle</B> degrees. * The center of rotation is in world unit. * * \param [in] toplevel The TOPLEVEL object. * \param [in] world_centerx Rotation center x coordinate in WORLD units. * \param [in] world_centery Rotation center y coordinate in WORLD units. * \param [in] angle Rotation angle in degrees (See note below). * \param [in,out] object Circle OBJECT to rotate. */ void o_circle_rotate_world(TOPLEVEL *toplevel, int world_centerx, int world_centery, int angle, OBJECT *object) { int newx, newy; int x, y; /* Only 90 degree multiple and positive angles are allowed. */ /* angle must be positive */ if(angle < 0) angle = -angle; /* angle must be a 90 multiple or no rotation performed */ if((angle % 90) != 0) return; /* * The center of rotation (<B>world_centerx</B>,<B>world_centery</B>) is * translated to the origin. The rotation of the center around the origin * is then performed. Finally, the rotated circle is translated back to * its previous location. */ /* translate object to origin */ object->circle->center_x -= world_centerx; object->circle->center_y -= world_centery; /* rotate the center of the circle around the origin */ x = object->circle->center_x; y = object->circle->center_y; rotate_point_90(x, y, angle, &newx, &newy); object->circle->center_x = newx; object->circle->center_y = newy; /* translate back in position */ object->circle->center_x += world_centerx; object->circle->center_y += world_centery; o_circle_recalc(toplevel, object); }