Hello community, here is the log from the commit of package analitza for openSUSE:Factory checked in at 2013-11-17 15:57:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/analitza (Old) and /work/SRC/openSUSE:Factory/.analitza.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "analitza" Changes: -------- --- /work/SRC/openSUSE:Factory/analitza/analitza.changes 2013-10-03 15:44:17.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.analitza.new/analitza.changes 2013-11-17 15:57:52.000000000 +0100 @@ -1,0 +2,21 @@ +Sat Nov 16 17:47:45 UTC 2013 - [email protected] + +- Update to 4.11.90 + * KDE 4.12 Beta 2 release + * See http://www.kde.org/announcements/announce-4.12-beta2.php + +------------------------------------------------------------------- +Sat Nov 9 22:48:28 UTC 2013 - [email protected] + +- Update to 4.11.80 + * KDE 4.12 Beta 1 release + * See http://www.kde.org/announcements/announce-4.12-beta1.php + +------------------------------------------------------------------- +Sat Nov 2 15:01:14 UTC 2013 - [email protected] + +- Update to 4.11.3 + * KDE 4.11.3 bugfix release + * See http://www.kde.org/announcements/announce-4.11.3.php + +------------------------------------------------------------------- Old: ---- analitza-4.11.2.tar.xz New: ---- analitza-4.11.90.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ analitza.spec ++++++ --- /var/tmp/diff_new_pack.fWRT2O/_old 2013-11-17 15:57:52.000000000 +0100 +++ /var/tmp/diff_new_pack.fWRT2O/_new 2013-11-17 15:57:52.000000000 +0100 @@ -21,7 +21,7 @@ BuildRequires: readline-devel BuildRequires: pkgconfig(glu) Url: https://projects.kde.org/projects/kde/kdeedu/analitza -Version: 4.11.2 +Version: 4.11.90 Release: 0 BuildRequires: xz BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ analitza-4.11.2.tar.xz -> analitza-4.11.90.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/abstractlexer.cpp new/analitza-4.11.90/analitza/abstractlexer.cpp --- old/analitza-4.11.2/analitza/abstractlexer.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitza/abstractlexer.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -22,9 +22,9 @@ #include <QStringList> #include "localize.h" -QMap<QChar, int> initializeOperators() +QHash<QChar, int> initializeOperators() { - QMap<QChar, int> operators; + QHash<QChar, int> operators; operators['+']=ExpressionTable::tAdd; operators['-']=ExpressionTable::tSub; operators['*']=ExpressionTable::tMul; @@ -47,9 +47,9 @@ return operators; } -QMap<QString, int> initializeLongOperators() +QHash<QString, int> initializeLongOperators() { - QMap<QString, int> longOperators; + QHash<QString, int> longOperators; longOperators["->"]=ExpressionTable::tLambda; longOperators[":="]=ExpressionTable::tAssig; longOperators[".."]=ExpressionTable::tLimits; @@ -60,8 +60,8 @@ return longOperators; } -QMap<QChar, int> AbstractLexer::m_operators=initializeOperators(); -QMap<QString, int> AbstractLexer::m_longOperators=initializeLongOperators(); +QHash<QChar, int> AbstractLexer::m_operators=initializeOperators(); +QHash<QString, int> AbstractLexer::m_longOperators=initializeLongOperators(); AbstractLexer::AbstractLexer(const QString &source) : current(-1, 0), m_source(source), m_lines(0), m_openPr(0), m_openCb(0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/abstractlexer.h new/analitza-4.11.90/analitza/abstractlexer.h --- old/analitza-4.11.2/analitza/abstractlexer.h 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitza/abstractlexer.h 2013-10-30 23:53:40.000000000 +0100 @@ -21,7 +21,7 @@ #include <QtCore/QString> #include <QtCore/QStringList> -#include <QtCore/QMap> +#include <QtCore/QHash> #include <QtCore/QQueue> #include "analitzaexport.h" @@ -56,8 +56,8 @@ int m_lines; int m_openPr, m_openCb; QQueue<TOKEN> m_tokens; - static QMap<QChar, int> m_operators; - static QMap<QString, int> m_longOperators; + static QHash<QChar, int> m_operators; + static QHash<QString, int> m_longOperators; virtual void getToken()=0; void printQueue(const QQueue<TOKEN>& q) const; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/exp.g new/analitza-4.11.90/analitza/exp.g --- old/analitza-4.11.2/analitza/exp.g 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitza/exp.g 2013-10-30 23:53:40.000000000 +0100 @@ -89,6 +89,7 @@ int errorLineNumber() const { return m_errorLineNumber; } QStringList error() const { return m_err; } QString mathML() const { return m_exp; } + QStringList comments() const { return m_comments; } private: void reallocateStack(); @@ -102,6 +103,7 @@ int m_errorLineNumber; QStringList m_err; QString m_exp; + QStringList m_comments; }; #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/expressionparser.cpp new/analitza-4.11.90/analitza/expressionparser.cpp --- old/analitza-4.11.2/analitza/expressionparser.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitza/expressionparser.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -1,5 +1,5 @@ -#line 111 "exp.g" +#line 113 "exp.g" /************************************************************************************* * Copyright (C) 2008 by Aleix Pol <[email protected]> * @@ -69,6 +69,7 @@ yytoken = lexer->lex(); while(yytoken==tComment) { //TODO: Add mathml comment + m_comments.append(lexer->current.val); yytoken = lexer->lex(); } @@ -92,171 +93,171 @@ act = m_stateStack.at(m_tos++); switch (r) { -#line 204 "exp.g" +#line 207 "exp.g" case 0: -#line 205 "exp.g" +#line 208 "exp.g" case 1: -#line 207 "exp.g" +#line 210 "exp.g" case 2: m_exp = "<math>"+sym(1)+"</math>"; break; -#line 213 "exp.g" - case 3: sym(1) = "<declare><ci>"+sym(1)+"</ci>"+sym(3)+"</declare>"; break; #line 216 "exp.g" + case 3: sym(1) = "<declare><ci>"+sym(1)+"</ci>"+sym(3)+"</declare>"; break; +#line 219 "exp.g" case 4: -#line 217 "exp.g" +#line 220 "exp.g" case 5: -#line 219 "exp.g" +#line 222 "exp.g" case 6: sym(1) = lexer->current.val; break; -#line 228 "exp.g" +#line 231 "exp.g" case 9: sym(1) = "<ci>"+sym(1)+"</ci>"; break; -#line 237 "exp.g" +#line 240 "exp.g" case 12: sym(1) = "<apply><selector />"+sym(3)+sym(1)+"</apply>"; break; -#line 244 "exp.g" +#line 247 "exp.g" case 13: sym(1) = sym(2); break; -#line 254 "exp.g" +#line 257 "exp.g" case 18: sym(1)=sym(2); break; -#line 255 "exp.g" +#line 258 "exp.g" case 19: sym(1)=funcToTag(sym(1)); break; -#line 257 "exp.g" +#line 260 "exp.g" case 20: sym(1) = "<apply>"+sym(1)+sym(2)+"</apply>"; break; -#line 258 "exp.g" +#line 261 "exp.g" case 21: sym(1) = "<apply>"+sym(1)+sym(3)+"</apply>"; break; -#line 259 "exp.g" +#line 262 "exp.g" case 22: sym(1) = "<apply>"+sym(1)+ "</apply>"; break; -#line 261 "exp.g" +#line 264 "exp.g" case 23: sym(1) = "<apply>"+sym(3)+sym(1)+"</apply>"; break; -#line 262 "exp.g" +#line 265 "exp.g" case 24: sym(1) = "<apply>"+sym(3)+sym(1)+"</apply>"; break; -#line 269 "exp.g" +#line 272 "exp.g" case 28: sym(1).prepend(sym(3)); break; -#line 276 "exp.g" +#line 279 "exp.g" case 29: sym(1)=sym(3)+sym(5)+sym(1); break; -#line 283 "exp.g" +#line 286 "exp.g" case 30: sym(1)=sym(3)+"<domainofapplication>"+sym(5)+"</domainofapplication>"+sym(1); break; -#line 291 "exp.g" +#line 294 "exp.g" case 31: sym(1) = '<'+sym(1)+" />"; break; -#line 298 "exp.g" +#line 301 "exp.g" case 32: sym(1) = '<'+sym(1)+'>'+sym(3)+"</"+sym(1)+'>'; break; -#line 306 "exp.g" +#line 309 "exp.g" case 33: sym(1) = "<lambda>"+sym(1)+sym(3)+"</lambda>"; break; -#line 314 "exp.g" +#line 317 "exp.g" case 34: sym(1) = "<apply><minus />"+sym(2)+"</apply>"; break; -#line 321 "exp.g" +#line 324 "exp.g" case 35: sym(1) = "<otherwise>"+sym(2)+"</otherwise>"; break; -#line 328 "exp.g" +#line 331 "exp.g" case 36: sym(1) = "<apply><plus />" +sym(1)+sym(3)+"</apply>"; break; -#line 329 "exp.g" +#line 332 "exp.g" case 37: sym(1) = "<apply><minus />" +sym(1)+sym(3)+"</apply>"; break; -#line 330 "exp.g" +#line 333 "exp.g" case 38: sym(1) = "<apply><times />" +sym(1)+sym(3)+"</apply>"; break; -#line 331 "exp.g" +#line 334 "exp.g" case 39: sym(1) = "<apply><times />" +sym(1)+sym(2)+"</apply>"; break; -#line 332 "exp.g" +#line 335 "exp.g" case 40: sym(1) = "<apply><divide />"+sym(1)+sym(3)+"</apply>"; break; -#line 333 "exp.g" +#line 336 "exp.g" case 41: sym(1) = "<apply><power />" +sym(1)+sym(3)+"</apply>"; break; -#line 334 "exp.g" +#line 337 "exp.g" case 42: sym(1) = "<apply><eq />" +sym(1)+sym(3)+"</apply>"; break; -#line 335 "exp.g" +#line 338 "exp.g" case 43: sym(1) = "<apply><leq />" +sym(1)+sym(3)+"</apply>"; break; -#line 336 "exp.g" +#line 339 "exp.g" case 44: sym(1) = "<apply><geq />" +sym(1)+sym(3)+"</apply>"; break; -#line 337 "exp.g" +#line 340 "exp.g" case 45: sym(1) = "<apply><lt />" +sym(1)+sym(3)+"</apply>"; break; -#line 338 "exp.g" +#line 341 "exp.g" case 46: sym(1) = "<apply><gt />" +sym(1)+sym(3)+"</apply>"; break; -#line 339 "exp.g" +#line 342 "exp.g" case 47: sym(1) = "<apply><neq />" +sym(1)+sym(3)+"</apply>"; break; -#line 341 "exp.g" +#line 344 "exp.g" case 48: sym(1) = "<piece>"+sym(3)+sym(1)+"</piece>"; break; -#line 346 "exp.g" +#line 349 "exp.g" case 50: sym(1) += sym(3); break; -#line 355 "exp.g" +#line 358 "exp.g" case 52: sym(1) = sym(2); break; -#line 362 "exp.g" +#line 365 "exp.g" case 53: sym(1) = "<bvar><ci>"+sym(1)+"</ci></bvar>"; break; -#line 369 "exp.g" +#line 372 "exp.g" case 54: sym(1) += sym(3); break; -#line 376 "exp.g" +#line 379 "exp.g" case 55: sym(1) += sym(3); break; -#line 383 "exp.g" +#line 386 "exp.g" case 56: sym(1) = "<uplimit>"+sym(3)+"</uplimit><downlimit>"+sym(1)+"</downlimit>"; break; -#line 389 "exp.g" +#line 392 "exp.g" } // switch m_stateStack[m_tos] = nt_action(act, lhs[r] - TERMINAL_COUNT); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/expressionstream.cpp new/analitza-4.11.90/analitza/expressionstream.cpp --- old/analitza-4.11.2/analitza/expressionstream.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitza/expressionstream.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -47,11 +47,10 @@ m_last += m_dev->readLine()+'\n'; if(Expression::isCompleteExpression(m_last)) { break; - } else if(m_dev->atEnd()) { - m_interrupted = true; - break; } } + m_dev->skipWhiteSpace(); + m_interrupted = !Expression::isCompleteExpression(m_last); QString last = m_last.trimmed(); return Analitza::Expression(last, Expression::isMathML(last)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/operations.cpp new/analitza-4.11.90/analitza/operations.cpp --- old/analitza-4.11.2/analitza/operations.cpp 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitza/operations.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -21,6 +21,7 @@ #include <math.h> #include <cmath> +#include <complex> #include <kdemacros.h> #include "value.h" @@ -57,8 +58,9 @@ oper->setValue(a - b); break; case Operator::power: - oper->setValue(b==2 ? a*a - : pow(a, b)); + oper->setValue( b==2 ? a*a + : b<1 && b>-1 && a<0 ? pow(complex<double>(a), complex<double>(b)).real() + : pow(a, b)); break; case Operator::rem: if(KDE_ISLIKELY(floor(b)!=0.)) @@ -113,7 +115,7 @@ oper->setValue((a || b) && !(a&&b)); break; case Operator::implies: - oper->setValue((a || !b)); + oper->setValue(a || !b); break; case Operator::gcd: { //code by michael cane aka kiko :) @@ -142,7 +144,9 @@ } break; case Operator::root: - oper->setValue(b==2.0 ? sqrt(a) : pow(a, 1.0/b)); + oper->setValue( b==2.0 ? sqrt(a) + : (b>1 || b<-1) && a<0 ? pow(complex<double>(a), complex<double>(1./b)).real() + : pow(a, 1.0/b)); break; default: break; @@ -214,23 +218,23 @@ case Operator::arccot: val->setValue(log(a+pow(a*a+1., 0.5))); break; - case Operator::arcsinh: - val->setValue(0.5*(log(1.+1./a)-log(1.-1./a))); + case Operator::arcsinh: //see http://en.wikipedia.org/wiki/Inverse_hyperbolic_function + val->setValue(asinh(a)); break; case Operator::arccosh: - val->setValue(log(a+sqrt(a-1.)*sqrt(a+1.))); + val->setValue(acosh(a)); break; case Operator::arccsc: val->setValue(1/asin(a)); break; case Operator::arccsch: - val->setValue(1/(0.5*(log(1.+1./a)-log(1.-1./a)))); + val->setValue(log(1/a+sqrt(1/(a*a)+1))); break; case Operator::arcsec: val->setValue(1/(acos(a))); break; case Operator::arcsech: - val->setValue(1/(log(a+sqrt(a-1.)*sqrt(a+1.)))); + val->setValue(log(1/a+sqrt(1/a+1)*sqrt(1/a-1))); break; case Operator::arctanh: val->setValue(atanh(a)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/tests/analitzatest.cpp new/analitza-4.11.90/analitza/tests/analitzatest.cpp --- old/analitza-4.11.2/analitza/tests/analitzatest.cpp 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitza/tests/analitzatest.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -89,13 +89,15 @@ QTest::newRow("lambda") << "(x->x+2)(2)" << 4.; QTest::newRow("lambda2") << "(x->3*x^2)(1)" << 3.; QTest::newRow("lambda3") << "(x->x*sum(t:t=0..3))(2)" << 12.; - + QTest::newRow("imaginarypow") << "(-4)^(1/4)" << 1.; + QTest::newRow("imaginaryroot") << "root(-4, 4)" << 1.; + //comprehension QTest::newRow("sum.2bvars") << "sum(x*y : (x, y)=1..3)" << 36.; QTest::newRow("sum.list") << "sum(x : x@list{1,5,44})" << 50.; - + QTest::newRow("sum.sum") << "sum(sum(x : x=0..i) : i=0..10)" << 220.; - + QTest::newRow("exists") << "exists(x : x@list{true,true,false})" << 1.; QTest::newRow("forall") << "forall(x : x@list{true,true,false})" << 0.; // QTest::newRow("emptysum") << "sum(x : x@list{})" << 0.; @@ -477,6 +479,12 @@ QVERIFY(b.isCorrect()); } QCOMPARE(evalResult.toString(), result); + + QString script = expression.join("\n"); + script+="\n\n\n"; + QTextStream stream(&script); + a->importScript(&stream); + QVERIFY(a->isCorrect()); } void AnalitzaTest::testTypeUncorrection() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/value.cpp new/analitza-4.11.90/analitza/value.cpp --- old/analitza-4.11.2/analitza/value.cpp 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitza/value.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -40,36 +40,6 @@ return e->accept(this); } -/*enum Cn::ValueFormat Cn::whatValueFormat(const QDomElement& val) -{ - enum ValueFormat ret= none; - QString tag = val.tagName(); - if(tag == "cn"){ // a is a number - if(val.attribute("type","real") == "real") ret = real; - else if(val.attribute("type") == "integer") ret = integer; - else if(val.attribute("type") == "e-notation") ret = real; - else if(val.attribute("type") == "rational") ret = real; - else if(val.attribute("type") == "complex-cartesian") ret = none; - else if(val.attribute("type") == "complex-polar") ret = none; - else if(val.attribute("type") == "constant") { - if(val.text() == "π") ret=real; - else if (val.text() == "ⅇ" || val.text() == "ⅇ") ret = real; - else if (val.text() == "&true;") ret = boolean; - else if (val.text() == "&false;") ret = boolean; - else if (val.text() == "γ") ret = real; - //else if (val.text() == "&ImagniaryI;") ; //TODO: Not implemented - else if (val.text() == "∞") ret=nan; - else if (val.text() == "&NaN;") ret=nan; - } - } else if(tag=="true") ret = boolean; - else if(tag=="false") ret = boolean; - else if(tag=="pi") ret = real; - else if(tag=="exponentiale") ret = real; - else if(tag=="eulergamma") ret = real; - - return ret; -}*/ - bool Cn::setValue(const QDomElement& val) { // this->m_vformat=whatValueFormat(val); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/value.h new/analitza-4.11.90/analitza/value.h --- old/analitza-4.11.2/analitza/value.h 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitza/value.h 2013-10-30 23:53:40.000000000 +0100 @@ -82,17 +82,17 @@ inline double& rvalue() { return m_value; } /** - * Returns the value as an int. + * @returns the value as an int. */ int intValue() const { return static_cast<int>(std::floor(m_value)); } /** - * Returns whether it is a boolean value or not. + * @returns whether it is a boolean value or not. */ bool isBoolean() const { return m_format==Boolean; } /** - * Returns whether it is a character value or not. + * @returns whether it is a character value or not. */ bool isCharacter() const { return m_format==Char; } @@ -112,32 +112,32 @@ // static enum ValueFormat whatValueFormat(const QDomElement&); /** - * Returns whether it is an integer value or not. + * @returns whether it is an integer value or not. */ bool isInteger() const { return std::floor(m_value)==m_value; } /** - * Returns whether @p d is equal than this object. + * @returns whether @p d is equal than this object. */ bool operator==(const Cn& d) const { return m_value==d.m_value; } /** - * Returns whether @p d is less than this object. + * @returns whether @p d is less than this object. */ bool operator<(const Cn& d) const { return m_value<d.m_value; } /** - * Returns whether @p d is less than this object's value. + * @returns whether @p d is less than this object's value. */ bool operator<(double d) const { return m_value<d; } /** - * Returns whether @p d is less or equal than this object. + * @returns whether @p d is less or equal than this object. */ bool operator<=(const Cn& d) const { return m_value<=d.m_value; } /** - * Returns whether @p d is less or equal than this object's value. + * @returns whether @p d is less or equal than this object's value. */ bool operator<=(double d) const { return m_value<=d; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/variable.cpp new/analitza-4.11.90/analitza/variable.cpp --- old/analitza-4.11.2/analitza/variable.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitza/variable.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -55,14 +55,19 @@ bool Ci::matches(const Object* exp, QMap<QString, const Object*>* found) const { bool ret=false; - if(found->contains(m_name)) { - const Object* v=found->value(m_name); - Q_ASSERT(v); + const Object* v=found->value(m_name); + if(v) { ret=AnalitzaUtils::equalTree(exp, v); } else { + Q_ASSERT(!found->contains(m_name)); found->insert(m_name, exp); ret=true; } // qDebug() << "maaatch" << toString() << exp->toString() << ret; return ret; } + +QString Ci::toHtml() const +{ + return QString("<span class='%1'>%2</span>").arg(m_function ? "func" : "var").arg(m_name); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitza/variable.h new/analitza-4.11.90/analitza/variable.h --- old/analitza-4.11.2/analitza/variable.h 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitza/variable.h 2013-10-30 23:53:40.000000000 +0100 @@ -55,7 +55,7 @@ QString toMathML() const; /** Returns the HTML representation of the variable */ - QString toHtml() const { return QString("<span class='%1'>%2</span>").arg(m_function ? "func" : "var").arg(m_name); } + QString toHtml() const; virtual QString visit(ExpressionWriter*) const; virtual bool matches(const Object* pattern, QMap<QString, const Object*>* found) const; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzagui/plotsview2d.cpp new/analitza-4.11.90/analitzagui/plotsview2d.cpp --- old/analitza-4.11.2/analitzagui/plotsview2d.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzagui/plotsview2d.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -64,6 +64,11 @@ this->setAutoFillBackground(false); } +void PlotsView2D::showEvent(QShowEvent* ev) +{ + QWidget::showEvent(ev); +} + PlotsView2D::~PlotsView2D() {} void PlotsView2D::drawFunctions(QPaintDevice* pd) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzagui/plotsview2d.h new/analitza-4.11.90/analitzagui/plotsview2d.h --- old/analitza-4.11.2/analitzagui/plotsview2d.h 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzagui/plotsview2d.h 2013-10-30 23:53:40.000000000 +0100 @@ -81,6 +81,8 @@ void setSelectionModel(QItemSelectionModel* selection); + virtual void showEvent(QShowEvent* ev); + public slots: /** Marks the image as dirty and repaints everything. */ void forceRepaint() { valid=false; repaint(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/data/plots/3Ds.plots new/analitza-4.11.90/analitzaplot/data/plots/3Ds.plots --- old/analitza-4.11.2/analitzaplot/data/plots/3Ds.plots 1970-01-01 01:00:00.000000000 +0100 +++ new/analitza-4.11.90/analitzaplot/data/plots/3Ds.plots 2013-10-30 23:53:40.000000000 +0100 @@ -0,0 +1,2 @@ +plane1 := (x, y, z)->(x+y+z)-1 +plane2 := (x, y, z)->(x+y+z)-5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/data/plots/basic_curves.plots new/analitza-4.11.90/analitzaplot/data/plots/basic_curves.plots --- old/analitza-4.11.2/analitzaplot/data/plots/basic_curves.plots 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/data/plots/basic_curves.plots 2013-10-30 23:53:40.000000000 +0100 @@ -1 +1,3 @@ sinus := x->sin x +something := x*x+y*y=7.9 +plane1 := (x, y, z)->(x+y+z)-1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/data/plots/conics.plots new/analitza-4.11.90/analitzaplot/data/plots/conics.plots --- old/analitza-4.11.2/analitzaplot/data/plots/conics.plots 1970-01-01 01:00:00.000000000 +0100 +++ new/analitza-4.11.90/analitzaplot/data/plots/conics.plots 2013-10-30 23:53:40.000000000 +0100 @@ -0,0 +1,2 @@ +para:=x->x*x +div:=y->2.2/y diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/data/plots/polar.plots new/analitza-4.11.90/analitzaplot/data/plots/polar.plots --- old/analitza-4.11.2/analitzaplot/data/plots/polar.plots 1970-01-01 01:00:00.000000000 +0100 +++ new/analitza-4.11.90/analitzaplot/data/plots/polar.plots 2013-10-30 23:53:40.000000000 +0100 @@ -0,0 +1,2 @@ +spiral // xaxaxaxaxa //:= q->q +//cosa// circle := q->3.2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/functiongraph.cpp new/analitza-4.11.90/analitzaplot/functiongraph.cpp --- old/analitza-4.11.2/analitzaplot/functiongraph.cpp 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/functiongraph.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -141,6 +141,16 @@ return ret; } +void FunctionGraph::clearIntervals() +{ + m_functionGraph->clearIntervals(); +} + +bool FunctionGraph::hasIntervals() const +{ + return m_functionGraph->hasIntervals(); +} + QStringList FunctionGraph::parameters() const { Q_ASSERT(m_functionGraph); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/functiongraph.h new/analitza-4.11.90/analitzaplot/functiongraph.h --- old/analitza-4.11.2/analitzaplot/functiongraph.h 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/functiongraph.h 2013-10-30 23:53:40.000000000 +0100 @@ -62,6 +62,8 @@ QPair<double, double> interval(const QString &argname) const; bool setInterval(const QString &argname, double min, double max); + void clearIntervals(); + bool hasIntervals() const; /** @returns the parameters that a function expects */ QStringList parameters() const; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotsdictionarymodel.cpp new/analitza-4.11.90/analitzaplot/plotsdictionarymodel.cpp --- old/analitza-4.11.2/analitzaplot/plotsdictionarymodel.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/plotsdictionarymodel.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -33,11 +33,6 @@ , m_currentItem(-1) { setHorizontalHeaderLabels(QStringList() << i18nc("@title:column", "Name")); - - QStringList res = KGlobal::dirs()->findAllResources("data", "libanalitza/plots/*.plots"); - foreach(const QString& f, res) { - createDictionary(f); - } } PlotsDictionaryModel::~PlotsDictionaryModel() @@ -49,7 +44,6 @@ if (device.open(QFile::ReadOnly | QFile::Text)) { QTextStream stream(&device); Analitza::ExpressionStream s(&stream); - while(!s.atEnd()) { Analitza::Expression expression(s.next()); Q_ASSERT(expression.isCorrect()); @@ -68,6 +62,14 @@ qWarning() << "couldn't open" << file; } +void PlotsDictionaryModel::createAllDictionaries() +{ + QStringList res = KGlobal::dirs()->findAllResources("data", "libanalitza/plots/*.plots"); + foreach(const QString& f, res) { + createDictionary(f); + } +} + PlotsModel* PlotsDictionaryModel::plotModel() { if(!m_plots) { @@ -97,15 +99,25 @@ m_plots->clear(); if(m_currentItem<0) return; - + QModelIndex idx = index(m_currentItem, 0); Analitza::Expression exp(idx.data(ExpressionRole).toString()); PlotBuilder req = PlotsFactory::self()->requestPlot(exp, Dim2D); -// qDebug() << exp.toString(); - Q_ASSERT(req.canDraw()); + + if (!req.canDraw()){ // preference is given to 2D + PlotBuilder req = PlotsFactory::self()->requestPlot(exp, Dim3D); + Q_ASSERT(req.canDraw()); + m_plots->addPlot(req.create(Qt::blue, idx.data(Qt::DisplayRole).toString())); + return; + } m_plots->addPlot(req.create(Qt::blue, idx.data(Qt::DisplayRole).toString())); } +Analitza::Dimension PlotsDictionaryModel::dimension() +{ + return Dimension(m_plots->index(0,0).data(PlotsModel::DimensionRole).toInt()); +} + void PlotsDictionaryModel::setCurrentIndex(const QModelIndex& idx) { setCurrentRow(idx.row()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotsdictionarymodel.h new/analitza-4.11.90/analitzaplot/plotsdictionarymodel.h --- old/analitza-4.11.2/analitzaplot/plotsdictionarymodel.h 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/plotsdictionarymodel.h 2013-10-30 23:53:40.000000000 +0100 @@ -22,9 +22,8 @@ #include <QStandardItemModel> #include <QPointer> - +#include <analitzaplot/plottingenums.h> #include "analitzaplotexport.h" - namespace Analitza { class PlotsModel; @@ -45,14 +44,15 @@ PlotsModel* plotModel(); void createDictionary(const QString& path); - + void createAllDictionaries(); + Analitza::Dimension dimension(); + public slots: ///convenience class for currentRow void setCurrentIndex(const QModelIndex& idx); private: void updatePlotsModel(); - QPointer<PlotsModel> m_plots; int m_currentItem; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotsfactory.cpp new/analitza-4.11.90/analitzaplot/plotsfactory.cpp --- old/analitza-4.11.2/analitzaplot/plotsfactory.cpp 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/plotsfactory.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -33,6 +33,11 @@ : m_vars(new Variables) {} +PlotsFactory::~PlotsFactory() +{ + delete m_vars; +} + PlotsFactory* PlotsFactory::self() { return factoryInstance; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotsfactory.h new/analitza-4.11.90/analitzaplot/plotsfactory.h --- old/analitza-4.11.2/analitzaplot/plotsfactory.h 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/plotsfactory.h 2013-10-30 23:53:40.000000000 +0100 @@ -55,6 +55,7 @@ { public: PlotsFactory(); + virtual ~PlotsFactory(); static PlotsFactory* self(); PlotBuilder requestPlot(const Analitza::Expression& expresssion, Dimension dim, Variables* vars = 0) const; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotter3d.cpp new/analitza-4.11.90/analitzaplot/plotter3d.cpp --- old/analitza-4.11.2/analitzaplot/plotter3d.cpp 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/plotter3d.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -60,6 +60,7 @@ , m_scale(60) , m_currentAxisIndicator(InvalidAxis) , m_simpleRotation(false) + , m_referencePlaneColor(Qt::darkGray) { resetViewPrivate(QVector3D(-45, 0, -135)); } @@ -142,6 +143,10 @@ renderGL(); } +// add overloaded functions which call the underlying OpenGL function +inline void glMultMatrix(const GLfloat *m) { glMultMatrixf(m); } +inline void glMultMatrix(const GLdouble *m) { glMultMatrixd(m); } + void Plotter3D::drawPlots() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -152,7 +157,7 @@ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glMultMatrixd(m_rot.data()); + glMultMatrix(m_rot.constData()); // Object Drawing : glCallList(m_sceneObjects.value(Axes)); @@ -397,6 +402,14 @@ renderGL(); } +inline QMatrix4x4 get_matrix(GLfloat *m) +{ + return QMatrix4x4(m[0], m[1], m[2], m[3], + m[4], m[5], m[6], m[7], + m[8], m[9], m[10], m[11], + m[12], m[13], m[14], m[15]); +} + void Plotter3D::rotate(int dx, int dy) { GLdouble ax = -dy; @@ -411,11 +424,11 @@ m_rot.rotate(angle, m_rotFixed.normalized()); renderGL(); } else { - GLdouble matrix[16] = {0}; // model view matrix from current OpenGL state + GLfloat matrix[16] = {0}; // model view matrix from current OpenGL state - glGetDoublev(GL_MODELVIEW_MATRIX, matrix); + glGetFloatv(GL_MODELVIEW_MATRIX, matrix); - QMatrix4x4 matrix4(matrix); + QMatrix4x4 matrix4(get_matrix(matrix)); bool couldInvert; matrix4 = matrix4.inverted(&couldInvert); @@ -737,6 +750,13 @@ glEndList(); } +void Plotter3D::setReferencePlaneColor(const QColor& color) +{ + m_referencePlaneColor=color; + initRefPlanes(); + renderGL(); +} + void Plotter3D::initRefPlanes() { if (m_sceneObjects.contains(RefPlaneXY)) @@ -746,7 +766,7 @@ glNewList(m_sceneObjects.value(RefPlaneXY), GL_COMPILE ); glLineWidth(1); - glColor3ub(48, 48, 48); + glColor3ub(m_referencePlaneColor.red(),m_referencePlaneColor.green(),m_referencePlaneColor.blue()); glBegin( GL_LINES ); glVertex3f(-150.0, 600.0, m_depth); glVertex3f(-150.0,-600.0, m_depth); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotter3d.h new/analitza-4.11.90/analitzaplot/plotter3d.h --- old/analitza-4.11.2/analitzaplot/plotter3d.h 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/plotter3d.h 2013-10-30 23:53:40.000000000 +0100 @@ -115,7 +115,10 @@ /** Hide the current indicator of the axis */ void hideAxisHint(); - /** If the flag @p simplerot is true the rotation ignores any fixed or free direction */ + /** Set the color of the grids of the reference plane in the 3D view */ + void setReferencePlaneColor(const QColor &color); + + /** If the flag @p simplerot is true the rotation ignores any fixed or free direction */ void setUseSimpleRotation(bool simplerot) { m_simpleRotation = simplerot; } /** Get information about the current rotarion approach: if return true then rotation is simple. */ @@ -155,6 +158,7 @@ bool m_simpleRotation; QVector3D m_simpleRotationVector; QVector3D m_lightpos; + QColor m_referencePlaneColor; }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/private/abstractfunctiongraph.cpp new/analitza-4.11.90/analitzaplot/private/abstractfunctiongraph.cpp --- old/analitza-4.11.2/analitzaplot/private/abstractfunctiongraph.cpp 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/private/abstractfunctiongraph.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -37,9 +37,9 @@ : AbstractMappingGraph() , m_resolution(200) , m_e(e) - , m_varsmod(v) + , m_varsmod(v ? new Variables(*v) : new Variables) { - analyzer = v ? new Analitza::Analyzer(v) : new Analitza::Analyzer; + analyzer = new Analitza::Analyzer(m_varsmod); Q_ASSERT(!m_e.isEquation()); @@ -59,6 +59,7 @@ { qDeleteAll(m_argumentValues); delete analyzer; + delete m_varsmod; } Dimension AbstractFunctionGraph::spaceDimension() const @@ -78,6 +79,7 @@ Analitza::Expression exp = analyzer->expression(); QVector<Analitza::Object*> prevStack = analyzer->runStack(); delete analyzer; + delete m_varsmod; analyzer = new Analitza::Analyzer(variables); analyzer->setExpression(exp); @@ -117,6 +119,12 @@ { Q_ASSERT(analyzer->expression().bvarList().contains(argname)); + if (min == Expression(Analitza::Cn("-inf")) && + max == Expression(Analitza::Cn("inf"))) + { + m_argumentIntervals[argname] = RealInterval(EndPoint(min), EndPoint(max)); + } + Analitza::Analyzer *intervalsAnalizer = new Analitza::Analyzer(analyzer->variables()); intervalsAnalizer->setExpression(min); double min_val = intervalsAnalizer->calculate().toReal().value(); @@ -148,6 +156,11 @@ return ret; } +void AbstractFunctionGraph::clearIntervals() +{ + m_argumentIntervals.clear(); +} + bool AbstractFunctionGraph::setInterval(const QString &argname, double min, double max) { Q_ASSERT(analyzer->expression().bvarList().contains(argname)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/private/abstractfunctiongraph.h new/analitza-4.11.90/analitzaplot/private/abstractfunctiongraph.h --- old/analitza-4.11.2/analitzaplot/private/abstractfunctiongraph.h 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/private/abstractfunctiongraph.h 2013-10-30 23:53:40.000000000 +0100 @@ -77,6 +77,7 @@ QPair<double, double> interval(const QString &argname) const; virtual bool setInterval(const QString &argname, double min, double max); + void clearIntervals(); bool hasIntervals() const; virtual QStringList parameters() const = 0; @@ -104,42 +105,31 @@ class EndPoint { public: - EndPoint() : m_isInfinite(false) {} - - //el owner de *analitza sera functiongraph ... no tiene sentido usar usar esta calse fuera de functiongraph - EndPoint(double value): m_isInfinite(false) + EndPoint() {} + + EndPoint(double value) { setValue(value); } - EndPoint(const Analitza::Expression &expression) : m_isInfinite(false) + EndPoint(const Analitza::Expression &expression) { if (!setValue(expression)) setValue(0.0); } - EndPoint(const EndPoint &other) : m_expressionValue(other.m_expressionValue), m_isInfinite(other.m_isInfinite) + EndPoint(const EndPoint &other) : m_expressionValue(other.m_expressionValue) { } - - bool isInfinite() const - { - return m_isInfinite; - } - void setInfinite(bool infinite) { m_isInfinite = infinite; } - - //no cambiar el exp de analyzer en setvalue por el costo ... solo cuando se quier calcular el value - //case evaluate = true Analitza::Expression value(Analitza::Analyzer *analyzer) const { - analyzer->setExpression(m_expressionValue); + QString expstr = m_expressionValue.toString(); - if (!m_isInfinite) - return analyzer->calculate(); - - return Analitza::Expression(Analitza::Cn("inf")); + analyzer->setExpression(m_expressionValue); + + return analyzer->calculate(); } Analitza::Expression value() const @@ -147,7 +137,6 @@ return m_expressionValue; } - //no cambiar el exp de analyzer en setvalue por el costo ... solo cuando se quier calcular el value void setValue(double value) { m_expressionValue = Analitza::Expression(Analitza::Cn(value)); @@ -169,28 +158,25 @@ bool operator==(const EndPoint &other) const { - return m_expressionValue == other.m_expressionValue && m_isInfinite == other.m_isInfinite; + return m_expressionValue == other.m_expressionValue; } EndPoint operator=(const EndPoint& other) { m_expressionValue = other.m_expressionValue; - m_isInfinite = other.m_isInfinite; return *this; } private: Analitza::Expression m_expressionValue; - bool m_isInfinite; }; class RealInterval { public: RealInterval() {} - RealInterval(const EndPoint &lEndPoint, const EndPoint &hEndPoint) : m_lowEndPoint(lEndPoint), m_highEndPoint(hEndPoint) { - } + RealInterval(const EndPoint &lEndPoint, const EndPoint &hEndPoint) : m_lowEndPoint(lEndPoint), m_highEndPoint(hEndPoint) {} RealInterval(const RealInterval &other) : m_lowEndPoint(other.m_lowEndPoint), m_highEndPoint(other.m_highEndPoint) {} EndPoint lowEndPoint() const { return m_lowEndPoint; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/private/backends/cartesiancurve.cpp new/analitza-4.11.90/analitzaplot/private/backends/cartesiancurve.cpp --- old/analitza-4.11.2/analitzaplot/private/backends/cartesiancurve.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/private/backends/cartesiancurve.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -251,8 +251,19 @@ void FunctionX::update(const QRectF& viewport) { - double l_lim=viewport.top()-.1, r_lim=viewport.bottom()+.1; + double l_lim=0, r_lim=0; + + if (!hasIntervals()) { + l_lim=viewport.left(); + r_lim=viewport.right(); + } else { + QPair< double, double> limits = interval(parameters().first()); + l_lim = limits.first; + r_lim = limits.second; + } + calculateValues(l_lim, r_lim); + for(int i=0; i<points.size(); i++) { QPointF p=points[i]; points[i]=QPointF(p.y(), p.x()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/private/backends/cartesiansurface.cpp new/analitza-4.11.90/analitzaplot/private/backends/cartesiansurface.cpp --- old/analitza-4.11.2/analitzaplot/private/backends/cartesiansurface.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/private/backends/cartesiansurface.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -121,3 +121,35 @@ REGISTER_SURFACE(Fxz) +class Fyz : public AbstractSurface/*, static class? better macros FooClass*/ +{ +public: + CONSTRUCTORS(Fyz) + TYPE_NAME(I18N_NOOP("Surface x=F(y,z)")) + EXPRESSION_TYPE(Analitza::ExpressionType(Analitza::ExpressionType::Lambda).addParameter( + Analitza::ExpressionType(Analitza::ExpressionType::Value)).addParameter( + Analitza::ExpressionType(Analitza::ExpressionType::Value)).addParameter( + Analitza::ExpressionType(Analitza::ExpressionType::Value))) + COORDDINATE_SYSTEM(Cartesian) + PARAMETERS(QStringList("y") << "z") + ICON_NAME("newfunction3d") + EXAMPLES(QStringList("y+z")) + + QVector3D fromParametricArgs(double u, double v); + void update(const QVector3D & oppositecorner1, const QVector3D & oppositecorner2); +}; + +QVector3D Fyz::fromParametricArgs(double u, double v) +{ + arg("y")->setValue(u); + arg("z")->setValue(v); + + return QVector3D(u,analyzer->calculateLambda().toReal().value(),v); +} + +void Fyz::update(const QVector3D & oppositecorner1, const QVector3D & oppositecorner2) +{ + buildParametricSurface(); +} + +REGISTER_SURFACE(Fyz) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/private/backends/implicitcurve.cpp new/analitza-4.11.90/analitzaplot/private/backends/implicitcurve.cpp --- old/analitza-4.11.2/analitzaplot/private/backends/implicitcurve.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/private/backends/implicitcurve.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -71,28 +71,22 @@ points.clear(); jumps.clear(); - //TODO -// QPair<double, double> ix = interval("x"); -// QPair<double, double> iy = interval("y"); -// double minx = ix.first; -// double maxx = ix.second; -// double miny = iy.first; -// double maxy = iy.second; -// + double minx = vp.left(); + double maxx = vp.right(); + double miny = vp.top(); + double maxy = vp.bottom(); - double minx = 0; - double maxx = 0; - double miny = 0; - double maxy = 0; - - if (!hasIntervals()) + if (hasIntervals()) { - minx = vp.left(); - maxx = vp.right(); - miny = vp.top(); - maxy = vp.bottom(); - } + QPair<double, double> intervalx = interval("x"); + QPair<double, double> intervaly = interval("y"); + minx = intervalx.first; + maxx = intervalx.second; + miny = intervaly.first; + maxy = intervaly.second; + } + setWorld(minx, maxx, miny, maxy); buildGeometry(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/private/backends/polarcurve.cpp new/analitza-4.11.90/analitzaplot/private/backends/polarcurve.cpp --- old/analitza-4.11.2/analitzaplot/private/backends/polarcurve.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/private/backends/polarcurve.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -71,7 +71,7 @@ double pi_factor = qMax(qMax(qAbs(viewport.left()), qAbs(viewport.right())), qMax(qAbs(viewport.bottom()), qAbs(viewport.top()))); - pi_factor = qMax(pi_factor, 16.); // 16 steps at minimun + pi_factor = qMax(pi_factor, 16.); // 16 steps at minimum dlimit = -M_PI*pi_factor; ulimit = M_PI*pi_factor; @@ -84,11 +84,14 @@ dlimit = limits.first; ulimit = limits.second; inv_res = (ulimit-dlimit)/(M_PI*M_PI*16); - } Q_ASSERT(inv_res!=0); double final=ulimit-inv_res; + if((final<0) != (inv_res<0)) { + inv_res *= -1; + } + for(double th=dlimit; th<final; th+=inv_res) { p->setValue(th); double r = analyzer->calculateLambda().toReal().value(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/private/backends/sphericalsurface.cpp new/analitza-4.11.90/analitzaplot/private/backends/sphericalsurface.cpp --- old/analitza-4.11.2/analitzaplot/private/backends/sphericalsurface.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/private/backends/sphericalsurface.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -114,7 +114,8 @@ void SphericalSurface::update(const QVector3D & oppositecorner1, const QVector3D & oppositecorner2) { -// Q_UNUSED(viewport); + Q_UNUSED(oppositecorner1); + Q_UNUSED(oppositecorner2); buildParametricSurface(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/private/utils/marchingsquares.cpp new/analitza-4.11.90/analitzaplot/private/utils/marchingsquares.cpp --- old/analitza-4.11.2/analitzaplot/private/utils/marchingsquares.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/private/utils/marchingsquares.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -389,7 +389,7 @@ void MarchingSquares::tipo01(QList<sArista2D> aristas) { - if (aristas.isEmpty()) return; + if (aristas.size()<2) return; QList<QPointF> triangulos; @@ -444,48 +444,22 @@ } void MarchingSquares::setWorld(double minx, double maxx, double miny, double maxy) { - sLimitesEspacio2D _esp; + sLimitesEspacio2D _esp; - double a = 4; + double a = 4; - _esp.minX = minx; - _esp.maxX = maxx; - _esp.minY = miny; - _esp.maxY = maxy; + _esp.minX = minx; + _esp.maxX = maxx; + _esp.minY = miny; + _esp.maxY = maxy; -// qDebug() << _esp.minX << _esp.maxX << _esp.minY << _esp.maxY; - - largo_mundo = 1; + largo_mundo = 1; -// qDebug() << largo_mundo; - //a mas pequenio el size se detectan las singularidades + // a mas pequenio el size se detectan las singularidades min_grid = qMin(fabs(maxx-minx), fabs(maxy-miny))/256; - - if (min_grid>0.05 && min_grid < 1) - min_grid = 0.05; // 0.05 es el minimo valor para la presicion - - mundo = _esp; - -/// -/* - sLimitesEspacio2D _esp; - double w = maxx-minx; - double h = maxy-miny; - - double presc = 0.1; - - _esp.minX = minx-presc*w; - _esp.maxX = maxx+presc*w; - _esp.minY = miny-presc*h; - _esp.maxY = maxy+presc*h; - - //a mas pequenio el size se detectan las singularidades - min_grid = qMin(fabs(maxx-minx), fabs(maxy-miny))/256; - if (min_grid>0.05 && min_grid < 1) min_grid = 0.05; // 0.05 es el minimo valor para la presicion - - largo_mundo = 1; - mundo = _esp;*/ + + mundo = _esp; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/tests/planecurvetest.cpp new/analitza-4.11.90/analitzaplot/tests/planecurvetest.cpp --- old/analitza-4.11.2/analitzaplot/tests/planecurvetest.cpp 2013-08-28 19:01:48.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/tests/planecurvetest.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -55,13 +55,28 @@ QTest::newRow("fy-diag-line") << "y->y"; QTest::newRow("vector-diag-line") << "t->vector{t,t}"; QTest::newRow("simple-algebraic") << "x*x+y*y=3"; + QTest::newRow("roots") << "y=root(x,y)"; + QTest::newRow("polar") << "abs(sin(2*q)/sin(q/2))"; } void PlaneCurveTest::testCorrect() { QFETCH(QString, input); + + PlotBuilder pb = PlotsFactory::self()->requestPlot(Expression(input), Dim2D); - QVERIFY(PlotsFactory::self()->requestPlot(Expression(input), Dim2D).canDraw()); + QVERIFY(pb.canDraw()); + if(pb.canDraw()) { + FunctionGraph* item = pb.create(Qt::green, "hola"); + QVERIFY(item); + QVERIFY(item->isCorrect()); + PlaneCurve* curve = dynamic_cast<PlaneCurve*>(item); + QVERIFY(curve); + + curve->update(QRect(QPoint(-5, 7), QPoint(5, -7))); + curve->update(QRectF(-5,-5,10,10)); + QVERIFY(item->isCorrect() && !curve->points().isEmpty()); + } } void PlaneCurveTest::testIncorrect_data() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/tests/plotsmodeltest.cpp new/analitza-4.11.90/analitzaplot/tests/plotsmodeltest.cpp --- old/analitza-4.11.2/analitzaplot/tests/plotsmodeltest.cpp 2013-06-28 19:16:39.000000000 +0200 +++ new/analitza-4.11.90/analitzaplot/tests/plotsmodeltest.cpp 2013-10-30 23:53:40.000000000 +0100 @@ -90,6 +90,7 @@ qDebug() << "errors:" << item->errors(); QVERIFY(item->isCorrect()); + item->update(QRect(QPoint(-5, 7), QPoint(5, -7))); item->update(QRectF(-5,-5,10,10)); // the viewport is in world coordinates (not screen coordinates) if(!item->isCorrect()) qDebug() << "error" << item->errors(); -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
