2016-03-01 63 views
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時,你如何調整大小?

回答

0

我找到了一個JS/JQuery實現。它可以在這裏找到:

https://github.com/unlocomqx/jQuery-ui-resizable-rotation-patch 

一個活生生的例子是在這裏:

http://jsfiddle.net/unloco/ors6d3xe/ 

參見重新發布在 「遊戲編程維基」

http://forum.gpwiki.org/viewtopic.php?f=2&t=13194&p=150201#p150201