0
如何調整一個旋轉矩形你如何調整一個旋轉矩形
struct rect
{
double x;
double y;
double width;
double height;
double rotation_degrees;
};
假設你有一個用於 調整大小並拖動邊框。也就是說,用戶抓住邊框的邊角來拉伸或縮小矩形。這是作爲事件發送的。 delta_x是水平方向的移動, delta_y是垂直方向的移動。
enum event_type
get_event_rotated(
enum event_type const i_event,
double const i_rotation_degrees)
{
enum event_type l_event;
if (90.0 > i_rotation_degrees)
{
l_event= i_event;
}
else if (180.0 > i_rotation_degrees)
{
switch(i_event)
{
case event_resize_north:
l_event= event_resize_east;
break;
case event_resize_north_east:
l_event= event_resize_south_east;
break;
case event_resize_east:
l_event= event_resize_south;
break;
case event_resize_south_east:
l_event= event_resize_south_west;
break;
case event_resize_south:
l_event= event_resize_west;
break;
case event_resize_south_west:
l_event= event_resize_north_west;
break;
case event_resize_west:
l_event= event_resize_north;
break;
case event_resize_north_west:
l_event= event_resize_north_east;
break;
default:
break;
}
}
else if (270.0 > i_rotation_degrees)
{
switch(i_event)
{
case event_resize_north:
l_event= event_resize_south;
break;
case event_resize_north_east:
l_event= event_resize_south_west;
break;
case event_resize_east:
l_event= event_resize_west;
break;
case event_resize_south_east:
l_event= event_resize_north_west;
break;
case event_resize_south:
l_event= event_resize_north;
break;
case event_resize_south_west:
l_event= event_resize_north_east;
break;
case event_resize_west:
l_event= event_resize_east;
break;
case event_resize_north_west:
l_event= event_resize_south_east;
break;
default:
break;
}
}
else
{
switch(i_event)
{
case event_resize_north:
l_event= event_resize_west;
break;
case event_resize_north_east:
l_event= event_resize_north_west;
break;
case event_resize_east:
l_event= event_resize_north;
break;
case event_resize_south_east:
l_event= event_resize_north_east;
break;
case event_resize_south:
l_event= event_resize_east;
break;
case event_resize_south_west:
l_event= event_resize_south_east;
break;
case event_resize_west:
l_event= event_resize_south;
break;
case event_resize_north_west:
l_event= event_resize_south_west;
break;
default:
break;
}
}
return l_event;
}
void rect_resize(
struct rect *const io_box,
enum event_type const event,
double const delta_x,
double const delta_y)
{
enum event_type _event;
double _delta_x= delta_x;
double _delta_y= delta_y;
cairo_matrix_t matrix;
cairo_matrix_init(
&matrix,
1.0, 0.0,
0.0, 1.0,
0.0, 0.0);
cairo_matrix_rotate(&matrix, DEG2RAD((*io_box).rotation_degrees));
cairo_matrix_transform_point(&matrix, &_delta_x, &_delta_y);
_event= get_event_rotated(event, (*io_box).rotation_degrees);
switch(_event)
{
case event_resize_east:
(*io_box).width+= _delta_x;
break;
case event_resize_north:
(*io_box)._delta_y+= _delta_y;
(*io_box).height-= _delta_y;
break;
case event_resize_north_east:
(*io_box)._delta_y+= _delta_y;
(*io_box).height-= _delta_y;
(*io_box).width+= _delta_x;
break;
case event_resize_north_west:
(*io_box)._delta_y+= _delta_y;
(*io_box).height-= _delta_y;
(*io_box).x+= _delta_x;
(*io_box).width-= _delta_x;
break;
case event_resize_south:
(*io_box).height+= _delta_y;
break;
case event_resize_south_east:
(*io_box).height+= _delta_y;
(*io_box).width+= _delta_x;
break;
case event_resize_south_west:
(*io_box).height+= _delta_y;
(*io_box).x+= _delta_x;
(*io_box).width-= _delta_x;
break;
case event_resize_west:
(*io_box).x+= _delta_x;
(*io_box).width-= _delta_x;
break;
default:
break;
}
// need maths to adjust, what that is, I dunno?
return;
}
當rotation_degrees不是0時,你如何調整大小?