00001
00002
00003
00004
00005
00006
00007
00008 #include "EngaugeAssert.h"
00009 #include "Logger.h"
00010 #include <qmath.h>
00011 #include "ZoomTransition.h"
00012
00013 const double CLOSER = qPow (2, 1.0 / 3.0);
00014 const double FARTHER = 1.0 / CLOSER;
00015
00016 ZoomTransition::ZoomTransition ()
00017 {
00018 m_zoomMapToFactor [ZOOM_16_TO_1] = 16.0;
00019 m_zoomMapToFactor [ZOOM_16_TO_1_FARTHER] = 16.0 * FARTHER;
00020 m_zoomMapToFactor [ZOOM_8_TO_1_CLOSER] = 8.0 * CLOSER;
00021 m_zoomMapToFactor [ZOOM_8_TO_1] = 8.0;
00022 m_zoomMapToFactor [ZOOM_8_TO_1_FARTHER] = 8.0 * FARTHER;
00023 m_zoomMapToFactor [ZOOM_4_TO_1_CLOSER] = 4.0 * CLOSER;
00024 m_zoomMapToFactor [ZOOM_4_TO_1] = 4.0;
00025 m_zoomMapToFactor [ZOOM_4_TO_1_FARTHER] = 4.0 * FARTHER;
00026 m_zoomMapToFactor [ZOOM_2_TO_1_CLOSER] = 2.0 * CLOSER;
00027 m_zoomMapToFactor [ZOOM_2_TO_1] = 2.0;
00028 m_zoomMapToFactor [ZOOM_2_TO_1_FARTHER] = 2.0 * FARTHER;
00029 m_zoomMapToFactor [ZOOM_1_TO_1_CLOSER] = 1.0 * CLOSER;
00030 m_zoomMapToFactor [ZOOM_1_TO_1] = 1.0;
00031 m_zoomMapToFactor [ZOOM_1_TO_1_FARTHER] = 1.0 * FARTHER;
00032 m_zoomMapToFactor [ZOOM_1_TO_2_CLOSER] = 0.5 * CLOSER;
00033 m_zoomMapToFactor [ZOOM_1_TO_2] = 0.5;
00034 m_zoomMapToFactor [ZOOM_1_TO_2_FARTHER] = 0.5 * FARTHER;
00035 m_zoomMapToFactor [ZOOM_1_TO_4_CLOSER] = 0.25 * CLOSER;
00036 m_zoomMapToFactor [ZOOM_1_TO_4] = 0.25;
00037 m_zoomMapToFactor [ZOOM_1_TO_4_FARTHER] = 0.25 * FARTHER;
00038 m_zoomMapToFactor [ZOOM_1_TO_8_CLOSER] = 0.125 * CLOSER;
00039 m_zoomMapToFactor [ZOOM_1_TO_8] = 0.125;
00040 m_zoomMapToFactor [ZOOM_1_TO_8_FARTHER] = 0.125 * FARTHER;
00041 m_zoomMapToFactor [ZOOM_1_TO_16_CLOSER] = 0.0625 * CLOSER;
00042 m_zoomMapToFactor [ZOOM_1_TO_16] = 0.0625;
00043 }
00044
00045 double ZoomTransition::mapToFactor (ZoomFactor zoomFactor) const
00046 {
00047 ENGAUGE_ASSERT (m_zoomMapToFactor.contains (zoomFactor));
00048
00049 return m_zoomMapToFactor [zoomFactor];
00050 }
00051
00052 ZoomFactor ZoomTransition::zoomIn (ZoomFactor currentZoomFactor,
00053 double m11,
00054 double m22,
00055 bool actionZoomFillIsChecked) const
00056 {
00057 LOG4CPP_INFO_S ((*mainCat)) << "ZoomTransition::zoomIn";
00058
00059
00060 ZoomFactor zoomFactorOld = currentZoomFactor;
00061
00062 if (actionZoomFillIsChecked) {
00063
00064
00065
00066 double xScale = m11;
00067 double yScale = m22;
00068 double scale = qMin(xScale, yScale);
00069
00070 for (int zoom = ZOOM_1_TO_16_CLOSER; zoom >= 0; zoom--) {
00071 ZoomFactor zoomFactor = (ZoomFactor) zoom;
00072 if (scale < m_zoomMapToFactor [zoomFactor]) {
00073 zoomFactorOld = zoomFactor;
00074 break;
00075 }
00076 }
00077 }
00078
00079 ZoomFactor zoomFactorNew = ZOOM_16_TO_1;
00080 if (zoomFactorOld > ZOOM_16_TO_1) {
00081 zoomFactorNew = (ZoomFactor) (zoomFactorOld - 1);
00082 }
00083
00084 return zoomFactorNew;
00085 }
00086
00087 ZoomFactor ZoomTransition::zoomOut (ZoomFactor currentZoomFactor,
00088 double m11,
00089 double m22,
00090 bool actionZoomFillIsChecked) const
00091 {
00092 LOG4CPP_INFO_S ((*mainCat)) << "ZoomTransition::zoomOut";
00093
00094
00095 ZoomFactor zoomFactorOld = currentZoomFactor;
00096
00097 if (actionZoomFillIsChecked) {
00098
00099
00100
00101 double xScale = m11;
00102 double yScale = m22;
00103 double scale = qMax(xScale, yScale);
00104
00105 for (int zoom = 0; zoom <= ZOOM_1_TO_16_CLOSER; zoom++) {
00106 ZoomFactor zoomFactor = (ZoomFactor) zoom;
00107 if (scale > m_zoomMapToFactor [zoomFactor]) {
00108 zoomFactorOld = zoomFactor;
00109 break;
00110 }
00111 }
00112 }
00113
00114 ZoomFactor zoomFactorNew = ZOOM_1_TO_16;
00115 if (zoomFactorOld < ZOOM_1_TO_16) {
00116 zoomFactorNew = (ZoomFactor) (zoomFactorOld + 1);
00117 }
00118
00119 return zoomFactorNew;
00120 }