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\