/*
TikZiT - a GUI diagram editor for TikZ
Copyright (C) 2018 Aleks Kissinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "util.h"
qreal bezierInterpolate(qreal dist, qreal c0, qreal c1, qreal c2, qreal c3) {
qreal distp = 1 - dist;
return (distp*distp*distp) * c0 +
3 * (distp*distp) * dist * c1 +
3 * (dist*dist) * distp * c2 +
(dist*dist*dist) * c3;
}
QPointF bezierInterpolateFull (qreal dist, QPointF c0, QPointF c1, QPointF c2, QPointF c3) {
return QPointF(bezierInterpolate (dist, c0.x(), c1.x(), c2.x(), c3.x()),
bezierInterpolate (dist, c0.y(), c1.y(), c2.y(), c3.y()));
}
qreal roundToNearest(qreal stepSize, qreal val) {
if (stepSize==0.0) return val;
else return round(val/stepSize)*stepSize;
}
qreal radiansToDegrees (qreal radians) {
return (radians * 180.0) / M_PI;
}
qreal degreesToRadians(qreal degrees) {
return (degrees * M_PI) / 180.0;
}
int normaliseAngleDeg (int degrees) {
while (degrees > 180) {
degrees -= 360;
}
while (degrees <= -180) {
degrees += 360;
}
return degrees;
}
qreal normaliseAngleRad (qreal rads) {
while (rads > M_PI) {
rads -= 2 * M_PI;
}
while (rads <= -M_PI) {
rads += 2 * M_PI;
}
return rads;
}
bool almostZero(qreal f) {
return (f >= -0.000001 && f <= 0.000001);
}
bool almostEqual(qreal f1, qreal f2) {
return almostZero(f1 - f2);
}
// convert qreal to string, squashing very small qreals to zero
QString floatToString(qreal f) {
if (almostZero(f)) return "0";
else return QString::number(f);
}
static QList texConstantNames;
static QList texConstantCodes;
static QList texModifierNames;
void initTexConstants() {
texConstantNames
<< "\\alpha" << "\\beta" << "\\gamma" << "\\delta" << "\\epsilon"
<< "\\zeta" << "\\eta" << "\\theta" << "\\iota" << "\\kappa"
<< "\\lambda" << "\\mu" << "\\nu" << "\\xi" << "\\pi"
<< "\\rho" << "\\sigma" << "\\tau" << "\\upsilon" << "\\phi"
<< "\\chi" << "\\psi" << "\\omega"
<< "\\Gamma" << "\\Delta" << "\\Theta" << "\\Lambda" << "\\Xi"
<< "\\Pi" << "\\Sigma" << "\\Upsilon" << "\\Phi" << "\\Psi"
<< "\\Omega"
<< "\\pm" << "\\to" << "\\Rightarrow" << "\\Leftrightarrow" << "\\forall"
<< "\\partial" << "\\exists" << "\\emptyset" << "\\nabla" << "\\in"
<< "\\notin" << "\\prod" << "\\sum" << "\\surd" << "\\infty"
<< "\\wedge" << "\\vee" << "\\cap" << "\\cup" << "\\int"
<< "\\approx" << "\\neq" << "\\equiv" << "\\leq" << "\\geq"
<< "\\subset" << "\\supset"
<< "\\ldots" << "\\vdots" << "\\cdots" << "\\ddots" << "\\iddots"
<< "\\cdot";
texConstantCodes
<< "\u03b1" << "\u03b2" << "\u03b3" << "\u03b4" << "\u03b5"
<< "\u03b6" << "\u03b7" << "\u03b8" << "\u03b9" << "\u03ba"
<< "\u03bb" << "\u03bc" << "\u03bd" << "\u03be" << "\u03c0"
<< "\u03c1" << "\u03c3" << "\u03c4" << "\u03c5" << "\u03c6"
<< "\u03c7" << "\u03c8" << "\u03c9"
<< "\u0393" << "\u0394" << "\u0398" << "\u039b" << "\u039e"
<< "\u03a0" << "\u03a3" << "\u03a5" << "\u03a6" << "\u03a8"
<< "\u03a9"
<< "\u00b1" << "\u2192" << "\u21d2" << "\u21d4" << "\u2200"
<< "\u2202" << "\u2203" << "\u2205" << "\u2207" << "\u2208"
<< "\u2209" << "\u220f" << "\u2211" << "\u221a" << "\u221e"
<< "\u2227" << "\u2228" << "\u2229" << "\u222a" << "\u222b"
<< "\u2248" << "\u2260" << "\u2261" << "\u2264" << "\u2265"
<< "\u2282" << "\u2283"
<< "\u2026" << "\u22ee" << "\u22ef" << "\u22f1" << "\u22f0"
<< "\u22c5";
texModifierNames
<< "\\tiny"
<< "\\scriptsize"
<< "\\footnotesize"
<< "\\small"
<< "\\normalsize"
<< "\\large"
<< "\\Large"
<< "\\LARGE"
<< "\\huge"
<< "\\Huge";
}
QString replaceTexConstants(QString s) {
QString s1 = s;
for (int i = 0; i < texConstantNames.length(); ++i) {
s1 = s1.replace(texConstantNames[i], texConstantCodes[i]);
}
for (int i = 0; i < texModifierNames.length(); ++i) {
s1 = s1.replace(texModifierNames[i], "");
}
if (s1.startsWith('$') && s1.endsWith('$')) {
s1 = s1.mid(1, s1.length()-2);
}
return s1;
}