Mercurial > octave-nkf
comparison src/graphics.cc @ 10917:888c75785221
Improvements to FLTK backend rotation
* Don't rotate past the top and bottom
* Implement __calc_dimensions__ in C++ so that it's available to graphics object ctors
* Make rotation the default mode in 3d plots
* Replace an instance of m-script __calc_dimensions__ with C++ version
author | Jordi Guti?rrez Hermoso <jordigh@gmail.com> |
---|---|
date | Fri, 27 Aug 2010 15:11:35 -0400 |
parents | a4f482e66b65 |
children | 56f9c10e9e98 |
comparison
equal
deleted
inserted
replaced
10916:5074494f01a9 | 10917:888c75785221 |
---|---|
3432 Matrix tview = get_view ().matrix_value (); | 3432 Matrix tview = get_view ().matrix_value (); |
3433 double az = tview(0), el = tview(1); | 3433 double az = tview(0), el = tview(1); |
3434 | 3434 |
3435 if (el == 90 || el == -90) | 3435 if (el == 90 || el == -90) |
3436 { | 3436 { |
3437 c_upv(0) = -sin(az*M_PI/180.0)*(xlimits(1)-xlimits(0))/pb(0); | 3437 c_upv(0) = |
3438 c_upv(1) = cos(az*M_PI/180.0)*(ylimits(1)-ylimits(0))/pb(1); | 3438 -signum(el)*sin(az*M_PI/180.0)*(xlimits(1)-xlimits(0))/pb(0); |
3439 c_upv(1) = | |
3440 signum(el)*cos(az*M_PI/180.0)*(ylimits(1)-ylimits(0))/pb(1); | |
3439 } | 3441 } |
3440 else | 3442 else |
3441 c_upv(2) = 1; | 3443 c_upv(2) = 1; |
3442 | 3444 |
3443 cameraupvector = xform2cam (c_upv); | 3445 cameraupvector = xform2cam (c_upv); |
4276 | 4278 |
4277 xlims (0) += delta_x; | 4279 xlims (0) += delta_x; |
4278 xlims (1) += delta_x; | 4280 xlims (1) += delta_x; |
4279 ylims (0) += delta_y; | 4281 ylims (0) += delta_y; |
4280 ylims (1) += delta_y; | 4282 ylims (1) += delta_y; |
4281 | 4283 |
4282 zoom (xlims, ylims, false); | 4284 zoom (xlims, ylims, false); |
4283 } | 4285 } |
4284 | 4286 |
4285 void | 4287 void |
4286 axes::properties::rotate_view (double delta_el, double delta_az) | 4288 axes::properties::rotate_view (double delta_el, double delta_az) |
4287 { | 4289 { |
4288 Matrix v = get_view ().matrix_value (); | 4290 Matrix v = get_view ().matrix_value (); |
4289 | 4291 |
4290 v (1) += delta_el; | 4292 v (1) += delta_el; |
4291 v (0) -= delta_az; | 4293 |
4294 if(v(1) > 90) | |
4295 v(1) = 90; | |
4296 if(v(1) < -90) | |
4297 v(1) = -90; | |
4298 | |
4299 v (0) = fmod(v(0) - delta_az + 720,360); | |
4292 | 4300 |
4293 set_view(v); | 4301 set_view(v); |
4294 update_transform(); | 4302 update_transform(); |
4295 } | 4303 } |
4296 | 4304 |
5495 retval = make_graphics_object (#TYPE, args); \ | 5503 retval = make_graphics_object (#TYPE, args); \ |
5496 else \ | 5504 else \ |
5497 print_usage (); \ | 5505 print_usage (); \ |
5498 \ | 5506 \ |
5499 return retval | 5507 return retval |
5508 | |
5509 int | |
5510 calc_dimensions (const graphics_object& go) | |
5511 { | |
5512 | |
5513 int nd = 2; | |
5514 | |
5515 if (go.isa ("surface")) | |
5516 nd = 3; | |
5517 | |
5518 if ((go.isa ("line") || go.isa ("patch")) && ! go.get("zdata").is_empty ()) | |
5519 nd = 3; | |
5520 | |
5521 Matrix kids = go.get_properties().get_children (); | |
5522 | |
5523 for (octave_idx_type i = 0; i < kids.length (); i++) | |
5524 { | |
5525 graphics_handle hnd = gh_manager::lookup (kids(i)); | |
5526 | |
5527 if (hnd.ok ()) | |
5528 { | |
5529 const graphics_object& kid = gh_manager::get_object(hnd); | |
5530 | |
5531 if (kid.valid_object()) | |
5532 nd = calc_dimensions (kid); | |
5533 | |
5534 if (nd == 3) | |
5535 break; | |
5536 } | |
5537 } | |
5538 | |
5539 return nd; | |
5540 } | |
5541 | |
5542 DEFUN (__calc_dimensions__, args, , | |
5543 "-*- texinfo -*-\n\ | |
5544 @deftypefn {Built-in Function} {} __calc_dimensions__ (@var{axes})\n\ | |
5545 Internal function. Determine the number of dimensions in a graphics\n\ | |
5546 object, whether 2 or 3.\n\ | |
5547 @end deftypefn") | |
5548 { | |
5549 gh_manager::autolock guard; | |
5550 | |
5551 octave_value retval; | |
5552 | |
5553 int nargin = args.length (); | |
5554 | |
5555 if (nargin == 1) | |
5556 { | |
5557 double h = args(0).double_value (); | |
5558 | |
5559 if (! error_state) | |
5560 retval = calc_dimensions (gh_manager::get_object (h)); | |
5561 else | |
5562 error ("__calc_dimensions__: expecting graphics handle as only argument"); | |
5563 } | |
5564 else | |
5565 print_usage (); | |
5566 | |
5567 return retval; | |
5568 } | |
5500 | 5569 |
5501 DEFUN (__go_axes__, args, , | 5570 DEFUN (__go_axes__, args, , |
5502 "-*- texinfo -*-\n\ | 5571 "-*- texinfo -*-\n\ |
5503 @deftypefn {Built-in Function} {} __go_axes__ (@var{parent})\n\ | 5572 @deftypefn {Built-in Function} {} __go_axes__ (@var{parent})\n\ |
5504 Undocumented internal function.\n\ | 5573 Undocumented internal function.\n\ |