*** octave-11159/src/graphics.cc 2010-10-27 09:40:17.169811002 +0200 --- octave-11159-mod/src/graphics.cc 2010-10-27 13:22:35.359811001 +0200 *************** axes::properties::set_defaults (base_gra *** 3381,3387 **** linestyleorder = "-"; linewidth = 0.5; minorgridlinestyle = ":"; ! // Note: plotboxaspectratio will be set through update_aspectratiors plotboxaspectratiomode = "auto"; projection = "orthographic"; tickdir = "in"; --- 3381,3387 ---- linestyleorder = "-"; linewidth = 0.5; minorgridlinestyle = ":"; ! // Note: plotboxaspectratio will be set through update_aspectratios plotboxaspectratiomode = "auto"; projection = "orthographic"; tickdir = "in"; *************** axes::properties::update_camera (void) *** 3911,3919 **** --- 3911,3924 ---- x_gl_mat2 = x_viewport * x_projection; } + static bool updating_aspectratios = false; + void axes::properties::update_aspectratios (void) { + if (updating_aspectratios) + return; + Matrix xlimits = get_xlim ().matrix_value (); Matrix ylimits = get_ylim ().matrix_value (); Matrix zlimits = get_zlim ().matrix_value (); *************** axes::properties::update_aspectratios (v *** 3922,3956 **** double dy = (ylimits(1)-ylimits(0)); double dz = (zlimits(1)-zlimits(0)); if (dataaspectratiomode_is ("auto")) { ! double dmin = xmin (xmin (dx, dy), dz); ! Matrix da (1, 3, 0.0); ! da(0) = dx/dmin; ! da(1) = dy/dmin; ! da(2) = dz/dmin; ! dataaspectratio = da; } ! if (plotboxaspectratiomode_is ("auto")) { ! if (dataaspectratiomode_is ("auto")) ! plotboxaspectratio = Matrix (1, 3, 1.0); ! else { ! Matrix da = get_dataaspectratio ().matrix_value (); ! Matrix pba (1, 3, 0.0); pba(0) = dx/da(0); pba(1) = dy/da(1); pba(2) = dz/da(2); } } - - // FIXME -- if plotboxaspectratiomode is "manual", limits - // and/or dataaspectratio might be adapted. } // The INTERNAL flag defines whether position or outerposition is used. --- 3927,4083 ---- double dy = (ylimits(1)-ylimits(0)); double dz = (zlimits(1)-zlimits(0)); + Matrix da = get_dataaspectratio ().matrix_value (); + Matrix pba = get_plotboxaspectratio ().matrix_value (); + if (dataaspectratiomode_is ("auto")) { ! if (plotboxaspectratiomode_is ("auto")) ! { ! pba = Matrix (1, 3, 1.0); ! plotboxaspectratio.set (pba, false); ! } ! ! da(0) = dx/pba(0); ! da(1) = dy/pba(1); ! da(2) = dz/pba(2); ! double dmin = xmin (xmin (da(0), da(1)), da(2)); ! da(0) = da(0)/dmin; ! da(1) = da(1)/dmin; ! da(2) = da(2)/dmin; ! ! dataaspectratio.set (da, false); } + else if (plotboxaspectratiomode_is ("auto")) + { + pba(0) = dx/da(0); + pba(1) = dy/da(1); + pba(2) = dz/da(2); + double dmin = xmin (xmin (pba(0), pba(1)), pba(2)); + + pba(0) = pba(0)/dmin; + pba(1) = pba(1)/dmin; + pba(2) = pba(2)/dmin; ! plotboxaspectratio.set (pba, false); ! } ! else { ! double s = -octave_Inf; ! bool modified_limits = false; ! ! if (xlimmode_is ("auto") && ylimmode_is ("auto") && zlimmode_is ("auto")) ! { ! modified_limits = true; ! Matrix kids = get_children (); ! ! double minx = octave_Inf; ! double maxx = -octave_Inf; ! double min_pos_x = octave_Inf; ! get_children_limits (minx, maxx, min_pos_x, kids, 'x'); ! if (!xisinf (minx) && !xisnan (minx) && !xisinf (maxx) && !xisnan (maxx)) ! { ! xlimits(0) = minx; ! xlimits(1) = maxx; ! s = xmax(s, ( maxx - minx ) / ( pba(0) * da(0) ) ); ! } ! ! double miny = octave_Inf; ! double maxy = -octave_Inf; ! double min_pos_y = octave_Inf; ! get_children_limits (miny, maxy, min_pos_y, kids, 'y'); ! if (!xisinf (miny) && !xisnan (miny) && !xisinf (maxy) && !xisnan (maxy)) ! { ! ylimits(0) = miny; ! ylimits(1) = maxy; ! s = xmax(s, ( maxy - miny ) / ( pba(1) * da(1) ) ); ! } ! ! double minz = octave_Inf; ! double maxz = -octave_Inf; ! double min_pos_z = octave_Inf; ! get_children_limits (minz, maxz, min_pos_z, kids, 'z'); ! if (!xisinf (minz) && !xisnan (minz) && !xisinf (maxz) && !xisnan (maxz)) ! { ! zlimits(0) = minz; ! zlimits(1) = maxz; ! s = xmax(s, ( maxz - minz ) / ( pba(2) * da(2) ) ); ! } ! } ! else if (xlimmode_is ("auto") && ylimmode_is ("auto")) { ! modified_limits = true; ! s = ( zlimits(1) - zlimits(0) ) / ( pba(2) * da(2) ); ! } ! else if (ylimmode_is ("auto") && zlimmode_is ("auto")) ! { ! modified_limits = true; ! s = ( xlimits(1) - xlimits(0) ) / ( pba(0) * da(0) ); ! } ! else if (zlimmode_is ("auto") && xlimmode_is ("auto")) ! { ! modified_limits = true; ! s = ( ylimits(1) - ylimits(0) ) / ( pba(1) * da(1) ); ! } ! ! if (modified_limits) ! { ! ! unwind_protect frame; ! frame.protect_var (updating_aspectratios); ! ! updating_aspectratios = true; ! ! dx = pba(0) *da(0); ! dy = pba(1) *da(1); ! dz = pba(2) *da(2); ! if (xisinf (s)) ! s = 1 / xmin (xmin (dx, dy), dz); ! ! if (xlimmode_is ("auto")) ! { ! dx = s * dx; ! xlimits(0) = 0.5 * (xlimits(0) + xlimits(1) - dx); ! xlimits(1) = xlimits(0) + dx; ! set_xlim(xlimits); ! set_xlimmode("auto"); ! } + if (ylimmode_is ("auto")) + { + dy = s * dy; + ylimits(0) = 0.5 * (ylimits(0) + ylimits(1) - dy); + ylimits(1) = ylimits(0) + dy; + set_ylim(ylimits); + set_ylimmode("auto"); + } + + if (zlimmode_is ("auto")) + { + dz = s * dz; + zlimits(0) = 0.5 * (zlimits(0) + zlimits(1) - dz); + zlimits(1) = zlimits(0) + dz; + set_zlim(zlimits); + set_zlimmode("auto"); + } + } + else + { pba(0) = dx/da(0); pba(1) = dy/da(1); pba(2) = dz/da(2); + + double dmin = xmin (xmin (pba(0), pba(1)), pba(2)); + + pba(0) = pba(0)/dmin; + pba(1) = pba(1)/dmin; + pba(2) = pba(2)/dmin; + + plotboxaspectratio.set (pba, false); } } } // The INTERNAL flag defines whether position or outerposition is used. *************** static bool updating_axis_limits = false *** 4448,4454 **** void axes::update_axis_limits (const std::string& axis_type) { ! if (updating_axis_limits) return; Matrix kids = xproperties.get_children (); --- 4575,4581 ---- void axes::update_axis_limits (const std::string& axis_type) { ! if (updating_axis_limits || updating_aspectratios) return; Matrix kids = xproperties.get_children ();