| 3949 | } |
| 3950 | |
| 3951 | bool CartesianPlotPrivate::translateRange(int xIndex, int yIndex, const QPointF& logicalStart, const QPointF& logicalEnd, bool translateX, bool translateY) { |
| 3952 | // handle the change in x |
| 3953 | bool translationX = false, translationY = false; |
| 3954 | if (translateX && logicalStart.x() - logicalEnd.x() != 0) { // TODO: find better method |
| 3955 | translationX = true; |
| 3956 | double start{logicalStart.x()}, end{logicalEnd.x()}; |
| 3957 | switch (range(Dimension::X, xIndex).scale()) { |
| 3958 | case RangeT::Scale::Linear: { |
| 3959 | const double delta = (start - end); |
| 3960 | range(Dimension::X, xIndex).translate(delta); |
| 3961 | break; |
| 3962 | } |
| 3963 | case RangeT::Scale::Log10: { |
| 3964 | if (end == 0 || start / end <= 0) |
| 3965 | break; |
| 3966 | const double delta = log10(start / end); |
| 3967 | range(Dimension::X, xIndex) *= pow(10, delta); |
| 3968 | break; |
| 3969 | } |
| 3970 | case RangeT::Scale::Log2: { |
| 3971 | if (end == 0 || start / end <= 0) |
| 3972 | break; |
| 3973 | const double delta = log2(start / end); |
| 3974 | range(Dimension::X, xIndex) *= exp2(delta); |
| 3975 | break; |
| 3976 | } |
| 3977 | case RangeT::Scale::Ln: { |
| 3978 | if (end == 0 || start / end <= 0) |
| 3979 | break; |
| 3980 | const double delta = log(start / end); |
| 3981 | range(Dimension::X, xIndex) *= exp(delta); |
| 3982 | break; |
| 3983 | } |
| 3984 | case RangeT::Scale::Sqrt: { |
| 3985 | if (start < 0 || end < 0) |
| 3986 | break; |
| 3987 | const double delta = sqrt(start) - sqrt(end); |
| 3988 | range(Dimension::X, xIndex).translate(delta * delta); |
| 3989 | break; |
| 3990 | } |
| 3991 | case RangeT::Scale::Square: { |
| 3992 | if (end <= start) |
| 3993 | break; |
| 3994 | const double delta = end * end - start * start; |
| 3995 | range(Dimension::X, xIndex).translate(sqrt(delta)); |
| 3996 | break; |
| 3997 | } |
| 3998 | case RangeT::Scale::Inverse: { |
| 3999 | if (start == 0. || end == 0. || end <= start) |
| 4000 | break; |
| 4001 | const double delta = 1. / start - 1. / end; |
| 4002 | range(Dimension::X, xIndex).translate(1. / delta); |
| 4003 | break; |
| 4004 | } |
| 4005 | } |
| 4006 | } |
| 4007 | |
| 4008 | if (translateY && logicalStart.y() - logicalEnd.y() != 0) { |
nothing calls this directly
no test coverage detected