From 46138875bb45d75930f0752e48fa5943db2ca0be Mon Sep 17 00:00:00 2001 From: XDrake99 Date: Mon, 12 Sep 2016 16:30:51 +0200 Subject: [PATCH] Big update (And translated the code to english) --- .settings/org.eclipse.core.resources.prefs | 8 +- res/marioground.png | Bin 0 -> 1459 bytes res/marioground.xcf | Bin 0 -> 1931 bytes res/marioskin.png | Bin 31059 -> 30238 bytes res/marioskin.xcf | Bin 45311 -> 96275 bytes res/temp.rft | Bin 0 -> 744 bytes src/org/nevec/rjm/Bernoulli.java | 8 +- src/org/nevec/rjm/BigDecimalMath.java | 82 ++-- src/org/nevec/rjm/BigIntegerMath.java | 10 +- src/org/nevec/rjm/BigIntegerPoly.java | 10 +- src/org/nevec/rjm/BigSurd.java | 24 +- src/org/nevec/rjm/BigSurdVec.java | 44 +- src/org/nevec/rjm/Ifactor.java | 6 +- src/org/nevec/rjm/NumeroAvanzato.java | 192 ++++----- src/org/nevec/rjm/NumeroAvanzatoVec.java | 100 ++--- src/org/nevec/rjm/RatPoly.java | 38 +- src/org/nevec/rjm/Rational.java | 70 ++-- src/org/nevec/rjm/Wigner3j.java | 22 +- src/org/nevec/rjm/Wigner3jGUI.java | 8 +- src/org/warp/device/Keyboard.java | 11 +- src/org/warp/device/PIDisplay.java | 15 +- src/org/warp/device/PIFrame.java | 24 ++ src/org/warp/engine/Display.java | 46 ++- ...neAnteriore.java => AnteriorFunction.java} | 30 +- ...oreBase.java => AnteriorFunctionBase.java} | 30 +- src/org/warp/picalculator/Calculator.java | 46 +-- .../{Divisione.java => Division.java} | 42 +- src/org/warp/picalculator/Equation.java | 59 +++ src/org/warp/picalculator/EquationResult.java | 13 + .../warp/picalculator/EquationsSystem.java | 92 +++++ ...eSistema.java => EquationsSystemPart.java} | 16 +- src/org/warp/picalculator/Equazione.java | 57 --- src/org/warp/picalculator/Error.java | 15 + src/org/warp/picalculator/Errore.java | 15 - .../picalculator/{Errori.java => Errors.java} | 2 +- .../{Espressione.java => Expression.java} | 385 ++++++++--------- .../{Funzione.java => Function.java} | 8 +- .../{FunzioneBase.java => FunctionBase.java} | 8 +- ...tipla.java => FunctionMultipleValues.java} | 36 +- ...e.java => FunctionMultipleValuesBase.java} | 36 +- ...eDueValori.java => FunctionTwoValues.java} | 44 +- ...riBase.java => FunctionTwoValuesBase.java} | 44 +- src/org/warp/picalculator/Incognita.java | 40 -- src/org/warp/picalculator/Incognite.java | 391 ------------------ src/org/warp/picalculator/Main.java | 9 - ...{Simboli.java => MathematicalSymbols.java} | 22 +- .../warp/picalculator/Moltiplicazione.java | 81 ---- .../MoltiplicazionePrioritaria.java | 23 -- src/org/warp/picalculator/Multiplication.java | 81 ++++ .../{Termine.java => Number.java} | 52 +-- .../picalculator/{Potenza.java => Power.java} | 18 +- .../PrioritaryMultiplication.java | 23 ++ .../warp/picalculator/RisultatoEquazione.java | 13 - .../picalculator/{Radice.java => Root.java} | 22 +- .../{RadiceQuadrata.java => RootSquare.java} | 24 +- src/org/warp/picalculator/Sistema.java | 92 ----- src/org/warp/picalculator/SolveMethod.java | 9 + src/org/warp/picalculator/Sottrazione.java | 19 - src/org/warp/picalculator/Subtraction.java | 19 + .../picalculator/{Somma.java => Sum.java} | 28 +- src/org/warp/picalculator/Tecnica.java | 9 - src/org/warp/picalculator/Utils.java | 106 ++--- src/org/warp/picalculator/Variable.java | 40 ++ src/org/warp/picalculator/Variables.java | 391 ++++++++++++++++++ .../picalculator/screens/EquationScreen.java | 33 +- .../picalculator/screens/MarioScreen.java | 117 +++++- .../screens/SolveEquationScreen.java | 13 +- 67 files changed, 1770 insertions(+), 1601 deletions(-) create mode 100644 res/marioground.png create mode 100644 res/marioground.xcf create mode 100644 res/temp.rft rename src/org/warp/picalculator/{FunzioneAnteriore.java => AnteriorFunction.java} (66%) rename src/org/warp/picalculator/{FunzioneAnterioreBase.java => AnteriorFunctionBase.java} (66%) rename src/org/warp/picalculator/{Divisione.java => Division.java} (69%) create mode 100644 src/org/warp/picalculator/Equation.java create mode 100644 src/org/warp/picalculator/EquationResult.java create mode 100644 src/org/warp/picalculator/EquationsSystem.java rename src/org/warp/picalculator/{ParteSistema.java => EquationsSystemPart.java} (76%) delete mode 100644 src/org/warp/picalculator/Equazione.java create mode 100644 src/org/warp/picalculator/Error.java delete mode 100644 src/org/warp/picalculator/Errore.java rename src/org/warp/picalculator/{Errori.java => Errors.java} (88%) rename src/org/warp/picalculator/{Espressione.java => Expression.java} (52%) rename src/org/warp/picalculator/{Funzione.java => Function.java} (55%) rename src/org/warp/picalculator/{FunzioneBase.java => FunctionBase.java} (60%) rename src/org/warp/picalculator/{FunzioneMultipla.java => FunctionMultipleValues.java} (54%) rename src/org/warp/picalculator/{FunzioneMultiplaBase.java => FunctionMultipleValuesBase.java} (52%) rename src/org/warp/picalculator/{FunzioneDueValori.java => FunctionTwoValues.java} (68%) rename src/org/warp/picalculator/{FunzioneDueValoriBase.java => FunctionTwoValuesBase.java} (67%) delete mode 100644 src/org/warp/picalculator/Incognita.java delete mode 100644 src/org/warp/picalculator/Incognite.java rename src/org/warp/picalculator/{Simboli.java => MathematicalSymbols.java} (66%) delete mode 100644 src/org/warp/picalculator/Moltiplicazione.java delete mode 100644 src/org/warp/picalculator/MoltiplicazionePrioritaria.java create mode 100644 src/org/warp/picalculator/Multiplication.java rename src/org/warp/picalculator/{Termine.java => Number.java} (83%) rename src/org/warp/picalculator/{Potenza.java => Power.java} (64%) create mode 100644 src/org/warp/picalculator/PrioritaryMultiplication.java delete mode 100644 src/org/warp/picalculator/RisultatoEquazione.java rename src/org/warp/picalculator/{Radice.java => Root.java} (71%) rename src/org/warp/picalculator/{RadiceQuadrata.java => RootSquare.java} (58%) delete mode 100644 src/org/warp/picalculator/Sistema.java create mode 100644 src/org/warp/picalculator/SolveMethod.java delete mode 100644 src/org/warp/picalculator/Sottrazione.java create mode 100644 src/org/warp/picalculator/Subtraction.java rename src/org/warp/picalculator/{Somma.java => Sum.java} (67%) delete mode 100644 src/org/warp/picalculator/Tecnica.java create mode 100644 src/org/warp/picalculator/Variable.java create mode 100644 src/org/warp/picalculator/Variables.java diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 95b348ae..fc378e22 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -3,10 +3,10 @@ encoding//src/org/nevec/rjm/BigSurd.java=UTF-8 encoding//src/org/nevec/rjm/BigSurdVec.java=UTF-8 encoding//src/org/warp/engine=UTF-8 encoding//src/org/warp/engine/Display.java=UTF-8 -encoding//src/org/warp/picalculator/Espressione.java=UTF-8 +encoding//src/org/warp/picalculator/Expression.java=UTF-8 encoding//src/org/warp/picalculator/Main.java=UTF-8 -encoding//src/org/warp/picalculator/Radice.java=UTF-8 -encoding//src/org/warp/picalculator/RadiceQuadrata.java=UTF-8 -encoding//src/org/warp/picalculator/Simboli.java=UTF-8 +encoding//src/org/warp/picalculator/MathematicalSymbols.java=UTF-8 +encoding//src/org/warp/picalculator/Root.java=UTF-8 +encoding//src/org/warp/picalculator/RootSquare.java=UTF-8 encoding//src/org/warp/picalculator/screens/EquationScreen.java=UTF-8 encoding/=UTF-8 diff --git a/res/marioground.png b/res/marioground.png new file mode 100644 index 0000000000000000000000000000000000000000..e012e319dbca49ea09c8cbb3891c8090aedfa6a3 GIT binary patch literal 1459 zcmbVMiBl4I6#jv%R}xwtyPhbRyJhOeu0`7-7ASP6HJW)KYOUf?XdZc_Vm6u9iiWzm zic)JHDPk#}VOneEsF>y5Dw&jdL8F3skW1Ttu=D1<@69*w&AfT@-k0I#;tba`)C2&) z$t1!lB{IIax~eih#Rc>zK{fE0GXZRUF^-^|rDQZBNM2C@Y;XVKkkH`_4JD}-O+G)7l>uo{b0K8$6ld=pHw|$bKAVMAq#R8K$<=yG4v1%sJ_aj-MPNI!l<-B;=X9pMngjl<0k~b4=pf!b)`iJd^Tch{v~vrP3gFd=I?I?mHcws@?UMh9AzhTm^T4-0m$ z-34uGA-O_5aM>~}Dm7pyrH$FV?WPKV0vJ#S+5ib?!ULeufB8||OTSIU?2IvFFh|}s zA_#LuDl3qD*WSZZ^a1W@y!$z!!QGnrMj*k zW*E0e?zk;`G-8z|*TJ9I*kVn%mv5+}QsL>w0P^2n`u^^Y$mL~-XGJ+f(t18`?%=i< zm2^z2ZAubyaxz!UXPXk5*|ad;Xq#WGP!Wl>@E&1u8>w@8FWtlJCbFl(`8&@q))n!x z^30(uGtnVx(glezUV%~kytwWD1zEgz+7IF5#r?y?H5AWvu-S*GD}TQ>9afW*^F?i0r4IRdK2lj%@^y~A4zi$Lpm?}Y z@9~7sAMue@Y}AhBlVPDEB46P$WI^K^K`!q|?T#-K{UI+@4)rk!!#!Q0gGUIuOS#Xb z7|YAVMOVb#LAbpvNk1{IGICz+Z02Y?dSly4weM?gIT9JwItNP#oH!XZp+X8TTMAgRng+zD$?E+Ii;;7f zjOk2dkjfGAx^C!|-rSD`36O@>ekW2+e-^?6wyqUYJTXF<=!&`e!ccfRJ^EE0_3`t? zc~bZsBG~fyjT@|VbQmS^wbV9nYwrEP*ucP%z1M!4VYXNV#&4~l_hC7C_BD4l3-)OE z<^j3tTISK)!ab*M?LsFe`IC5^ZqHU<=Sq6=V8a3W+SV}bC2M4yJ|x`Axt8aTd_IJ9 z^Hu~bEG|fU^chv^*{4$u#A|H?%I(Q-oKTFKz=f&@+_=BaLpZ(=yB(tukXlm?PJS;-MZ9RbuS7arECbbQ>L_T_hX()t z1i&!>enjwo*$YwIlzq2gue@5V-R}&7A*eM4iOzB(Cg`0>Z#6|`p3QU`fGg$V>v!Y7 hNa@$J{$Io)aSAP!Uvx5L4_7I#fJ}5D)ExG|@-NTXocI6$ literal 0 HcmV?d00001 diff --git a/res/marioground.xcf b/res/marioground.xcf new file mode 100644 index 0000000000000000000000000000000000000000..b173dbc52325ce76aa1984e8ccd6aed0a2b9c102 GIT binary patch literal 1931 zcmZ`(3sjP47{+W})Y2`@Y9?s4>DeJISCWO;%FFb$$}LMV$xIPbehW>B^0%X!-P|l zSqYKMXfpF4Yag@-X86~Ilf;dWCUKB>);?DYml$Rg5|11txx5YJgUr2=B=?o>Z}Aba z$~fc-OZR@H)HF`|e}R{#auOq>SZpR~m1!+#azADoJ#sRel|*8(qhg~ucs&vm!--D% zcY}EKf30`UhoyKQj4;bGDHzj@ggqk6{yqj_??a#>;4Q^53leWPfONt&Ege4Ll|bS? zUN+aLVIbgFfcrQsAWfR|p0<2XTfL{}y{E0A#@8?bzi!i9rdPnUM>sSi#F&^4BTkq* zgAGrFLX9K+9cP>(5X{>Mgiqq((T?K-spl1C8!gP8tb94gBKX+owT8NN+ft}LNYs62 zo8?h<3d%{^xXs;TP1+sIhl)T~F~c|8C85o$k~g$~>$f5BYKt%rV@_J5Q^a96to4*( zbzI1LaD^9n2>9y+&EOeP!l;TSk8Rg$LSw{Pc6yEIXj=Q(3IFA&Q;RG_g=iK2ROC0InKyi>T3O>#L{z z9{|gQdqt06?@GE7?zmg|iG5OB8aLX%boQP2>z9D<#7U>~y6Lk!tU{fS&$n81qBxeG zW2;>@PH5N7B}NB5K`U#hrUSl)AcL^JGlG?FJ8%-qs7*?O=-Y4*5AABYwGF35T{o&|ydnr?Y-A-tv1 z?G|@PRwu-*^*1I7Z#E?F3D5G?D< z2MM4vqE{8aSk+6{x`_iiqsZu1@vuRlIupy6930xz(r!>{y;;vaG`vY56s`}hy7c5W zXtX}-l-AHj)hskf_m2&tWox(6uX|{Y04=x!xQ0$|2e^Vni`IiM#zgOR@DfacauDq{ z%Ds`p9bE?o6~N2-Bp>szrefgeG#D6IS}O?#N(>Z#_Tifbe>oJ}>&*WS!5cF;@3y;@ zub5D`%D!q&^P+6ptUcuy2n)B{Uh1kA7UW&34m^Mq4Q>cKot@dfo9$ogESuh2JV4fz za#9yOSL+Y_nieqF6W-LuyrN(TSgGClQ^--U&QZp_y=r?KPOK
cpH+56M3j5RYTLzrioxmsWQ&p3*LRGh9GR)5-*~#NtkvQorC{5e+Wad{pI=Y Ka%lP(N%#jy1|`t| literal 0 HcmV?d00001 diff --git a/res/marioskin.png b/res/marioskin.png index dd77c3b83066d031064253075582014bd698c350..10c345795920819749ad9fe8a174cadfc1231ba1 100644 GIT binary patch literal 30238 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 HOoRUqQLQH8 literal 31059 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 diff --git a/res/marioskin.xcf b/res/marioskin.xcf index 794b1eaab6b6fcc4d622ae50b9e3945956445436..c4938cafd8aa0ca0583f5b3da8ed49717825a9ed 100644 GIT binary patch literal 96275 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 z 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 I+&W(VKl|G?)&Kwi diff --git a/res/temp.rft b/res/temp.rft new file mode 100644 index 0000000000000000000000000000000000000000..509ba74b3b5b5177921df11a0f3ad0b02d40ca4c GIT binary patch literal 744 zcmXYv-Afcv7{(uQi(>^lLr_Cd&Y9iJENj=wOf=ld*3wE_%gU(MojxqHrgh7{gn`aQ z7jq%eh0xuKAcWmnT}61YeOz?WMSnmTfmo zv|sfPNj8}{vmkQU&Cs^|7>z zy}Ccw_g%xjkpB{-TU&TMOWYsYoKa3&N#?pZKonLUTt34yVdduK(2&Tzo15w#Kr->N zXTvKKTfdYnJ~4v^>v?wQ>nOI_X5?$sX&^BT+cPoFy1UQ>t4!C&4zT`d57;{W_ROm#_@?$EQv}q+@e;V8(W?Ax$RhHV?RBo(&=9{=A6#}%^8c2J< zBb_xcp7FEMrE9#h~^m@C?>GkXrnoo><+=}Qn;)9_Y@};?<+n~e5iQ7Nb_YbF1YeXbJ2m- NA5(eYAX51kz<-ZAtXBX4 literal 0 HcmV?d00001 diff --git a/src/org/nevec/rjm/Bernoulli.java b/src/org/nevec/rjm/Bernoulli.java index a2a61666..8187efd1 100644 --- a/src/org/nevec/rjm/Bernoulli.java +++ b/src/org/nevec/rjm/Bernoulli.java @@ -3,7 +3,7 @@ package org.nevec.rjm; import java.math.BigInteger; import java.util.Vector; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; /** * Bernoulli numbers. @@ -50,9 +50,9 @@ public class Bernoulli { * @param n * the index, non-negative. * @return the B_0=1 for n=0, B_1=-1/2 for n=1, B_2=1/6 for n=2 etc - * @throws Errore + * @throws Error */ - public Rational at(int n) throws Errore { + public Rational at(int n) throws Error { if (n == 1) return (new Rational(-1, 2)); else if (n % 2 != 0) @@ -74,7 +74,7 @@ public class Bernoulli { * * @return The Bernoulli number at n. */ - private Rational doubleSum(int n) throws Errore { + private Rational doubleSum(int n) throws Error { Rational resul = Rational.ZERO; for (int k = 0; k <= n; k++) { Rational jsum = Rational.ZERO; diff --git a/src/org/nevec/rjm/BigDecimalMath.java b/src/org/nevec/rjm/BigDecimalMath.java index 0c6407e5..47e5cdb7 100644 --- a/src/org/nevec/rjm/BigDecimalMath.java +++ b/src/org/nevec/rjm/BigDecimalMath.java @@ -5,7 +5,7 @@ import java.math.BigInteger; import java.math.MathContext; import java.security.ProviderException; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; /** * BigDecimal special functions. @@ -55,10 +55,10 @@ public class BigDecimalMath { * @param mc * The required precision of the result. * @return 3.14159... - * @throws Errore + * @throws Error * @since 2009-05-29 */ - static public BigDecimal pi(final MathContext mc) throws Errore { + static public BigDecimal pi(final MathContext mc) throws Error { /* look it up if possible */ if (mc.getPrecision() < PI.precision()) return PI.round(mc); @@ -79,10 +79,10 @@ public class BigDecimalMath { * @param mc * The required precision of the result. * @return 0.577... - * @throws Errore + * @throws Error * @since 2009-08-13 */ - static public BigDecimal gamma(MathContext mc) throws Errore { + static public BigDecimal gamma(MathContext mc) throws Error { /* look it up if possible */ if (mc.getPrecision() < GAMMA.precision()) return GAMMA.round(mc); @@ -574,9 +574,9 @@ public class BigDecimalMath { * @return ln(n). * @since 2009-08-08 * @author Richard J. Mathar - * @throws Errore + * @throws Error */ - static public BigDecimal log(int n, final MathContext mc) throws Errore { + static public BigDecimal log(int n, final MathContext mc) throws Error { /* * the value is undefined if x is negative. */ @@ -1017,10 +1017,10 @@ public class BigDecimalMath { * @param x * The argument in radians. * @return sin(x) in the range -1 to 1. - * @throws Errore + * @throws Error * @since 2009-06-01 */ - static public BigDecimal sin(final BigDecimal x) throws Errore { + static public BigDecimal sin(final BigDecimal x) throws Error { if (x.compareTo(BigDecimal.ZERO) < 0) return sin(x.negate()).negate(); else if (x.compareTo(BigDecimal.ZERO) == 0) @@ -1111,10 +1111,10 @@ public class BigDecimalMath { * @param x * The argument in radians. * @return cos(x) in the range -1 to 1. - * @throws Errore + * @throws Error * @since 2009-06-01 */ - static public BigDecimal cos(final BigDecimal x) throws Errore { + static public BigDecimal cos(final BigDecimal x) throws Error { if (x.compareTo(BigDecimal.ZERO) < 0) return cos(x.negate()); else if (x.compareTo(BigDecimal.ZERO) == 0) @@ -1207,9 +1207,9 @@ public class BigDecimalMath { * @param x * the argument in radians. * @return the tan(x) - * @throws Errore + * @throws Error */ - static public BigDecimal tan(final BigDecimal x) throws Errore { + static public BigDecimal tan(final BigDecimal x) throws Error { if (x.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ZERO; else if (x.compareTo(BigDecimal.ZERO) < 0) { @@ -1271,10 +1271,10 @@ public class BigDecimalMath { * @param x * the argument in radians. * @return the cot(x) - * @throws Errore + * @throws Error * @since 2009-07-31 */ - static public BigDecimal cot(final BigDecimal x) throws Errore { + static public BigDecimal cot(final BigDecimal x) throws Error { if (x.compareTo(BigDecimal.ZERO) == 0) { throw new ArithmeticException("Cannot take cot of zero " + x.toString()); } else if (x.compareTo(BigDecimal.ZERO) < 0) { @@ -1334,9 +1334,9 @@ public class BigDecimalMath { * @param x * the argument. * @return the arcsin(x) in radians. - * @throws Errore + * @throws Error */ - static public BigDecimal asin(final BigDecimal x) throws Errore { + static public BigDecimal asin(final BigDecimal x) throws Error { if (x.compareTo(BigDecimal.ONE) > 0 || x.compareTo(BigDecimal.ONE.negate()) < 0) { throw new ArithmeticException("Out of range argument " + x.toString() + " of asin"); } else if (x.compareTo(BigDecimal.ZERO) == 0) @@ -1436,10 +1436,10 @@ public class BigDecimalMath { * @param x * the argument. * @return the arccos(x) in radians. - * @throws Errore + * @throws Error * @since 2009-09-29 */ - static public BigDecimal acos(final BigDecimal x) throws Errore { + static public BigDecimal acos(final BigDecimal x) throws Error { /* * Essentially forwarded to pi/2 - asin(x) */ @@ -1470,10 +1470,10 @@ public class BigDecimalMath { * the argument. * @return the principal value of arctan(x) in radians in the range -pi/2 to * +pi/2. - * @throws Errore + * @throws Error * @since 2009-08-03 */ - static public BigDecimal atan(final BigDecimal x) throws Errore { + static public BigDecimal atan(final BigDecimal x) throws Error { if (x.compareTo(BigDecimal.ZERO) < 0) { return atan(x.negate()).negate(); } else if (x.compareTo(BigDecimal.ZERO) == 0) @@ -1568,10 +1568,10 @@ public class BigDecimalMath { * The argument. * @return The cosh(x) = (exp(x)+exp(-x))/2 . * @author Richard J. Mathar - * @throws Errore + * @throws Error * @since 2009-08-19 */ - static public BigDecimal cosh(final BigDecimal x) throws Errore { + static public BigDecimal cosh(final BigDecimal x) throws Error { if (x.compareTo(BigDecimal.ZERO) < 0) return cos(x.negate()); else if (x.compareTo(BigDecimal.ZERO) == 0) @@ -1643,10 +1643,10 @@ public class BigDecimalMath { * the argument. * @return the sinh(x) = (exp(x)-exp(-x))/2 . * @author Richard J. Mathar - * @throws Errore + * @throws Error * @since 2009-08-19 */ - static public BigDecimal sinh(final BigDecimal x) throws Errore { + static public BigDecimal sinh(final BigDecimal x) throws Error { if (x.compareTo(BigDecimal.ZERO) < 0) return sinh(x.negate()).negate(); else if (x.compareTo(BigDecimal.ZERO) == 0) @@ -1817,10 +1817,10 @@ public class BigDecimalMath { * @param x * The argument. * @return Gamma(x). - * @throws Errore + * @throws Error * @since 2009-08-06 */ - static public BigDecimal Gamma(final BigDecimal x) throws Errore { + static public BigDecimal Gamma(final BigDecimal x) throws Error { /* * reduce to interval near 1.0 with the functional relation, * Abramowitz-Stegun 6.1.33 @@ -1924,10 +1924,10 @@ public class BigDecimalMath { * @param mc * The required accuracy in the result. * @return Gamma(x). - * @throws Errore + * @throws Error * @since 2010-05-26 */ - static public BigDecimal Gamma(final Rational q, final MathContext mc) throws Errore { + static public BigDecimal Gamma(final Rational q, final MathContext mc) throws Error { if (q.isBigInteger()) { if (q.compareTo(Rational.ZERO) <= 0) throw new ArithmeticException("Gamma at " + q.toString()); @@ -2025,10 +2025,10 @@ public class BigDecimalMath { * @param x * the original value * @return the value modulo 2*pi in the interval from 0 to 2*pi. - * @throws Errore + * @throws Error * @since 2009-06-01 */ - static public BigDecimal mod2pi(BigDecimal x) throws Errore { + static public BigDecimal mod2pi(BigDecimal x) throws Error { /* * write x= 2*pi*k+r with the precision in r defined by the precision of * x and not @@ -2074,10 +2074,10 @@ public class BigDecimalMath { * @param x * The original value * @return The value modulo pi, shifted to the interval from -Pi/2 to Pi/2. - * @throws Errore + * @throws Error * @since 2009-07-31 */ - static public BigDecimal modpi(BigDecimal x) throws Errore { + static public BigDecimal modpi(BigDecimal x) throws Error { /* * write x= pi*k+r with the precision in r defined by the precision of x * and not @@ -2128,10 +2128,10 @@ public class BigDecimalMath { * @param mc * Specification of the accuracy of the result. * @return zeta(n). - * @throws Errore + * @throws Error * @since 2009-08-05 */ - static public BigDecimal zeta(final int n, final MathContext mc) throws Errore { + static public BigDecimal zeta(final int n, final MathContext mc) throws Error { if (n <= 0) throw new ProviderException("Not implemented: zeta at negative argument " + n); if (n == 1) @@ -2311,10 +2311,10 @@ public class BigDecimalMath { * @param n * The positive integer argument. * @return zeta(n)-1. - * @throws Errore + * @throws Error * @since 2009-08-20 */ - static public double zeta1(final int n) throws Errore { + static public double zeta1(final int n) throws Error { /* * precomputed static table in double precision */ @@ -2358,10 +2358,10 @@ public class BigDecimalMath { * @return psi(x). * The error is sometimes up to 10 ulp, where AS 6.3.15 suffers from * cancellation of digits and psi=0 - * @throws Errore + * @throws Error * @since 2009-08-26 */ - static public double psi(final double x) throws Errore { + static public double psi(final double x) throws Error { /* * the single positive zero of psi(x) */ @@ -2411,11 +2411,11 @@ public class BigDecimalMath { * @param mc * Specification of the accuracy of the result * @return S_(n,p)(a) - * @throws Errore + * @throws Error * @since 2009-08-09 * @see arXiv:math/9803067 */ - static protected BigDecimal broadhurstBBP(final int n, final int p, final int a[], MathContext mc) throws Errore { + static protected BigDecimal broadhurstBBP(final int n, final int p, final int a[], MathContext mc) throws Error { /* * Explore the actual magnitude of the result first with a quick * estimate. diff --git a/src/org/nevec/rjm/BigIntegerMath.java b/src/org/nevec/rjm/BigIntegerMath.java index fa90d4d4..d9eddfd0 100644 --- a/src/org/nevec/rjm/BigIntegerMath.java +++ b/src/org/nevec/rjm/BigIntegerMath.java @@ -3,7 +3,7 @@ package org.nevec.rjm; import java.math.BigInteger; import java.util.Vector; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; /** * BigInteger special functions and Number theory. @@ -416,9 +416,9 @@ public class BigIntegerMath { * @return The vector of x in A*x=rhs. * @since 2010-08-28 * @author Richard J. Mathar - * @throws Errore + * @throws Error */ - static public Rational[] solve(final BigInteger[][] A, final BigInteger[] rhs) throws ArithmeticException, Errore { + static public Rational[] solve(final BigInteger[][] A, final BigInteger[] rhs) throws ArithmeticException, Error { final int rL = A.length; if (rL == 0) @@ -547,11 +547,11 @@ public class BigIntegerMath { * @return t(n,k) * @since 2009-08-06 * @author Richard J. Mathar - * @throws Errore + * @throws Error * @see P. L. Butzer * et al, Num. Funct. Anal. Opt. 10 (5)( 1989) 419-488 */ - static public Rational centrlFactNumt(int n, int k) throws Errore { + static public Rational centrlFactNumt(int n, int k) throws Error { if (k > n || k < 0 || (k % 2) != (n % 2)) return Rational.ZERO; else if (k == n) diff --git a/src/org/nevec/rjm/BigIntegerPoly.java b/src/org/nevec/rjm/BigIntegerPoly.java index ab72e974..3d4a61d0 100644 --- a/src/org/nevec/rjm/BigIntegerPoly.java +++ b/src/org/nevec/rjm/BigIntegerPoly.java @@ -5,7 +5,7 @@ import java.math.BigInteger; import java.util.Scanner; import java.util.Vector; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; /** * Polynomial with integer coefficients. @@ -574,10 +574,10 @@ public class BigIntegerPoly implements Cloneable { * Only factors with non-zero absolute coefficient are generated. * This means the factors are of the form x^2+a*x+b=0 with nonzero * b. - * @throws Errore + * @throws Error * @since 2012-03-01 */ - protected Vector i2roots() throws Errore { + protected Vector i2roots() throws Error { /* * The vector of the factors to be returned */ @@ -672,10 +672,10 @@ public class BigIntegerPoly implements Cloneable { * * @return The vector of factors. Factors with higher multiplicity are * represented by repetition. - * @throws Errore + * @throws Error * @since 2012-03-01 */ - public Vector ifactor() throws Errore { + public Vector ifactor() throws Error { /* * this ought be entirely rewritten in terms of the LLL algorithm */ diff --git a/src/org/nevec/rjm/BigSurd.java b/src/org/nevec/rjm/BigSurd.java index 8bdc3690..1cb1520e 100644 --- a/src/org/nevec/rjm/BigSurd.java +++ b/src/org/nevec/rjm/BigSurd.java @@ -5,7 +5,7 @@ import java.math.BigInteger; import java.math.MathContext; import java.security.ProviderException; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; import org.warp.picalculator.Utils; /** @@ -70,7 +70,7 @@ public class BigSurd implements Cloneable, Comparable { try { normalize(); normalizeG(); - } catch (Errore e) { + } catch (Error e) { e.printStackTrace(); } } @@ -212,10 +212,10 @@ public class BigSurd implements Cloneable, Comparable { * @param val * A second number of this type. * @return The value of this/val - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public BigSurd divide(final BigSurd val) throws Errore { + public BigSurd divide(final BigSurd val) throws Error { if (val.signum() == 0) throw new ArithmeticException("Dividing " + toFancyString() + " through zero."); return new BigSurd(pref.divide(val.pref), disc.divide(val.disc)); @@ -258,10 +258,10 @@ public class BigSurd implements Cloneable, Comparable { * @param val * a second number. * @return the value of this/val - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public BigSurd divide(final BigInteger val) throws Errore { + public BigSurd divide(final BigInteger val) throws Error { if (val.signum() == 0) throw new ArithmeticException("Dividing " + toFancyString() + " through zero."); return new BigSurd(pref.divide(val), disc); @@ -273,10 +273,10 @@ public class BigSurd implements Cloneable, Comparable { * @param val * A second number. * @return The value of this/val - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public BigSurd divide(int val) throws Errore { + public BigSurd divide(int val) throws Error { if (val == 0) throw new ArithmeticException("Dividing " + toFancyString() + " through zero."); return new BigSurd(pref.divide(val), disc); @@ -452,10 +452,10 @@ public class BigSurd implements Cloneable, Comparable { /** * Normalize to squarefree discriminant. * - * @throws Errore + * @throws Error * @since 2011-02-12 */ - protected void normalize() throws Errore { + protected void normalize() throws Error { /* * Move squares out of the numerator and denominator of the discriminant */ @@ -492,10 +492,10 @@ public class BigSurd implements Cloneable, Comparable { * Normalize to coprime numerator and denominator in prefactor and * discriminant * - * @throws Errore + * @throws Error * @since 2011-02-12 */ - protected void normalizeG() throws Errore { + protected void normalizeG() throws Error { /* * Is there a common factor between the numerator of the prefactor * and the denominator of the discriminant ? diff --git a/src/org/nevec/rjm/BigSurdVec.java b/src/org/nevec/rjm/BigSurdVec.java index b23c5795..2e82a92f 100644 --- a/src/org/nevec/rjm/BigSurdVec.java +++ b/src/org/nevec/rjm/BigSurdVec.java @@ -5,7 +5,7 @@ import java.math.BigInteger; import java.math.MathContext; import java.util.Vector; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; import org.warp.picalculator.Utils; /** @@ -69,7 +69,7 @@ public class BigSurdVec implements Comparable { terms.add(b); try { normalize(); - } catch (Errore e) { + } catch (Error e) { // TODO Auto-generated catch block e.printStackTrace(); } @@ -79,11 +79,11 @@ public class BigSurdVec implements Comparable { * Combine terms that can be written as a single surd. This unites for * example the terms sqrt(90) and sqrt(10) to 4*sqrt(10). * - * @throws Errore + * @throws Error * * @since 2012-02-15 */ - protected void normalize() throws Errore { + protected void normalize() throws Error { /* * nothing to be done if at most one term */ @@ -148,7 +148,7 @@ public class BigSurdVec implements Comparable { try { diff = this.subtract(oth); return diff.signum(); - } catch (Errore e) { + } catch (Error e) { // TODO Auto-generated catch block e.printStackTrace(); return 0; @@ -160,10 +160,10 @@ public class BigSurdVec implements Comparable { * equal to or larger than zero. * * @return 0 or +-1. - * @throws Errore + * @throws Error * @since 2012-02-15 */ - public int signum() throws Errore { + public int signum() throws Error { /* * the case of zero is unique, because no (reduced) vector of surds * other than the one element 0 itself can add/subtract to zero. @@ -308,9 +308,9 @@ public class BigSurdVec implements Comparable { * @param val * The value to be added to this. * @return The new value representing this+val. - * @throws Errore + * @throws Error */ - public BigSurdVec add(final BigSurdVec val) throws Errore { + public BigSurdVec add(final BigSurdVec val) throws Error { BigSurdVec sum = new BigSurdVec(); /* * concatenate the vectors and eliminate common overlaps @@ -335,9 +335,9 @@ public class BigSurdVec implements Comparable { * @param val * The value to be added to this. * @return The new value representing this+val. - * @throws Errore + * @throws Error */ - public BigSurdVec add(final BigSurd val) throws Errore { + public BigSurdVec add(final BigSurd val) throws Error { BigSurdVec sum = new BigSurdVec(); /* * concatenate the vectors and eliminate common overlaps @@ -354,9 +354,9 @@ public class BigSurdVec implements Comparable { * @param val * The value to be subtracted from this. * @return The new value representing this-val. - * @throws Errore + * @throws Error */ - public BigSurdVec subtract(final BigSurdVec val) throws Errore { + public BigSurdVec subtract(final BigSurdVec val) throws Error { BigSurdVec sum = new BigSurdVec(); /* * concatenate the vectors and eliminate common overlaps @@ -374,9 +374,9 @@ public class BigSurdVec implements Comparable { * @param val * The value to be subtracted from this. * @return The new value representing this-val. - * @throws Errore + * @throws Error */ - public BigSurdVec subtract(final BigSurd val) throws Errore { + public BigSurdVec subtract(final BigSurd val) throws Error { BigSurdVec sum = new BigSurdVec(); /* * concatenate the vectors and eliminate common overlaps @@ -411,10 +411,10 @@ public class BigSurdVec implements Comparable { * Compute the square. * * @return this value squared. - * @throws Errore + * @throws Error * @since 2012-02-15 */ - public BigSurdVec sqr() throws Errore { + public BigSurdVec sqr() throws Error { /* * Binomial expansion. First the sum of the terms squared, then 2 times * the mixed products. @@ -435,10 +435,10 @@ public class BigSurdVec implements Comparable { * @param val * a second number of this type. * @return the product of this with the val. - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public BigSurdVec multiply(final BigSurd val) throws Errore { + public BigSurdVec multiply(final BigSurd val) throws Error { BigSurdVec resul = new BigSurdVec(); for (BigSurd s : terms) resul.terms.add(s.multiply(val)); @@ -446,7 +446,7 @@ public class BigSurdVec implements Comparable { return resul; } /* multiply */ - public BigSurdVec multiply(final BigSurdVec val) throws Errore { + public BigSurdVec multiply(final BigSurdVec val) throws Error { BigSurdVec resul = new BigSurdVec(); for (BigSurd s : terms) { resul.terms.add(s); @@ -457,7 +457,7 @@ public class BigSurdVec implements Comparable { return resul; } /* multiply */ - public BigSurdVec divide(final BigSurd val) throws Errore { + public BigSurdVec divide(final BigSurd val) throws Error { BigSurdVec resul = new BigSurdVec(); for (BigSurd s : terms) resul.terms.add(s.divide(val)); @@ -465,7 +465,7 @@ public class BigSurdVec implements Comparable { return resul; } /* multiply */ - public BigSurdVec divide(final BigSurdVec val) throws Errore { + public BigSurdVec divide(final BigSurdVec val) throws Error { BigSurdVec resul = new BigSurdVec(); resul.terms = terms; for (BigSurd s : val.terms) { diff --git a/src/org/nevec/rjm/Ifactor.java b/src/org/nevec/rjm/Ifactor.java index d1feba75..98049b19 100644 --- a/src/org/nevec/rjm/Ifactor.java +++ b/src/org/nevec/rjm/Ifactor.java @@ -4,7 +4,7 @@ import java.math.BigInteger; import java.util.Collections; import java.util.Vector; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; /** * Factored integers. @@ -465,10 +465,10 @@ public class Ifactor implements Cloneable, Comparable { * The return value falls into the Ifactor class if r is positive, * but if r is negative * a Rational type is needed. - * @throws Errore + * @throws Error * @since 2009-05-18 */ - public Rational root(final int r) throws ArithmeticException, Errore { + public Rational root(final int r) throws ArithmeticException, Error { if (r == 0) throw new ArithmeticException("Cannot pull zeroth root of " + toString()); else if (r < 0) { diff --git a/src/org/nevec/rjm/NumeroAvanzato.java b/src/org/nevec/rjm/NumeroAvanzato.java index 392a8c13..5bd25ae3 100644 --- a/src/org/nevec/rjm/NumeroAvanzato.java +++ b/src/org/nevec/rjm/NumeroAvanzato.java @@ -5,8 +5,8 @@ import java.math.BigInteger; import java.math.MathContext; import java.security.ProviderException; -import org.warp.picalculator.Errore; -import org.warp.picalculator.Incognite; +import org.warp.picalculator.Error; +import org.warp.picalculator.Variables; /** * Square roots on the real line. These represent numbers which are a product of @@ -32,11 +32,11 @@ public class NumeroAvanzato implements Cloneable { */ Rational pref; - private Incognite incognitex; + private Variables variablex; - private Incognite incognitey; + private Variables variabley; - private Incognite incognitez; + private Variables variablez; /** * The number underneath the square root, always non-negative. The @@ -52,9 +52,9 @@ public class NumeroAvanzato implements Cloneable { public NumeroAvanzato() { pref = Rational.ZERO; disc = Rational.ZERO; - incognitex = new Incognite(); - incognitey = new Incognite(); - incognitez = new Incognite(); + variablex = new Variables(); + variabley = new Variables(); + variablez = new Variables(); } /** @@ -65,7 +65,7 @@ public class NumeroAvanzato implements Cloneable { * the prefactor. * @param b * the discriminant. - * @throws Errore + * @throws Error * @since 2011-02-12 */ public NumeroAvanzato(Rational a, Rational b) { @@ -76,18 +76,18 @@ public class NumeroAvanzato implements Cloneable { if (b.signum() < 0) throw new ProviderException("Not implemented: imaginary surds"); this.disc = b; - incognitex = new Incognite(); - incognitey = new Incognite(); - incognitez = new Incognite(); + variablex = new Variables(); + variabley = new Variables(); + variablez = new Variables(); try { normalize(); normalizeG(); - } catch (Errore e) { + } catch (Error e) { e.printStackTrace(); } } - public NumeroAvanzato(Rational a, Rational b, Incognite x, Incognite y, Incognite z) { + public NumeroAvanzato(Rational a, Rational b, Variables x, Variables y, Variables z) { this.pref = a; /* * reject attempts to use a negative b @@ -95,13 +95,13 @@ public class NumeroAvanzato implements Cloneable { if (b.signum() < 0) throw new ProviderException("Not implemented: imaginary surds"); this.disc = b; - incognitex = x; - incognitey = y; - incognitez = z; + variablex = x; + variabley = y; + variablez = z; try { normalize(); normalizeG(); - } catch (Errore e) { + } catch (Error e) { e.printStackTrace(); } } @@ -145,9 +145,9 @@ public class NumeroAvanzato implements Cloneable { public NumeroAvanzato clone() { Rational fclon = pref.clone(); Rational dclon = disc.clone(); - Incognite incognitexb = incognitex; - Incognite incogniteyb = incognitey; - Incognite incognitezb = incognitez; + Variables incognitexb = variablex; + Variables incogniteyb = variabley; + Variables incognitezb = variablez; /* * the main intent here is to bypass any attempt to reduce the * discriminant by figuring out the square-free part in normalize(), @@ -156,9 +156,9 @@ public class NumeroAvanzato implements Cloneable { NumeroAvanzato cl = new NumeroAvanzato(); cl.pref = fclon; cl.disc = dclon; - cl.incognitex = incognitexb; - cl.incognitey = incogniteyb; - cl.incognitez = incognitezb; + cl.variablex = incognitexb; + cl.variabley = incogniteyb; + cl.variablez = incognitezb; return cl; } /* NumeroAvanzato.clone */ @@ -189,7 +189,7 @@ public class NumeroAvanzato implements Cloneable { * @since 2011-02-12 */ public NumeroAvanzato multiply(final NumeroAvanzato val) { - return new NumeroAvanzato(pref.multiply(val.pref), disc.multiply(val.disc), incognitex.multiply(val.incognitex), incognitey.multiply(val.incognitey), incognitez.multiply(val.incognitez)); + return new NumeroAvanzato(pref.multiply(val.pref), disc.multiply(val.disc), variablex.multiply(val.variablex), variabley.multiply(val.variabley), variablez.multiply(val.variablez)); } /* NumeroAvanzato.multiply */ /** @@ -201,7 +201,7 @@ public class NumeroAvanzato implements Cloneable { * @since 2011-02-15 */ public NumeroAvanzato multiply(final Rational val) { - return new NumeroAvanzato(pref.multiply(val), disc, incognitex, incognitey, incognitez); + return new NumeroAvanzato(pref.multiply(val), disc, variablex, variabley, variablez); } /* NumeroAvanzato.multiply */ /** @@ -213,7 +213,7 @@ public class NumeroAvanzato implements Cloneable { * @since 2011-02-12 */ public NumeroAvanzato multiply(final BigInteger val) { - return new NumeroAvanzato(pref.multiply(val), disc, incognitex, incognitey, incognitez); + return new NumeroAvanzato(pref.multiply(val), disc, variablex, variabley, variablez); } /* NumeroAvanzato.multiply */ /** @@ -233,10 +233,10 @@ public class NumeroAvanzato implements Cloneable { * Compute the square. * * @return this value squared. - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public NumeroAvanzato pow2() throws Errore { + public NumeroAvanzato pow2() throws Error { NumeroAvanzato res = new NumeroAvanzato(); BigInteger a = pref.a; BigInteger b = pref.b; @@ -245,9 +245,9 @@ public class NumeroAvanzato implements Cloneable { res.pref = new Rational(a.pow(2).multiply(c).multiply(d), b.pow(2).multiply(d)); res.disc = new Rational(0, 1); res.normalize(); - res.incognitex = incognitex; - res.incognitey = incognitey.multiply(incognitey); - res.incognitez = incognitez.multiply(incognitez); + res.variablex = variablex; + res.variabley = variabley.multiply(variabley); + res.variablez = variablez.multiply(variablez); return res; } /* NumeroAvanzato.sqr */ @@ -257,21 +257,21 @@ public class NumeroAvanzato implements Cloneable { * @param val * A second number of this type. * @return The value of this/val - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public NumeroAvanzato divide(final NumeroAvanzato val) throws Errore { + public NumeroAvanzato divide(final NumeroAvanzato val) throws Error { if (val.signum() == 0) throw new ArithmeticException("Dividing " + toFancyString() + " through zero."); NumeroAvanzato result = new NumeroAvanzato(pref.divide(val.pref), disc.divide(val.disc)); - result.incognitex = incognitex.divide(val.incognitex); - result.incognitey = incognitey.divide(val.incognitey); - result.incognitez = incognitez.divide(val.incognitez); + result.variablex = variablex.divide(val.variablex); + result.variabley = variabley.divide(val.variabley); + result.variablez = variablez.divide(val.variablez); result.normalize(); return result; } /* NumeroAvanzato.divide */ - private String toFancyString() throws Errore { + private String toFancyString() throws Error { return new NumeroAvanzatoVec(this).toFancyString(); } @@ -281,10 +281,10 @@ public class NumeroAvanzato implements Cloneable { * @param val * a second number. * @return the value of this/val - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public NumeroAvanzato divide(final BigInteger val) throws Errore { + public NumeroAvanzato divide(final BigInteger val) throws Error { if (val.signum() == 0) throw new ArithmeticException("Dividing " + toFancyString() + " through zero."); return new NumeroAvanzato(pref.divide(val), disc); @@ -296,10 +296,10 @@ public class NumeroAvanzato implements Cloneable { * @param val * A second number. * @return The value of this/val - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public NumeroAvanzato divide(int val) throws Errore { + public NumeroAvanzato divide(int val) throws Error { if (val == 0) throw new ArithmeticException("Dividing " + toFancyString() + " through zero."); return new NumeroAvanzato(pref.divide(val), disc); @@ -338,10 +338,10 @@ public class NumeroAvanzato implements Cloneable { * the other constant to compare with * @return -1, 0 or 1 if this number is numerically less than, equal to, or * greater than val. - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public int signumComparedTo(final NumeroAvanzato val) throws Errore { + public int signumComparedTo(final NumeroAvanzato val) throws Error { /* * Since we keep the discriminant positive, the rough estimate comes * from comparing the signs of the prefactors. @@ -390,7 +390,7 @@ public class NumeroAvanzato implements Cloneable { public String toString() { try { return toFancyString(); - } catch (Errore e) { + } catch (Error e) { // TODO Auto-generated catch block e.printStackTrace(); } @@ -442,13 +442,13 @@ public class NumeroAvanzato implements Cloneable { */ public boolean isBigInteger(boolean hasBigIntegerVariables) { if (pref.isBigInteger() && (disc.signum() == 0 || disc.compareTo(Rational.ONE) == 0)) { - if (disc.signum() != 0 && incognitex.count() > 0) { + if (disc.signum() != 0 && variablex.count() > 0) { return false; } - if (hasBigIntegerVariables == false && incognitey.count() > 0) { + if (hasBigIntegerVariables == false && variabley.count() > 0) { return false; } - if (pref.b.compareTo(BigInteger.ZERO) != 0 && disc.b.compareTo(BigInteger.ZERO) != 0 && incognitez.count() > 0) { + if (pref.b.compareTo(BigInteger.ZERO) != 0 && disc.b.compareTo(BigInteger.ZERO) != 0 && variablez.count() > 0) { return false; } return true; @@ -458,10 +458,10 @@ public class NumeroAvanzato implements Cloneable { public boolean isRational(boolean hasRationalVariables) { if (disc.signum() == 0 || disc.compareTo(new Rational(1, 1)) == 0) { - if (incognitex.count() > 0) { + if (variablex.count() > 0) { return false; } else if (hasRationalVariables == false) { - if (incognitey.count() > 0 || incognitez.count() > 0) { + if (variabley.count() > 0 || variablez.count() > 0) { return false; } } @@ -477,10 +477,10 @@ public class NumeroAvanzato implements Cloneable { public boolean isTooPreciseRational(boolean hasRationalVariables) { if (disc.signum() == 0 || disc.compareTo(new Rational(1, 1)) == 0) { - if (incognitex.count() > 0) { + if (variablex.count() > 0) { return false; } else if (hasRationalVariables == false) { - if (incognitey.count() > 0 || incognitez.count() > 0) { + if (variabley.count() > 0 || variablez.count() > 0) { return false; } } @@ -496,18 +496,18 @@ public class NumeroAvanzato implements Cloneable { /** * Convert to a rational value if possible * - * @throws Errore + * @throws Error * * @since 2012-02-15 */ - public Rational toRational(boolean hasRationalVariables) throws Errore { + public Rational toRational(boolean hasRationalVariables) throws Error { if (isRational(hasRationalVariables) || isTooPreciseRational(hasRationalVariables)) return pref; else throw new ArithmeticException("Undefined conversion " + toFancyString() + " to Rational."); } /* NumeroAvanzato.toRational */ - public Rational toRational() throws Errore { + public Rational toRational() throws Error { if (isRational(true)) return pref; else @@ -532,11 +532,11 @@ public class NumeroAvanzato implements Cloneable { /** * Normalize to squarefree discriminant. * - * @throws Errore + * @throws Error * * @since 2011-02-12 */ - protected void normalize() throws Errore { + protected void normalize() throws Error { /* * Move squares out of the numerator and denominator of the discriminant */ @@ -572,31 +572,31 @@ public class NumeroAvanzato implements Cloneable { disc = new Rational(numC, denC); if (disc.b.compareTo(BigInteger.ZERO) == 0 || disc.a.compareTo(BigInteger.ZERO) == 0 || pref.a.compareTo(BigInteger.ZERO) == 0) { - incognitex = new Incognite(); - incognitey = new Incognite(); + variablex = new Variables(); + variabley = new Variables(); } if (disc.b.compareTo(BigInteger.ZERO) == 0 || pref.b.compareTo(BigInteger.ZERO) == 0) { - incognitez = new Incognite(); + variablez = new Variables(); } - if (incognitey.compareTo(incognitez)) { - incognitey = new Incognite(); - incognitez = new Incognite(); + if (variabley.compareTo(variablez)) { + variabley = new Variables(); + variablez = new Variables(); } /**/ - Incognite[] incognitetemp = new Incognite[] { incognitex, incognitey, incognitez }; - incognitetemp = Incognite.normalizeBigSurdVariables(incognitetemp); - incognitex = incognitetemp[0]; - incognitey = incognitetemp[1]; - incognitez = incognitetemp[2]; + Variables[] incognitetemp = new Variables[] { variablex, variabley, variablez }; + incognitetemp = Variables.normalizeBigSurdVariables(incognitetemp); + variablex = incognitetemp[0]; + variabley = incognitetemp[1]; + variablez = incognitetemp[2]; /**/ } else { pref = Rational.ZERO; - incognitex = new Incognite(); - incognitey = new Incognite(); - incognitez = new Incognite(); + variablex = new Variables(); + variabley = new Variables(); + variablez = new Variables(); } } /* NumeroAvanzato.normalize */ @@ -604,11 +604,11 @@ public class NumeroAvanzato implements Cloneable { * Normalize to coprime numerator and denominator in prefactor and * discriminant * - * @throws Errore + * @throws Error * * @since 2011-02-12 */ - protected void normalizeG() throws Errore { + protected void normalizeG() throws Error { /* * Is there a common factor between the numerator of the prefactor and * the denominator of the discriminant ? @@ -681,65 +681,65 @@ public class NumeroAvanzato implements Cloneable { if (pow2().pref == Rational.ZERO) { return true; } else { - if (incognitex == na.incognitex) { - if (incognitey == na.incognitey) { - if (incognitez == na.incognitez) { + if (variablex == na.variablex) { + if (variabley == na.variabley) { + if (variablez == na.variablez) { return true; } } } } } - } catch (Errore e) { + } catch (Error e) { e.printStackTrace(); } } return false; } - public Incognite getIncognitex() { - if (incognitex == null) { - return incognitex; + public Variables getVariableX() { + if (variablex == null) { + return variablex; } - return incognitex.clone(); + return variablex.clone(); } - public NumeroAvanzato setIncognitex(Incognite incognitex) { + public NumeroAvanzato setVariableX(Variables x) { NumeroAvanzato result = this.clone(); - result.incognitex = incognitex; + result.variablex = x; return result; } - public Incognite getIncognitey() { - if (incognitey == null) { - return incognitey; + public Variables getVariableY() { + if (variabley == null) { + return variabley; } - return incognitey.clone(); + return variabley.clone(); } - public NumeroAvanzato setIncognitey(Incognite incognitey) { + public NumeroAvanzato setVariableY(Variables y) { NumeroAvanzato result = this.clone(); - result.incognitey = incognitey; + result.variabley = y; return result; } - public Incognite getIncognitez() { - if (incognitez == null) { - return incognitez; + public Variables getVariableZ() { + if (variablez == null) { + return variablez; } - return incognitez.clone(); + return variablez.clone(); } - public NumeroAvanzato setIncognitez(Incognite incognitez) { + public NumeroAvanzato setVariableZ(Variables z) { NumeroAvanzato result = this.clone(); - result.incognitez = incognitez; + result.variablez = z; return result; } public NumeroAvanzato divideUnsafe(BigInteger denominator) { try { return divide(denominator); - } catch (Errore e) { + } catch (Error e) { e.printStackTrace(); return new NumeroAvanzato(); } diff --git a/src/org/nevec/rjm/NumeroAvanzatoVec.java b/src/org/nevec/rjm/NumeroAvanzatoVec.java index 114a53bf..10d1c203 100644 --- a/src/org/nevec/rjm/NumeroAvanzatoVec.java +++ b/src/org/nevec/rjm/NumeroAvanzatoVec.java @@ -6,8 +6,8 @@ import java.math.MathContext; import java.util.Comparator; import java.util.Vector; -import org.warp.picalculator.Errore; -import org.warp.picalculator.Incognite; +import org.warp.picalculator.Error; +import org.warp.picalculator.Variables; import org.warp.picalculator.Utils; /** @@ -75,7 +75,7 @@ public class NumeroAvanzatoVec implements Comparable { terms.add(b); try { normalize(); - } catch (Errore e) { + } catch (Error e) { e.printStackTrace(); } } /* ctor */ @@ -84,11 +84,11 @@ public class NumeroAvanzatoVec implements Comparable { * Combine terms that can be written as a single surd. This unites for * example the terms sqrt(90) and sqrt(10) to 4*sqrt(10). * - * @throws Errore + * @throws Error * * @since 2012-02-15 */ - protected void normalize() throws Errore { + protected void normalize() throws Error { /* * nothing to be done if at most one term */ @@ -111,7 +111,7 @@ public class NumeroAvanzatoVec implements Comparable { * if this reduction works. */ NumeroAvanzato r = todo.divide(v); - if ((r.isRational(true) || r.isTooPreciseRational(true)) && todo.getIncognitex().compareTo(v.getIncognitex()) && todo.getIncognitey().compareTo(v.getIncognitey()) && todo.getIncognitez().compareTo(v.getIncognitez())) { + if ((r.isRational(true) || r.isTooPreciseRational(true)) && todo.getVariableX().compareTo(v.getVariableX()) && todo.getVariableY().compareTo(v.getVariableY()) && todo.getVariableZ().compareTo(v.getVariableZ())) { /* compute r+1 */ Rational newpref = r.toRational(true).add(1); /* @@ -137,8 +137,8 @@ public class NumeroAvanzatoVec implements Comparable { newter.sort(new Comparator() { @Override public int compare(NumeroAvanzato o1, NumeroAvanzato o2) { - int index1 = Incognite.priorità(o1.getIncognitex().sqrt().multiply(o1.getIncognitey()).divide(o1.getIncognitez())); - int index2 = Incognite.priorità(o2.getIncognitex().sqrt().multiply(o2.getIncognitey()).divide(o2.getIncognitez())); + int index1 = Variables.priority(o1.getVariableX().sqrt().multiply(o1.getVariableY()).divide(o1.getVariableZ())); + int index2 = Variables.priority(o2.getVariableX().sqrt().multiply(o2.getVariableY()).divide(o2.getVariableZ())); return index2 - index1; } }); @@ -162,7 +162,7 @@ public class NumeroAvanzatoVec implements Comparable { try { diff = this.subtract(oth); return diff.signum(); - } catch (Errore e) { + } catch (Error e) { e.printStackTrace(); return 0; } @@ -173,10 +173,10 @@ public class NumeroAvanzatoVec implements Comparable { * equal to or larger than zero. * * @return 0 or +-1. - * @throws Errore + * @throws Error * @since 2012-02-15 */ - public int signum() throws Errore { + public int signum() throws Error { /* * the case of zero is unique, because no (reduced) vector of surds * other than the one element 0 itself can add/subtract to zero. @@ -325,9 +325,9 @@ public class NumeroAvanzatoVec implements Comparable { * @param val * The value to be added to this. * @return The new value representing this+val. - * @throws Errore + * @throws Error */ - public NumeroAvanzatoVec add(final NumeroAvanzatoVec val) throws Errore { + public NumeroAvanzatoVec add(final NumeroAvanzatoVec val) throws Error { NumeroAvanzatoVec sum = new NumeroAvanzatoVec(); /* * concatenate the vectors and eliminate common overlaps @@ -352,9 +352,9 @@ public class NumeroAvanzatoVec implements Comparable { * @param val * The value to be added to this. * @return The new value representing this+val. - * @throws Errore + * @throws Error */ - public NumeroAvanzatoVec add(final NumeroAvanzato val) throws Errore { + public NumeroAvanzatoVec add(final NumeroAvanzato val) throws Error { NumeroAvanzatoVec sum = new NumeroAvanzatoVec(); /* * concatenate the vectors and eliminate common overlaps @@ -371,9 +371,9 @@ public class NumeroAvanzatoVec implements Comparable { * @param val * The value to be subtracted from this. * @return The new value representing this-val. - * @throws Errore + * @throws Error */ - public NumeroAvanzatoVec subtract(final NumeroAvanzatoVec val) throws Errore { + public NumeroAvanzatoVec subtract(final NumeroAvanzatoVec val) throws Error { NumeroAvanzatoVec sum = new NumeroAvanzatoVec(); /* * concatenate the vectors and eliminate common overlaps @@ -391,9 +391,9 @@ public class NumeroAvanzatoVec implements Comparable { * @param val * The value to be subtracted from this. * @return The new value representing this-val. - * @throws Errore + * @throws Error */ - public NumeroAvanzatoVec subtract(final NumeroAvanzato val) throws Errore { + public NumeroAvanzatoVec subtract(final NumeroAvanzato val) throws Error { NumeroAvanzatoVec sum = new NumeroAvanzatoVec(); /* * concatenate the vectors and eliminate common overlaps @@ -428,10 +428,10 @@ public class NumeroAvanzatoVec implements Comparable { * Compute the square. * * @return this value squared. - * @throws Errore + * @throws Error * @since 2012-02-15 */ - public NumeroAvanzatoVec sqr() throws Errore { + public NumeroAvanzatoVec sqr() throws Error { /* * Binomial expansion. First the sum of the terms squared, then 2 times * the mixed products. @@ -452,10 +452,10 @@ public class NumeroAvanzatoVec implements Comparable { * @param val * a second number of this type. * @return the product of this with the val. - * @throws Errore + * @throws Error * @since 2011-02-12 */ - public NumeroAvanzatoVec multiply(final NumeroAvanzato val) throws Errore { + public NumeroAvanzatoVec multiply(final NumeroAvanzato val) throws Error { NumeroAvanzatoVec resul = new NumeroAvanzatoVec(); for (NumeroAvanzato s : terms) resul.terms.add(s.multiply(val)); @@ -463,7 +463,7 @@ public class NumeroAvanzatoVec implements Comparable { return resul; } /* multiply */ - public NumeroAvanzatoVec multiply(final NumeroAvanzatoVec val) throws Errore { + public NumeroAvanzatoVec multiply(final NumeroAvanzatoVec val) throws Error { NumeroAvanzatoVec resul = new NumeroAvanzatoVec(); for (NumeroAvanzato s : terms) { for (NumeroAvanzato s2 : val.terms) { @@ -473,7 +473,7 @@ public class NumeroAvanzatoVec implements Comparable { return resul; } /* multiply */ - public NumeroAvanzatoVec divide(final NumeroAvanzato val) throws Errore { + public NumeroAvanzatoVec divide(final NumeroAvanzato val) throws Error { NumeroAvanzatoVec resul = new NumeroAvanzatoVec(); for (NumeroAvanzato s : terms) { resul.terms.add(s.divide(val)); @@ -482,7 +482,7 @@ public class NumeroAvanzatoVec implements Comparable { return resul; } /* divide */ - public NumeroAvanzatoVec divide(final NumeroAvanzatoVec val) throws Errore { + public NumeroAvanzatoVec divide(final NumeroAvanzatoVec val) throws Error { NumeroAvanzatoVec resul = new NumeroAvanzatoVec(); resul.terms = this.terms; for (NumeroAvanzato s : val.terms) { @@ -523,7 +523,7 @@ public class NumeroAvanzatoVec implements Comparable { for (NumeroAvanzato s : terms) { val = s.isBigInteger(hasBigIntegerVariables); if (val == true) { - if (s.getIncognitex().count() > 0 || s.getIncognitez().count() > 0) { + if (s.getVariableX().count() > 0 || s.getVariableZ().count() > 0) { val = false; } } @@ -625,17 +625,17 @@ public class NumeroAvanzatoVec implements Comparable { } else { s += num; } - s += bs.getIncognitey().toString(); + s += bs.getVariableY().toString(); return s; } else { BigInteger denominator = BigInteger.ONE; - Incognite incognitedenom = new Incognite(); + Variables incognitedenom = new Variables(); for (int i = 0; i < terms.size(); i++) { denominator = BigIntegerMath.lcm(denominator, terms.elementAt(i).pref.b); // denominator = // denominator.multiply(terms.elementAt(i).pref.b); - Incognite iz = terms.elementAt(i).getIncognitez(); - incognitedenom = Incognite.lcm(incognitedenom, iz); + Variables iz = terms.elementAt(i).getVariableZ(); + incognitedenom = Variables.lcm(incognitedenom, iz); } String s = ""; @@ -660,7 +660,7 @@ public class NumeroAvanzatoVec implements Comparable { } s += num; } - s += bs.getIncognitey().toString(); + s += bs.getVariableY().toString(); } return s; } @@ -673,10 +673,10 @@ public class NumeroAvanzatoVec implements Comparable { for (int t = 0; t < terms.size(); t++) { NumeroAvanzato bs = terms.elementAt(t).clone(); - bs = bs.setIncognitey(bs.getIncognitey().divide(bs.getIncognitez())); - bs = bs.setIncognitey(bs.getIncognitey().multiply(incognitedenom)); + bs = bs.setVariableY(bs.getVariableY().divide(bs.getVariableZ())); + bs = bs.setVariableY(bs.getVariableY().multiply(incognitedenom)); bs = bs.multiply(denominator); - bs = bs.setIncognitez(incognitedenom); + bs = bs.setVariableZ(incognitedenom); bs.pref = new Rational(bs.pref.a, BigInteger.ONE); if (bs.signum() > 0 && t > 0) @@ -685,12 +685,12 @@ public class NumeroAvanzatoVec implements Comparable { String numb; try { numb = bs.toRational(true).a.toString(); - } catch (Errore e) { + } catch (Error e) { // TODO Auto-generated catch block e.printStackTrace(); numb = ""; } - String incognite = bs.getIncognitey().toString(); + String incognite = bs.getVariableY().toString(); if (((numb.equals("1") || numb.equals("-1")) == false && incognite.length() > 0) || incognite.length() == 0) { s += numb; } else if (numb.equals("-1")) { @@ -700,16 +700,16 @@ public class NumeroAvanzatoVec implements Comparable { } else if (bs.isRational(true) || bs.isTooPreciseRational(true)) { try { s += bs.toRational(true).toString(); - } catch (Errore e) { + } catch (Error e) { // TODO Auto-generated catch block e.printStackTrace(); } - s += bs.getIncognitey().toString(); + s += bs.getVariableY().toString(); } else { BigInteger numerator = bs.pref.numer(); - if ((numerator.compareTo(BigInteger.ONE) != 0 || bs.getIncognitey().count() > 0) && (bs.disc.compareTo(BigInteger.ONE) != 0 || bs.getIncognitex().count() > 0)) { - if (((bs.getIncognitey().count() > 0) || (bs.getIncognitey().count() == 0 && numerator.toString().length() > 0))) { - if ((bs.getIncognitey().count() > 0 && (numerator.toString().equals("1") || numerator.toString().equals("-1")) == false) || bs.getIncognitey().count() == 0) { + if ((numerator.compareTo(BigInteger.ONE) != 0 || bs.getVariableY().count() > 0) && (bs.disc.compareTo(BigInteger.ONE) != 0 || bs.getVariableX().count() > 0)) { + if (((bs.getVariableY().count() > 0) || (bs.getVariableY().count() == 0 && numerator.toString().length() > 0))) { + if ((bs.getVariableY().count() > 0 && (numerator.toString().equals("1") || numerator.toString().equals("-1")) == false) || bs.getVariableY().count() == 0) { s += numerator.toString(); } else if (numerator.toString().equals("-1")) { s += "-"; @@ -717,27 +717,27 @@ public class NumeroAvanzatoVec implements Comparable { } // s += "("; } - if (bs.disc.isInteger() && bs.getIncognitex().count() == 0) { + if (bs.disc.isInteger() && bs.getVariableX().count() == 0) { s += "Ⓐ("; s += bs.disc.toString(); s += ")"; - } else if ((bs.disc.toString().equals("1") || bs.disc.toString().equals("-1")) && bs.getIncognitex().count() > 0) { + } else if ((bs.disc.toString().equals("1") || bs.disc.toString().equals("-1")) && bs.getVariableX().count() > 0) { s += "Ⓐ("; if (bs.disc.toString().equals("-1")) { s += "-"; } - s += bs.getIncognitex().toString(); + s += bs.getVariableX().toString(); s += ")"; } else { - s += "Ⓐ(" + bs.disc.toString() + bs.getIncognitex().toString() + ")"; + s += "Ⓐ(" + bs.disc.toString() + bs.getVariableX().toString() + ")"; } - if ((numerator.compareTo(BigInteger.ONE) != 0 || bs.getIncognitey().count() > 0) && (bs.disc.compareTo(BigInteger.ONE) != 0 || bs.getIncognitex().count() > 0)) { - if (((bs.getIncognitey().count() > 0) || (bs.getIncognitey().count() == 0 && numerator.toString().length() > 0))) { - s += bs.getIncognitey().toString(); + if ((numerator.compareTo(BigInteger.ONE) != 0 || bs.getVariableY().count() > 0) && (bs.disc.compareTo(BigInteger.ONE) != 0 || bs.getVariableX().count() > 0)) { + if (((bs.getVariableY().count() > 0) || (bs.getVariableY().count() == 0 && numerator.toString().length() > 0))) { + s += bs.getVariableY().toString(); } // s += "("; } - if ((numerator.compareTo(BigInteger.ONE) != 0 || bs.getIncognitey().count() > 0) && (bs.disc.compareTo(BigInteger.ONE) != 0 || bs.getIncognitex().count() > 0)) { + if ((numerator.compareTo(BigInteger.ONE) != 0 || bs.getVariableY().count() > 0) && (bs.disc.compareTo(BigInteger.ONE) != 0 || bs.getVariableX().count() > 0)) { // s += ")"; } } diff --git a/src/org/nevec/rjm/RatPoly.java b/src/org/nevec/rjm/RatPoly.java index 9c86297f..60f77d3b 100644 --- a/src/org/nevec/rjm/RatPoly.java +++ b/src/org/nevec/rjm/RatPoly.java @@ -7,7 +7,7 @@ import java.util.Random; import java.util.Scanner; import java.util.Vector; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; /** * A one-parameter polynomial with rational coefficients. @@ -75,10 +75,10 @@ class RatPoly { * the list of values in the denominator of AFB * @param nmax * the order of the truncated polynomial representation - * @throws Errore + * @throws Error * @since 2008-11-13 */ - public RatPoly(final Vector A, final Vector B, int nmax) throws Errore { + public RatPoly(final Vector A, final Vector B, int nmax) throws Error { /* * To allow common initialization with the signature below, * the main body is assembled in a separate function. @@ -96,10 +96,10 @@ class RatPoly { * the order of the new polynomial. * @param B * the list of values in the denominator of AFB - * @throws Errore + * @throws Error * @since 2009-08-05 */ - public RatPoly(final Vector A, final Vector B) throws Errore { + public RatPoly(final Vector A, final Vector B) throws Error { BigInteger Nmax = BigInteger.ONE.negate(); for (int j = 0; j < A.size(); j++) { if (A.elementAt(j).compareTo(BigInteger.ZERO) <= 0) { @@ -125,10 +125,10 @@ class RatPoly { * the list of values in the denominator of AFB * @param nmax * the order of the truncated polynomial representation - * @throws Errore + * @throws Error * @since 2008-11-13 */ - protected void init(final Vector A, final Vector B, int nmax) throws Errore { + protected void init(final Vector A, final Vector B, int nmax) throws Error { a = new Vector(); Factorial f = new Factorial(); for (int n = 0; n <= nmax; n++) { @@ -433,10 +433,10 @@ class RatPoly { * @param r * the exponent of the power * @return This^r . - * @throws Errore + * @throws Error * @since 2009-05-18 */ - public RatPoly pow(final Rational r) throws ArithmeticException, Errore { + public RatPoly pow(final Rational r) throws ArithmeticException, Error { /* * split (a0+a1*x+a2*x^2+...)^r = a0^r*(1+a1/a0*r+a2/a0*r^2+..)^r */ @@ -520,10 +520,10 @@ class RatPoly { * @param val * the constant through which the coefficients will be divided. * @return the Taylor expansion of this/val . - * @throws Errore + * @throws Error * @since 2009-05-18 */ - public RatPoly divide(final Rational val) throws Errore { + public RatPoly divide(final Rational val) throws Error { if (val.compareTo(Rational.ZERO) != 0) { RatPoly resul = new RatPoly(); for (int n = 0; n < a.size(); n++) @@ -541,9 +541,9 @@ class RatPoly { * @param nmax * the maximum degree of the Taylor expansion of the result. * @return the Taylor expansion of this/val up to degree nmax. - * @throws Errore + * @throws Error */ - public RatPoly divide(final RatPoly val, int nmax) throws Errore { + public RatPoly divide(final RatPoly val, int nmax) throws Error { RatPoly num = this; RatPoly denom = val; @@ -583,10 +583,10 @@ class RatPoly { * difference of thisdegree and the degree of val. [1] the remainder * polynomial. * This = returnvalue[0] + returnvalue[1]/val . - * @throws Errore + * @throws Error * @since 2012-03-01 */ - public RatPoly[] divideAndRemainder(final RatPoly val) throws Errore { + public RatPoly[] divideAndRemainder(final RatPoly val) throws Error { RatPoly[] ret = new RatPoly[2]; /* * remove any high-order zeros @@ -738,10 +738,10 @@ class RatPoly { * degree is unity. * * @return The scaled polynomial - * @throws Errore + * @throws Error * @since 2008-10-26 */ - public RatPoly monic() throws Errore { + public RatPoly monic() throws Error { RatPoly m = new RatPoly(); final int d = degree(); for (int i = 0; i <= d; i++) { @@ -879,10 +879,10 @@ class RatPoly { * Kerner method * @param the * number of floating point digits - * @throws Errore + * @throws Error * @since 2008-10-26 */ - public Vector roots(int digits) throws Errore { + public Vector roots(int digits) throws Error { RatPoly mon = monic(); Random rand = new Random(); diff --git a/src/org/nevec/rjm/Rational.java b/src/org/nevec/rjm/Rational.java index 0ddc0a86..26ae7e96 100644 --- a/src/org/nevec/rjm/Rational.java +++ b/src/org/nevec/rjm/Rational.java @@ -5,8 +5,8 @@ import java.math.BigInteger; import java.math.MathContext; import java.math.RoundingMode; -import org.warp.picalculator.Errore; -import org.warp.picalculator.Errori; +import org.warp.picalculator.Error; +import org.warp.picalculator.Errors; /** * Fractions (rational numbers). They are divisions of two BigInteger numbers, @@ -232,15 +232,15 @@ public class Rational implements Cloneable, Comparable { * the exponent. * @return this value raised to the power given by the exponent. If the * exponent is 0, the value 1 is returned. - * @throws Errore + * @throws Error * @since 2009-05-18 */ - public Rational pow(BigInteger exponent) throws Errore { + public Rational pow(BigInteger exponent) throws Error { /* test for overflow */ if (exponent.compareTo(MAX_INT) == 1) - throw new Errore(Errori.NUMBER_TOO_LARGE); + throw new Error(Errors.NUMBER_TOO_LARGE); if (exponent.compareTo(MIN_INT) == -1) - throw new Errore(Errori.NUMBER_TOO_SMALL); + throw new Error(Errors.NUMBER_TOO_SMALL); /* promote to the simpler interface above */ return pow(exponent.intValue()); @@ -254,20 +254,20 @@ public class Rational implements Cloneable, Comparable { * third root etc * @return this value raised to the inverse power given by the root * argument, this^(1/r). - * @throws Errore + * @throws Error * @since 2009-05-18 */ - public Rational root(BigInteger r) throws Errore { + public Rational root(BigInteger r) throws Error { /* test for overflow */ if (r.compareTo(MAX_INT) == 1) - throw new Errore(Errori.NUMBER_TOO_LARGE); + throw new Error(Errors.NUMBER_TOO_LARGE); if (r.compareTo(MIN_INT) == -1) - throw new Errore(Errori.NUMBER_TOO_SMALL); + throw new Error(Errors.NUMBER_TOO_SMALL); int rthroot = r.intValue(); /* cannot pull root of a negative value with even-valued root */ if (compareTo(ZERO) == -1 && (rthroot % 2) == 0) - throw new Errore(Errori.NEGATIVE_PARAMETER); + throw new Error(Errors.NEGATIVE_PARAMETER); /* * extract a sign such that we calculate |n|^(1/r), still r carrying any @@ -294,10 +294,10 @@ public class Rational implements Cloneable, Comparable { * The exponent. * @return This value raised to the power given by the exponent. If the * exponent is 0, the value 1 is returned. - * @throws Errore + * @throws Error * @since 2009-05-18 */ - public Rational pow(Rational exponent) throws Errore { + public Rational pow(Rational exponent) throws Error { if (exponent.a.compareTo(BigInteger.ZERO) == 0) return new Rational(1, 1); @@ -315,11 +315,11 @@ public class Rational implements Cloneable, Comparable { * @param val * A second rational number. * @return The value of this/val - * @throws Errore + * @throws Error */ - public Rational divide(final Rational val) throws Errore { + public Rational divide(final Rational val) throws Error { if (val.compareTo(Rational.ZERO) == 0) - throw new Errore(Errori.DIVISION_BY_ZERO); + throw new Error(Errors.DIVISION_BY_ZERO); BigInteger num = a.multiply(val.b); BigInteger deno = b.multiply(val.a); /* @@ -335,11 +335,11 @@ public class Rational implements Cloneable, Comparable { * @param val * a second number. * @return the value of this/val - * @throws Errore + * @throws Error */ - public Rational divide(BigInteger val) throws Errore { + public Rational divide(BigInteger val) throws Error { if (val.compareTo(BigInteger.ZERO) == 0) - throw new Errore(Errori.DIVISION_BY_ZERO); + throw new Error(Errors.DIVISION_BY_ZERO); Rational val2 = new Rational(val, BigInteger.ONE); return (divide(val2)); } /* Rational.divide */ @@ -350,11 +350,11 @@ public class Rational implements Cloneable, Comparable { * @param val * A second number. * @return The value of this/val - * @throws Errore + * @throws Error */ - public Rational divide(int val) throws Errore { + public Rational divide(int val) throws Error { if (val == 0) - throw new Errore(Errori.DIVISION_BY_ZERO); + throw new Error(Errors.DIVISION_BY_ZERO); Rational val2 = new Rational(val, 1); return (divide(val2)); } /* Rational.divide */ @@ -452,9 +452,9 @@ public class Rational implements Cloneable, Comparable { * @return the binomial coefficient. * @since 2006-06-27 * @author Richard J. Mathar - * @throws Errore + * @throws Error */ - public static Rational binomial(Rational n, BigInteger m) throws Errore { + public static Rational binomial(Rational n, BigInteger m) throws Error { if (m.compareTo(BigInteger.ZERO) == 0) return Rational.ONE; Rational bin = n; @@ -474,9 +474,9 @@ public class Rational implements Cloneable, Comparable { * @return the binomial coefficient. * @since 2009-05-19 * @author Richard J. Mathar - * @throws Errore + * @throws Error */ - public static Rational binomial(Rational n, int m) throws Errore { + public static Rational binomial(Rational n, int m) throws Error { if (m == 0) return Rational.ONE; Rational bin = n; @@ -496,13 +496,13 @@ public class Rational implements Cloneable, Comparable { * @return Gamma(n+k+1/2)/k!/GAMMA(n-k+1/2) * @since 2010-07-18 * @author Richard J. Mathar - * @throws Errore + * @throws Error */ - public static Rational hankelSymb(Rational n, int k) throws Errore { + public static Rational hankelSymb(Rational n, int k) throws Error { if (k == 0) return Rational.ONE; else if (k < 0) - throw new Errore(Errori.NEGATIVE_PARAMETER); + throw new Error(Errors.NEGATIVE_PARAMETER); Rational nkhalf = n.subtract(k).add(Rational.HALF); nkhalf = nkhalf.Pochhammer(2 * k); Factorial f = new Factorial(); @@ -792,26 +792,26 @@ public class Rational implements Cloneable, Comparable { /** * Conversion to an integer value, if this can be done exactly. * - * @throws Errore + * @throws Error * * @since 2011-02-13 */ - int intValue() throws Errore { + int intValue() throws Error { if (!isInteger()) - throw new Errore(Errori.CONVERSION_ERROR); + throw new Error(Errors.CONVERSION_ERROR); return a.intValue(); } /** * Conversion to a BigInteger value, if this can be done exactly. * - * @throws Errore + * @throws Error * * @since 2012-03-02 */ - BigInteger BigIntegerValue() throws Errore { + BigInteger BigIntegerValue() throws Error { if (!isBigInteger()) - throw new Errore(Errori.CONVERSION_ERROR); + throw new Error(Errors.CONVERSION_ERROR); return a; } diff --git a/src/org/nevec/rjm/Wigner3j.java b/src/org/nevec/rjm/Wigner3j.java index 17c18dac..4173e81e 100644 --- a/src/org/nevec/rjm/Wigner3j.java +++ b/src/org/nevec/rjm/Wigner3j.java @@ -3,7 +3,7 @@ package org.nevec.rjm; import java.math.BigInteger; import java.util.Scanner; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; /** * Exact representations of Wigner 3jm and 3nj values of half-integer arguments. @@ -32,9 +32,9 @@ public class Wigner3j { * * @since 2011-02-15 * @author Richard J. Mathar - * @throws Errore + * @throws Error */ - static public void main(String args[]) throws Errore { + static public void main(String args[]) throws Error { if (args[0].compareTo("6j") == 0) { try { String m1 = "6"; @@ -105,9 +105,9 @@ public class Wigner3j { * inequalities is violated or some parameters are out of range. * @since 2011-02-13 * @author Richard J. Mathar - * @throws Errore + * @throws Error */ - static public BigSurd wigner3jm(int j1, int j2, int j3, int m1, int m2, int m3) throws Errore { + static public BigSurd wigner3jm(int j1, int j2, int j3, int m1, int m2, int m3) throws Error { Rational J1 = new Rational(j1, 2); Rational J2 = new Rational(j2, 2); Rational J3 = new Rational(j3, 2); @@ -140,9 +140,9 @@ public class Wigner3j { * @since 2011-02-13 * @since 2012-02-15 Upgraded return value to BigSurdVec * @author Richard J. Mathar - * @throws Errore + * @throws Error */ - static public BigSurdVec wigner3j(String m1, String t1, String t2, String j) throws Errore { + static public BigSurdVec wigner3j(String m1, String t1, String t2, String j) throws Error { /* * The first number in the line "m" is the number of angular momenta. * The rest of the line is ignored. @@ -270,10 +270,10 @@ public class Wigner3j { * @since 2011-02-13 * @since 2012-02-15 Upgraded to return BigSurdVec * @author Richard J. Mathar - * @throws Errore + * @throws Error */ static private BigSurdVec wigner3j(final int[] tvec, final Rational[] J, final Rational[] M, final int[] triadidx) - throws Errore { + throws Error { /* * The result of the computation. The sum over all m-combinations of the * triads. @@ -480,10 +480,10 @@ public class Wigner3j { * inequalities is violated or some parameters are out of range. * @since 2011-02-13 * @author Richard J. Mathar - * @throws Errore + * @throws Error */ static protected BigSurd wigner3jm(Rational j1, Rational j2, Rational j3, Rational m1, Rational m2, Rational m3) - throws Errore { + throws Error { /* * Check that m1+m2+m3 = 0 */ diff --git a/src/org/nevec/rjm/Wigner3jGUI.java b/src/org/nevec/rjm/Wigner3jGUI.java index e6ffea8e..eef42659 100644 --- a/src/org/nevec/rjm/Wigner3jGUI.java +++ b/src/org/nevec/rjm/Wigner3jGUI.java @@ -16,7 +16,7 @@ import javax.swing.JList; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; /** * An interactive interface to the Wigner3j class. The GUI allows to preselect @@ -134,10 +134,10 @@ public class Wigner3jGUI implements ActionListener, ListSelectionListener { } /* init */ /** - * @throws Errore + * @throws Error * @since 2010-08-27 */ - public void compute() throws Errore { + public void compute() throws Error { String tr = inpGtria.getText(); String[] trias = new String[4]; @@ -211,7 +211,7 @@ public class Wigner3jGUI implements ActionListener, ListSelectionListener { outG.setText(""); try { compute(); - } catch (Errore e1) { + } catch (Error e1) { // TODO Auto-generated catch block e1.printStackTrace(); } diff --git a/src/org/warp/device/Keyboard.java b/src/org/warp/device/Keyboard.java index e75a3b63..1228d323 100644 --- a/src/org/warp/device/Keyboard.java +++ b/src/org/warp/device/Keyboard.java @@ -25,7 +25,8 @@ public class Keyboard { private static final int QH_pin = 40; private static final int CLK_INH_pin = 33; - private static boolean[][] precedentStates = new boolean[8][8]; + private static volatile boolean[][] precedentStates = new boolean[8][8]; + public static volatile boolean[][] debugKeysDown = new boolean[8][8]; public static void startKeyboard() { if (Utils.debugOn == false) { @@ -75,7 +76,11 @@ public class Keyboard { } public static boolean isKeyDown(int row, int col) { - return precedentStates[row][col]; + if (Utils.debugOn == false) { + return precedentStates[row-1][col-1]; + } else { + return debugKeysDown[row-1][col-1]; + } } private static void keyReleasedRaw(int row, int col) { @@ -84,7 +89,7 @@ public class Keyboard { } } - private static void keyPressedRaw(int row, int col) { + static void keyPressedRaw(int row, int col) { if (row == 1 && col == 1) { keyPressed(Key.SHIFT); } else if (row == 1 && col == 2) { diff --git a/src/org/warp/device/PIDisplay.java b/src/org/warp/device/PIDisplay.java index f647878f..8c19163e 100644 --- a/src/org/warp/device/PIDisplay.java +++ b/src/org/warp/device/PIDisplay.java @@ -1,15 +1,6 @@ package org.warp.device; -import static org.warp.engine.Display.Render.getMatrixOfImage; -import static org.warp.engine.Display.Render.glClear; -import static org.warp.engine.Display.Render.glColor3f; -import static org.warp.engine.Display.Render.glColor4f; -import static org.warp.engine.Display.Render.glDrawLine; -import static org.warp.engine.Display.Render.glDrawSkin; -import static org.warp.engine.Display.Render.glDrawStringCenter; -import static org.warp.engine.Display.Render.glDrawStringLeft; -import static org.warp.engine.Display.Render.glDrawStringRight; -import static org.warp.engine.Display.Render.setFont; +import static org.warp.engine.Display.Render.*; import java.awt.image.BufferedImage; import java.io.IOException; @@ -203,6 +194,8 @@ public final class PIDisplay { } private void draw_status() { + glColor3f(204, 231, 212); + glFillRect(0, 0, Main.screenSize[0], 20); glColor3f(0, 0, 0); glDrawLine(0, 20, Main.screenSize[0]-1, 20); glColor3f(0, 0, 0); @@ -317,8 +310,8 @@ public final class PIDisplay { colore(0.0f, 0.0f, 0.0f, 0.5f); glDrawStringCenter((Main.screenSize[0] / 2), (Main.screenSize[1]/ 2) + 22, "PLEASE WAIT..."); } else { - draw_status(); draw_screen(); + draw_status(); draw_bottom(); } } diff --git a/src/org/warp/device/PIFrame.java b/src/org/warp/device/PIFrame.java index f4575533..c8305040 100644 --- a/src/org/warp/device/PIFrame.java +++ b/src/org/warp/device/PIFrame.java @@ -103,6 +103,9 @@ public class PIFrame extends JFrame { } else { Keyboard.keyPressed(Key.NONE); } + int row = 2; + int col = 1; + Keyboard.debugKeysDown[row-1][col-1] = true; break; case KeyEvent.VK_1: if (!Keyboard.shift && !Keyboard.alpha) { @@ -223,6 +226,10 @@ public class PIFrame extends JFrame { } break; case KeyEvent.VK_LEFT: + //LEFT + row = 2; + col = 3; + Keyboard.debugKeysDown[row-1][col-1] = true; if (!Keyboard.shift && !Keyboard.alpha) { Keyboard.keyPressed(Key.LEFT); } else { @@ -230,6 +237,10 @@ public class PIFrame extends JFrame { } break; case KeyEvent.VK_RIGHT: + //RIGHT + row = 2; + col = 5; + Keyboard.debugKeysDown[row-1][col-1] = true; if (!Keyboard.shift && !Keyboard.alpha) { Keyboard.keyPressed(Key.RIGHT); } else { @@ -315,6 +326,9 @@ public class PIFrame extends JFrame { } else { Keyboard.keyReleased(Key.NONE); } + int row = 2; + int col = 1; + Keyboard.debugKeysDown[row-1][col-1] = false; break; case KeyEvent.VK_1: if (!Keyboard.shift && !Keyboard.alpha) { @@ -357,6 +371,16 @@ public class PIFrame extends JFrame { case KeyEvent.VK_A: Keyboard.keyReleased(Key.ALPHA); break; + case KeyEvent.VK_LEFT: + //LEFT + row = 2; + col = 3; + Keyboard.debugKeysDown[row-1][col-1] = false; + case KeyEvent.VK_RIGHT: + //RIGHT + row = 2; + col = 5; + Keyboard.debugKeysDown[row-1][col-1] = false; } } diff --git a/src/org/warp/engine/Display.java b/src/org/warp/engine/Display.java index e0afd8b8..24f7543d 100644 --- a/src/org/warp/engine/Display.java +++ b/src/org/warp/engine/Display.java @@ -147,22 +147,56 @@ public class Display { public static void glDrawSkin(int skinwidth, int[] skin, int x0, int y0, int s0, int t0, int s1, int t1, boolean transparent) { x0+=Main.screenPos[0]; y0+=Main.screenPos[1]; + int oldColor; + int newColor; + int onex = s0 <= s1?1:-1; + int oney = t0 <= t1?1:-1; + int width = 0; + int height = 0; + if (onex == -1) { + int s00 = s0; + s0 = s1; + s1 = s00; + width = s1-s0; + } + if (oney == -1) { + int t00 = t0; + t0 = t1; + t1 = t00; + height = t1-t0; + } if (x0 >= size[0] || y0 >= size[0]) { return; } - if (x0 + (s1-s0) >= size[0]) { + if (x0 + width >= size[0]) { s1 = size[0] - x0 + s0; } - if (y0 + (t1-t0) >= size[1]) { + if (y0 + height >= size[1]) { t1 = size[1] - y0 + t0; } - int oldColor; - int newColor; + if (x0 < 0) { + if (onex == -1) { + width += x0; + s1 += x0 + 1; + } else { + s0 -= x0; + } + x0 = 0; + } + if (y0 < 0) { + if (oney == -1) { + height += y0; + t1 += y0 + 1; + } else { + t0 -= y0; + } + y0 = 0; + } for (int texx = 0; texx < s1 - s0; texx++) { for (int texy = 0; texy < t1 - t0; texy++) { newColor = skin[(s0 + texx) + (t0 + texy) * skinwidth]; if (transparent) { - oldColor = canvas2d[(x0 + texx) + (y0 + texy) * size[0]]; + oldColor = canvas2d[(x0 + texx*onex + width) + (y0 + texy*oney + height) * size[0]]; float a2 = ((float)(newColor >> 24 & 0xFF)) / 255f; float a1 = 1f-a2; int r = (int) ((oldColor >> 16 & 0xFF) * a1 + (newColor >> 16 & 0xFF) * a2); @@ -170,7 +204,7 @@ public class Display { int b = (int) ((oldColor & 0xFF) * a1 + (newColor & 0xFF) * a2); newColor = 0xFF000000 | r << 16 | g << 8 | b; } - canvas2d[(x0 + texx) + (y0 + texy) * size[0]] = newColor; + canvas2d[(x0 + texx*onex + width) + (y0 + texy*oney + height) * size[0]] = newColor; } } } diff --git a/src/org/warp/picalculator/FunzioneAnteriore.java b/src/org/warp/picalculator/AnteriorFunction.java similarity index 66% rename from src/org/warp/picalculator/FunzioneAnteriore.java rename to src/org/warp/picalculator/AnteriorFunction.java index 6171a20d..d9f3c1ba 100644 --- a/src/org/warp/picalculator/FunzioneAnteriore.java +++ b/src/org/warp/picalculator/AnteriorFunction.java @@ -9,37 +9,37 @@ import org.warp.engine.Display; import com.rits.cloning.Cloner; -public abstract class FunzioneAnteriore implements Funzione { - public FunzioneAnteriore(Funzione value) { +public abstract class AnteriorFunction implements Function { + public AnteriorFunction(Function value) { setVariable(value); } - protected Funzione variable = new Termine(NumeroAvanzatoVec.ZERO); + protected Function variable = new Number(NumeroAvanzatoVec.ZERO); protected int width; protected int height; protected int line; protected boolean small; - public Funzione getVariable() { + public Function getVariable() { return variable; } - public void setVariable(Funzione value) { + public void setVariable(Function value) { variable = value; } @Override - public abstract String simbolo(); + public abstract String getSymbol(); @Override - public abstract Funzione calcola() throws Errore; + public abstract Function solve() throws Error; @Override - public void calcolaGrafica() { + public void generateGraphics() { variable.setSmall(small); - variable.calcolaGrafica(); + variable.generateGraphics(); - width = getStringWidth(simbolo()) + 1 + getVariable().getWidth(); + width = getStringWidth(getSymbol()) + 1 + getVariable().getWidth(); height = variable.getHeight(); line = variable.getLine(); } @@ -47,7 +47,7 @@ public abstract class FunzioneAnteriore implements Funzione { @Override public void draw(int x, int y) { float h1 = getVariable().getHeight(); - int wsegno = getStringWidth(simbolo()); + int wsegno = getStringWidth(getSymbol()); float hsegno = Utils.getFontHeight(small); float maxh = getHeight(); if (small) { @@ -56,7 +56,7 @@ public abstract class FunzioneAnteriore implements Funzione { Display.Render.setFont(PIDisplay.fonts[0]); } - glDrawStringLeft(x, (int) Math.floor(y + (maxh - hsegno) / 2), simbolo()); + glDrawStringLeft(x, (int) Math.floor(y + (maxh - hsegno) / 2), getSymbol()); getVariable().draw(x + wsegno + 1, (int) Math.floor(y + (maxh - h1) / 2)); } @@ -78,14 +78,14 @@ public abstract class FunzioneAnteriore implements Funzione { @Override public String toString() { try { - return calcola().toString(); - } catch (Errore e) { + return solve().toString(); + } catch (Error e) { return e.id.toString(); } } @Override - public FunzioneAnteriore clone() { + public AnteriorFunction clone() { Cloner cloner = new Cloner(); return cloner.deepClone(this); } diff --git a/src/org/warp/picalculator/FunzioneAnterioreBase.java b/src/org/warp/picalculator/AnteriorFunctionBase.java similarity index 66% rename from src/org/warp/picalculator/FunzioneAnterioreBase.java rename to src/org/warp/picalculator/AnteriorFunctionBase.java index 44076f0a..b0600b05 100644 --- a/src/org/warp/picalculator/FunzioneAnterioreBase.java +++ b/src/org/warp/picalculator/AnteriorFunctionBase.java @@ -9,37 +9,37 @@ import org.warp.engine.Display; import com.rits.cloning.Cloner; -public abstract class FunzioneAnterioreBase extends FunzioneBase { - public FunzioneAnterioreBase(FunzioneBase value) { +public abstract class AnteriorFunctionBase extends FunctionBase { + public AnteriorFunctionBase(FunctionBase value) { setVariable(value); } - protected FunzioneBase variable = new Termine(NumeroAvanzatoVec.ZERO); + protected FunctionBase variable = new Number(NumeroAvanzatoVec.ZERO); protected int width; protected int height; protected int line; protected boolean small; - public FunzioneBase getVariable() { + public FunctionBase getVariable() { return variable; } - public void setVariable(FunzioneBase value) { + public void setVariable(FunctionBase value) { variable = value; } @Override - public abstract String simbolo(); + public abstract String getSymbol(); @Override - public abstract Termine calcola() throws Errore; + public abstract Number solve() throws Error; @Override - public void calcolaGrafica() { + public void generateGraphics() { variable.setSmall(small); - variable.calcolaGrafica(); + variable.generateGraphics(); - width = getStringWidth(simbolo()) + 1 + getVariable().getWidth(); + width = getStringWidth(getSymbol()) + 1 + getVariable().getWidth(); height = variable.getHeight(); line = variable.getLine(); } @@ -47,7 +47,7 @@ public abstract class FunzioneAnterioreBase extends FunzioneBase { @Override public void draw(int x, int y) { float h1 = getVariable().getHeight(); - int wsegno = getStringWidth(simbolo()); + int wsegno = getStringWidth(getSymbol()); float hsegno = Utils.getFontHeight(small); float maxh = getHeight(); if (small) { @@ -56,7 +56,7 @@ public abstract class FunzioneAnterioreBase extends FunzioneBase { Display.Render.setFont(PIDisplay.fonts[0]); } - glDrawStringLeft(x, (int) Math.floor(y + (maxh - hsegno) / 2), simbolo()); + glDrawStringLeft(x, (int) Math.floor(y + (maxh - hsegno) / 2), getSymbol()); getVariable().draw(x + wsegno + 1, (int) Math.floor(y + (maxh - h1) / 2)); } @@ -78,14 +78,14 @@ public abstract class FunzioneAnterioreBase extends FunzioneBase { @Override public String toString() { try { - return calcola().toString(); - } catch (Errore e) { + return solve().toString(); + } catch (Error e) { return e.id.toString(); } } @Override - public FunzioneAnterioreBase clone() { + public AnteriorFunctionBase clone() { Cloner cloner = new Cloner(); return cloner.deepClone(this); } diff --git a/src/org/warp/picalculator/Calculator.java b/src/org/warp/picalculator/Calculator.java index e3b34952..94528221 100644 --- a/src/org/warp/picalculator/Calculator.java +++ b/src/org/warp/picalculator/Calculator.java @@ -13,61 +13,61 @@ public class Calculator { public static int currentSession = 0; public static boolean haxMode = true; - public static Termine calcolarisultato(String string) throws Errore { + public static Number solveResult(String string) throws Error { System.out.println("INPUT: " + string); - Espressione espressione = new Espressione(string); - return espressione.calcola(); + Expression expression = new Expression(string); + return expression.solve(); } - public static Funzione interpreta(String string) throws Errore { + public static Function parseString(String string) throws Error { if (string.contains("{")) { if (!string.startsWith("{")) { - throw new Errore(Errori.SYNTAX_ERROR); + throw new Error(Errors.SYNTAX_ERROR); } String[] parts = string.substring(1).split("\\{"); - Sistema s = new Sistema(); + EquationsSystem s = new EquationsSystem(); for (String part : parts) { - s.addVariableToEnd(interpretaEquazione(part)); + s.addVariableToEnd(parseEquationString(part)); } return s; } else if (string.contains("=")) { - return interpretaEquazione(string); + return parseEquationString(string); } else { - return new Espressione(string); + return new Expression(string); } } - public static Funzione interpretaEquazione(String string) throws Errore { + public static Function parseEquationString(String string) throws Error { String[] parts = string.split("="); if (parts.length == 1) { - return new Equazione(new Espressione(parts[0]), new Termine(NumeroAvanzato.ZERO)); + return new Equation(new Expression(parts[0]), new Number(NumeroAvanzato.ZERO)); } else if (parts.length == 2) { - return new Equazione(new Espressione(parts[0]), new Espressione(parts[1])); + return new Equation(new Expression(parts[0]), new Expression(parts[1])); } else { - throw new Errore(Errori.SYNTAX_ERROR); + throw new Error(Errors.SYNTAX_ERROR); } } - public static void solve() throws Errore { + public static void solve() throws Error { if (Calculator.currentSession == 0 && Calculator.sessions[0] instanceof EquationScreen) { EquationScreen es = (EquationScreen) Calculator.sessions[0]; - Funzione f = es.f; - if (f instanceof Equazione) { + Function f = es.f; + if (f instanceof Equation) { PIDisplay.INSTANCE.setScreen(new SolveEquationScreen(es)); } else { - es.f2 = es.f.calcola(); - es.f2.calcolaGrafica(); + es.f2 = es.f.solve(); + es.f2.generateGraphics(); } } } - public static void solve(char letter) throws Errore { + public static void solve(char letter) throws Error { if (Calculator.currentSession == 0 && Calculator.sessions[0] instanceof EquationScreen) { EquationScreen es = (EquationScreen) Calculator.sessions[0]; - Funzione f = es.f; - if (f instanceof Equazione) { - es.f2 = ((Equazione)f).calcola(letter); - es.f2.calcolaGrafica(); + Function f = es.f; + if (f instanceof Equation) { + es.f2 = ((Equation)f).solve(letter); + es.f2.generateGraphics(); } } } diff --git a/src/org/warp/picalculator/Divisione.java b/src/org/warp/picalculator/Division.java similarity index 69% rename from src/org/warp/picalculator/Divisione.java rename to src/org/warp/picalculator/Division.java index 8a90e98f..76ca9ed5 100644 --- a/src/org/warp/picalculator/Divisione.java +++ b/src/org/warp/picalculator/Division.java @@ -9,26 +9,26 @@ import org.nevec.rjm.NumeroAvanzatoVec; import org.warp.device.PIDisplay; import org.warp.engine.Display; -public class Divisione extends FunzioneDueValoriBase { +public class Division extends FunctionTwoValuesBase { - public Divisione(FunzioneBase value1, FunzioneBase value2) { + public Division(FunctionBase value1, FunctionBase value2) { super(value1, value2); } @Override - public String simbolo() { - return Simboli.DIVISION; + public String getSymbol() { + return MathematicalSymbols.DIVISION; } @Override - public Termine calcola() throws Errore { + public Number solve() throws Error { if (variable2 == null || variable1 == null) { - return new Termine("0"); + return new Number("0"); } - if (variable2.calcola().getTerm().compareTo(NumeroAvanzatoVec.ZERO) == 0) { - throw new Errore(Errori.DIVISION_BY_ZERO); + if (variable2.solve().getTerm().compareTo(NumeroAvanzatoVec.ZERO) == 0) { + throw new Error(Errors.DIVISION_BY_ZERO); } - return variable1.calcola().divide(variable2.calcola()); + return variable1.solve().divide(variable2.solve()); } public boolean hasMinus() { @@ -49,12 +49,12 @@ public class Divisione extends FunzioneDueValoriBase { private boolean drawMinus = true; @Override - public void calcolaGrafica() { + public void generateGraphics() { variable1.setSmall(true); - variable1.calcolaGrafica(); + variable1.generateGraphics(); variable2.setSmall(true); - variable2.calcolaGrafica(); + variable2.generateGraphics(); width = calcWidth(); height = calcHeight(); @@ -72,8 +72,8 @@ public class Divisione extends FunzioneDueValoriBase { boolean minus = false; int minusw = 0; int minush = 0; - String numerator = ((Funzione) var1).toString(); - if (numerator.startsWith("-") && ((Funzione) var1) instanceof Termine && ((Termine) var1).term.isBigInteger(true)) { + String numerator = ((Function) var1).toString(); + if (numerator.startsWith("-") && ((Function) var1) instanceof Number && ((Number) var1).term.isBigInteger(true)) { minus = true; numerator = numerator.substring(1); } @@ -83,10 +83,10 @@ public class Divisione extends FunzioneDueValoriBase { w1 = getStringWidth(numerator); h1 = Utils.getFontHeight(small); } else { - w1 = ((Funzione) var1).getWidth(); - h1 = ((Funzione) var1).getHeight(); + w1 = ((Function) var1).getWidth(); + h1 = ((Function) var1).getHeight(); } - int w2 = ((Funzione) var2).getWidth(); + int w2 = ((Function) var2).getWidth(); int maxw; if (w1 > w2) { maxw = 1 + w1; @@ -104,9 +104,9 @@ public class Divisione extends FunzioneDueValoriBase { glDrawStringLeft(x+1, y + h1 + 1 + 1 - (minush / 2), "-"); glDrawStringLeft((int) (x+1 + minusw + 1 + (maxw - w1) / 2d), y, numerator); } else { - ((Funzione) var1).draw((int) (x+1 + minusw + (maxw - w1) / 2d), y); + ((Function) var1).draw((int) (x+1 + minusw + (maxw - w1) / 2d), y); } - ((Funzione) var2).draw((int) (x+1 + minusw + (maxw - w2) / 2d), y + h1 + 1 + 1 + 1); + ((Function) var2).draw((int) (x+1 + minusw + (maxw - w2) / 2d), y + h1 + 1 + 1 + 1); glColor3f(0, 0, 0); glFillRect(x+1+ minusw, y + h1 + 1, maxw, 1); } @@ -121,7 +121,7 @@ public class Divisione extends FunzioneDueValoriBase { boolean minus = false; String numerator = variable1.toString(); - if (numerator.startsWith("-") && variable1 instanceof Termine && ((Termine) variable1).term.isBigInteger(true)) { + if (numerator.startsWith("-") && variable1 instanceof Number && ((Number) variable1).term.isBigInteger(true)) { minus = true; numerator = numerator.substring(1); } @@ -149,7 +149,7 @@ public class Divisione extends FunzioneDueValoriBase { protected int calcWidth() { boolean minus = false; String numerator = variable1.toString(); - if (numerator.startsWith("-") && variable1 instanceof Termine && ((Termine) variable1).term.isBigInteger(true)) { + if (numerator.startsWith("-") && variable1 instanceof Number && ((Number) variable1).term.isBigInteger(true)) { minus = true; numerator = numerator.substring(1); } diff --git a/src/org/warp/picalculator/Equation.java b/src/org/warp/picalculator/Equation.java new file mode 100644 index 00000000..ecc2b676 --- /dev/null +++ b/src/org/warp/picalculator/Equation.java @@ -0,0 +1,59 @@ +package org.warp.picalculator; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +import com.rits.cloning.Cloner; + +public class Equation extends FunctionTwoValues { + + public Equation(Function value1, Function value2) { + super(value1,value2); + } + + @Override + public String getSymbol() { + return MathematicalSymbols.EQUATION; + } + + @Override + public Function solve() throws Error { + return new Equation(new Subtraction((FunctionBase)variable1.solve(), (FunctionBase)variable2.solve()).solve(), new Number("0")); + } + + public Function solve(char variableCharacter) { + @SuppressWarnings("unused") + ArrayList e; + //TODO: WORK IN PROGRESS. + //TODO: Finire. Fare in modo che risolva i passaggi fino a che non ce ne sono più + return null; + } + + //WORK IN PROGRESS + public ArrayList solveStep(char charIncognita) { + ArrayList result = new ArrayList(); + result.add(this.clone()); + for (SolveMethod t : SolveMethod.techniques) { + ArrayList newResults = new ArrayList(); + final int sz = result.size(); + for (int n = 0; n < sz; n++) { + newResults.addAll(t.solve(result.get(n))); + } + Set hs = new HashSet<>(); + hs.addAll(newResults); + newResults.clear(); + newResults.addAll(hs); + result = newResults; + } + // TODO: controllare se è a posto + return result; + } + + @Override + public Equation clone() { + Cloner cloner = new Cloner(); + return cloner.deepClone(this); + } + +} \ No newline at end of file diff --git a/src/org/warp/picalculator/EquationResult.java b/src/org/warp/picalculator/EquationResult.java new file mode 100644 index 00000000..c55f5cfa --- /dev/null +++ b/src/org/warp/picalculator/EquationResult.java @@ -0,0 +1,13 @@ +package org.warp.picalculator; + +import java.math.BigInteger; + +public class EquationResult { + public boolean isAnEquation = false; + public Number LR = new Number(new BigInteger("0")); + + public EquationResult(Number LR, boolean isAnEquation) { + this.LR = LR; + this.isAnEquation = isAnEquation; + } +} diff --git a/src/org/warp/picalculator/EquationsSystem.java b/src/org/warp/picalculator/EquationsSystem.java new file mode 100644 index 00000000..b981925b --- /dev/null +++ b/src/org/warp/picalculator/EquationsSystem.java @@ -0,0 +1,92 @@ +package org.warp.picalculator; + +import static org.warp.engine.Display.Render.glDrawLine; + +public class EquationsSystem extends FunctionMultipleValues { + static final int spacing = 2; + + public EquationsSystem() { + super(); + } + + public EquationsSystem(Function value) { + super(new Function[]{value}); + } + + public EquationsSystem(Function[] value) { + super(value); + } + + @Override + public String getSymbol() { + return null; + } + + @Override + public Function solve() throws NumberFormatException, Error { + // TODO implementare il calcolo dei sistemi + return variables[0].solve(); + } + + @Override + public void generateGraphics() { + for (Function f : variables) { + f.setSmall(false); + f.generateGraphics(); + } + + width = 0; + for (Function f : variables) { + if (f.getWidth() > width) { + width = f.getWidth(); + } + } + width += 5; + + height = 3; + for (Function f : variables) { + height += f.getHeight()+spacing; + } + height = height - spacing + 2; + + line = height/2; + } + + @Override + public void draw(int x, int y) { + + final int h = this.getHeight() - 1; + final int marginTop = 3; + final int marginBottom = (h - 3 - 2) / 2 + marginTop; + final int spazioSopra = h - marginBottom; + int dy = marginTop; + for (Function f : variables) { + f.draw(x + 5, y + dy); + dy+=f.getHeight()+spacing; + } + + + glDrawLine(x + 2, y + 0, x + 3, y + 0); + glDrawLine(x + 1, y + 1, x + 1, y + marginBottom / 2); + glDrawLine(x + 2, y + marginBottom / 2 + 1, x + 2, y + marginBottom - 1); + glDrawLine(x + 0, y + marginBottom, x + 1, y + marginBottom); + glDrawLine(x + 2, y + marginBottom + 1, x + 2, y + marginBottom + spazioSopra / 2 - 1); + glDrawLine(x + 1, y + marginBottom + spazioSopra / 2, x + 1, y + h - 1); + glDrawLine(x + 2, y + h, x + 3, y + h); + } + + @Override + public int getWidth() { + return width; + } + + @Override + public int getHeight() { + return height; + } + + @Override + public int getLine() { + return line; + } +} diff --git a/src/org/warp/picalculator/ParteSistema.java b/src/org/warp/picalculator/EquationsSystemPart.java similarity index 76% rename from src/org/warp/picalculator/ParteSistema.java rename to src/org/warp/picalculator/EquationsSystemPart.java index bd6b2d58..4dfda4c7 100644 --- a/src/org/warp/picalculator/ParteSistema.java +++ b/src/org/warp/picalculator/EquationsSystemPart.java @@ -3,27 +3,27 @@ package org.warp.picalculator; import static org.warp.engine.Display.Render.glColor3f; import static org.warp.engine.Display.Render.glDrawLine; -public class ParteSistema extends FunzioneAnteriore { +public class EquationsSystemPart extends AnteriorFunction { - public ParteSistema(Equazione equazione) { + public EquationsSystemPart(Equation equazione) { super(equazione); } @Override - public String simbolo() { - return Simboli.SYSTEM; + public String getSymbol() { + return MathematicalSymbols.SYSTEM; } @Override - public Equazione calcola() throws NumberFormatException, Errore { + public Equation solve() throws NumberFormatException, Error { // TODO implementare il calcolo dei sistemi - return (Equazione) variable.calcola(); + return (Equation) variable.solve(); } @Override - public void calcolaGrafica() { + public void generateGraphics() { variable.setSmall(false); - variable.calcolaGrafica(); + variable.generateGraphics(); width = 5 + getVariable().getWidth(); height = 3 + getVariable().getHeight() + 2; diff --git a/src/org/warp/picalculator/Equazione.java b/src/org/warp/picalculator/Equazione.java deleted file mode 100644 index be5ac025..00000000 --- a/src/org/warp/picalculator/Equazione.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.warp.picalculator; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; - -import com.rits.cloning.Cloner; - -public class Equazione extends FunzioneDueValori { - - public Equazione(Funzione value1, Funzione value2) { - super(value1,value2); - } - - @Override - public String simbolo() { - return Simboli.EQUATION; - } - - @Override - public Funzione calcola() throws Errore { - return new Equazione(new Sottrazione((FunzioneBase)variable1.calcola(), (FunzioneBase)variable2.calcola()).calcola(), new Termine("0")); - } - - public Funzione calcola(char charIncognita) { - @SuppressWarnings("unused") - ArrayList e; - //TODO: Finire. Fare in modo che risolva i passaggi fino a che non ce ne sono più - return null; - } - - public ArrayList risolviPassaggio(char charIncognita) { - ArrayList result = new ArrayList(); - result.add(this.clone()); - for (Tecnica t : Tecnica.tecniche) { - ArrayList newResults = new ArrayList(); - final int sz = result.size(); - for (int n = 0; n < sz; n++) { - newResults.addAll(t.risolvi(result.get(n))); - } - Set hs = new HashSet<>(); - hs.addAll(newResults); - newResults.clear(); - newResults.addAll(hs); - result = newResults; - } - // TODO: controllare se è a posto - return result; - } - - @Override - public Equazione clone() { - Cloner cloner = new Cloner(); - return cloner.deepClone(this); - } - -} \ No newline at end of file diff --git a/src/org/warp/picalculator/Error.java b/src/org/warp/picalculator/Error.java new file mode 100644 index 00000000..6c9091cf --- /dev/null +++ b/src/org/warp/picalculator/Error.java @@ -0,0 +1,15 @@ +package org.warp.picalculator; + +public class Error extends java.lang.Throwable { + + /** + * + */ + private static final long serialVersionUID = -1014947815755694651L; + + public Error(Errors ErrorID) { + id = ErrorID; + } + + public Errors id = Errors.ERROR; +} diff --git a/src/org/warp/picalculator/Errore.java b/src/org/warp/picalculator/Errore.java deleted file mode 100644 index 46a85a8e..00000000 --- a/src/org/warp/picalculator/Errore.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.warp.picalculator; - -public class Errore extends java.lang.Throwable { - - /** - * - */ - private static final long serialVersionUID = -1014947815755694651L; - - public Errore(Errori IDErrore) { - id = IDErrore; - } - - public Errori id = Errori.ERROR; -} diff --git a/src/org/warp/picalculator/Errori.java b/src/org/warp/picalculator/Errors.java similarity index 88% rename from src/org/warp/picalculator/Errori.java rename to src/org/warp/picalculator/Errors.java index eef61c6b..00b864bd 100644 --- a/src/org/warp/picalculator/Errori.java +++ b/src/org/warp/picalculator/Errors.java @@ -1,5 +1,5 @@ package org.warp.picalculator; -public enum Errori { +public enum Errors { ERROR, DIVISION_BY_ZERO, UNBALANCED_BRACKETS, NOT_IMPLEMENTED, NEGATIVE_PARAMETER, NUMBER_TOO_LARGE, NUMBER_TOO_SMALL, CONVERSION_ERROR, SYNTAX_ERROR, NOT_AN_EQUATION } diff --git a/src/org/warp/picalculator/Espressione.java b/src/org/warp/picalculator/Expression.java similarity index 52% rename from src/org/warp/picalculator/Espressione.java rename to src/org/warp/picalculator/Expression.java index c069cc6a..61b70631 100644 --- a/src/org/warp/picalculator/Espressione.java +++ b/src/org/warp/picalculator/Expression.java @@ -14,30 +14,31 @@ import java.util.regex.Pattern; import org.nevec.rjm.NumeroAvanzato; import org.nevec.rjm.NumeroAvanzatoVec; -public class Espressione extends FunzioneMultiplaBase { +public class Expression extends FunctionMultipleValuesBase { - public Espressione() { + public Expression() { super(); } - public Espressione(FunzioneBase[] values) { + public Expression(FunctionBase[] values) { super(values); } - private boolean parentesiIniziale = false; + private boolean initialParenthesis = false; - public Espressione(String string) throws Errore { + public Expression(String string) throws Error { this(string, "", true); } - public Espressione(String string, String debugSpaces, boolean parentesiIniziale) throws Errore { + public Expression(String string, String debugSpaces, boolean initialParenthesis) throws Error { super(); - this.parentesiIniziale = parentesiIniziale; + this.initialParenthesis = initialParenthesis; boolean isNumber = false; + // Determine if the expression is already a number: // Determina se l'espressione è già un numero: try { - new Termine(string); + new Number(string); isNumber = true; } catch (NumberFormatException ex) { isNumber = false; @@ -47,115 +48,121 @@ public class Espressione extends FunzioneMultiplaBase { Utils.debug.println(debugSpaces + "•Analyzing expression:" + processExpression); if (isNumber){ + // If the expression is already a number: // Se l'espressione è già un numero: - Termine t = new Termine(string); - setVariables(new FunzioneBase[] { t }); + Number t = new Number(string); + setVariables(new FunctionBase[] { t }); Utils.debug.println(debugSpaces + "•Result:" + t.toString()); } else { + // Else prepare the expression: // Altrimenti prepara l'espressione: debugSpaces += " "; + // IF the expression is not a number: // Se l'espressione non è già un numero: - // Controlla se ci sono più di un uguale + // Check if there are more than one equal symbol (=) + // Controlla se ci sono più di un uguale (=) int equationsFound = 0; int systemsFound = 0; for (char c : processExpression.toCharArray()) { - if (("" + c).equals(Simboli.EQUATION)) { + if (("" + c).equals(MathematicalSymbols.EQUATION)) { equationsFound += 1; } - if (("" + c).equals(Simboli.SYSTEM)) { + if (("" + c).equals(MathematicalSymbols.SYSTEM)) { equationsFound += 1; } } if (equationsFound == 1 && systemsFound == 0) { - processExpression = Simboli.SYSTEM + processExpression; + processExpression = MathematicalSymbols.SYSTEM + processExpression; systemsFound += 1; } if (equationsFound != systemsFound) { - throw new Errore(Errori.SYNTAX_ERROR); + throw new Error(Errors.SYNTAX_ERROR); } + //Solve the exceeding symbols ++ and -- // Correggi i segni ++ e -- in eccesso Pattern pattern = Pattern.compile("\\+\\++?|\\-\\-+?"); Matcher matcher = pattern.matcher(processExpression); - boolean cambiati = false; + boolean symbolsChanged = false; while (matcher.find()) { - cambiati = true; + symbolsChanged = true; String correzione = "+"; processExpression = processExpression.substring(0, matcher.start(0) + 1) + correzione + processExpression.substring(matcher.start(0) + matcher.group(0).length(), processExpression.length()); matcher = pattern.matcher(processExpression); } + // Correct the exceeding symbols +- and -+ // Correggi i segni +- e -+ in eccesso pattern = Pattern.compile("\\+\\-|\\-\\+"); matcher = pattern.matcher(processExpression); while (matcher.find()) { - cambiati = true; + symbolsChanged = true; String correzione = "-"; processExpression = processExpression.substring(0, matcher.start(0)) + correzione + processExpression.substring(matcher.start(0) + matcher.group(0).length(), processExpression.length()); matcher = pattern.matcher(processExpression); } - + // Rimuovi i segni appena dopo le parentesi if (processExpression.contains("(+")) { - cambiati = true; + symbolsChanged = true; processExpression = processExpression.replace("(+", "("); } // Cambia i segni appena prima le parentesi if (processExpression.contains("-(")) { - cambiati = true; + symbolsChanged = true; processExpression = processExpression.replace("-(", "-1*("); } // Rimuovi i segni appena dopo l'inizio if (processExpression.startsWith("+")) { - cambiati = true; + symbolsChanged = true; processExpression = processExpression.substring(1, processExpression.length()); } // Rimuovi i + in eccesso - pattern = Pattern.compile("[" + ArrayToRegex(Utils.add(concat(Simboli.segni(true, true), Simboli.funzioni()), "(")) + "]\\+[^" + ArrayToRegex(concat(concat(Simboli.segni(true, true), Simboli.funzioni()), new String[] { "(", ")" })) + "]+?[" + ArrayToRegex(concat(Simboli.segni(true, true), Simboli.funzioni())) + "]|[" + ArrayToRegex(concat(Simboli.segni(true, true), Simboli.funzioni())) + "]+?\\+[^" + ArrayToRegex(concat(concat(Simboli.segni(true, true), Simboli.funzioni()), new String[] { "(", ")" })) + "]"); + pattern = Pattern.compile("[" + ArrayToRegex(Utils.add(concat(MathematicalSymbols.signums(true, true), MathematicalSymbols.functions()), "(")) + "]\\+[^" + ArrayToRegex(concat(concat(MathematicalSymbols.signums(true, true), MathematicalSymbols.functions()), new String[] { "(", ")" })) + "]+?[" + ArrayToRegex(concat(MathematicalSymbols.signums(true, true), MathematicalSymbols.functions())) + "]|[" + ArrayToRegex(concat(MathematicalSymbols.signums(true, true), MathematicalSymbols.functions())) + "]+?\\+[^" + ArrayToRegex(concat(concat(MathematicalSymbols.signums(true, true), MathematicalSymbols.functions()), new String[] { "(", ")" })) + "]"); matcher = pattern.matcher(processExpression); - cambiati = false; + symbolsChanged = false; while (matcher.find()) { - cambiati = true; + symbolsChanged = true; String correzione = matcher.group(0).replaceFirst(Matcher.quoteReplacement("+"), ""); processExpression = processExpression.substring(0, matcher.start(0) + 1) + correzione + processExpression.substring(matcher.start(0) + matcher.group(0).length(), processExpression.length()); matcher = pattern.matcher(processExpression); } // Correggi i segni - in +- - pattern = Pattern.compile("[^" + Utils.ArrayToRegex(concat(concat(Simboli.funzioni(), new String[] { Simboli.PARENTHESIS_OPEN }), Simboli.segni(true, true))) + "]-"); + pattern = Pattern.compile("[^" + Utils.ArrayToRegex(concat(concat(MathematicalSymbols.functions(), new String[] { MathematicalSymbols.PARENTHESIS_OPEN }), MathematicalSymbols.signums(true, true))) + "]-"); matcher = pattern.matcher(processExpression); while (matcher.find()) { - cambiati = true; + symbolsChanged = true; String correzione = "+-"; processExpression = processExpression.substring(0, matcher.start(0) + 1) + correzione + processExpression.substring(matcher.start(0) + matcher.group(0).length(), processExpression.length()); matcher = pattern.matcher(processExpression); } - if (cambiati) { + if (symbolsChanged) { Utils.debug.println(debugSpaces + "•Resolved signs:" + processExpression); } // Aggiungi i segni * accanto alle parentesi pattern = Pattern.compile("\\([^\\(]+?\\)"); matcher = pattern.matcher(processExpression); - cambiati = false; + symbolsChanged = false; while (matcher.find()) { - cambiati = true; + symbolsChanged = true; // sistema i segni * impliciti prima e dopo l'espressione. String beforeexp = processExpression.substring(0, matcher.start(0)); String newexp = matcher.group(0).substring(1, matcher.group(0).length() - 1); String afterexp = processExpression.substring(matcher.start(0) + matcher.group(0).length(), processExpression.length()); - if (Pattern.compile("[^\\-" + Utils.ArrayToRegex(Utils.add(concat(Simboli.funzioni(), concat(Simboli.segni(true, true), Simboli.sintassiGenerale())), "(")) + "]$").matcher(beforeexp).find()) { + if (Pattern.compile("[^\\-" + Utils.ArrayToRegex(Utils.add(concat(MathematicalSymbols.functions(), concat(MathematicalSymbols.signums(true, true), MathematicalSymbols.genericSyntax())), "(")) + "]$").matcher(beforeexp).find()) { // Se la stringa precedente finisce con un numero - beforeexp += Simboli.MULTIPLICATION; + beforeexp += MathematicalSymbols.MULTIPLICATION; } - if (Pattern.compile("^[^\\-" + Utils.ArrayToRegex(Utils.add(concat(Simboli.funzioni(), concat(Simboli.segni(true, true), Simboli.sintassiGenerale())), ")")) + "]").matcher(afterexp).find()) { + if (Pattern.compile("^[^\\-" + Utils.ArrayToRegex(Utils.add(concat(MathematicalSymbols.functions(), concat(MathematicalSymbols.signums(true, true), MathematicalSymbols.genericSyntax())), ")")) + "]").matcher(afterexp).find()) { // Se la stringa successiva inizia con un numero - afterexp = Simboli.MULTIPLICATION + afterexp; + afterexp = MathematicalSymbols.MULTIPLICATION + afterexp; } processExpression = beforeexp + "⑴" + newexp + "⑵" + afterexp; matcher = pattern.matcher(processExpression); @@ -163,7 +170,7 @@ public class Espressione extends FunzioneMultiplaBase { processExpression = processExpression.replace("⑴", "(").replace("⑵", ")"); - if (cambiati) { + if (symbolsChanged) { Utils.debug.println(debugSpaces + "•Added implicit multiplications:" + processExpression); } @@ -171,61 +178,63 @@ public class Espressione extends FunzioneMultiplaBase { debugSpaces += " "; - // Suddividi tutto - Espressione parentesiNonSuddivisaCorrettamente = new Espressione(); - parentesiNonSuddivisaCorrettamente.setVariables(new FunzioneBase[] {}); + // Convert the expression to a list of objects + Expression imputRawParenthesis = new Expression(); + imputRawParenthesis.setVariables(new FunctionBase[] {}); String tmp = ""; - final String[] funzioni = concat(concat(concat(concat(Simboli.funzioni(), Simboli.parentesi()), Simboli.segni(true, true)), Simboli.incognite()), Simboli.sintassiGenerale()); + final String[] functions = concat(concat(concat(concat(MathematicalSymbols.functions(), MathematicalSymbols.parentheses()), MathematicalSymbols.signums(true, true)), MathematicalSymbols.variables()), MathematicalSymbols.genericSyntax()); for (int i = 0; i < processExpression.length(); i++) { // Per ogni carattere cerca se è un numero o una funzione: String charI = processExpression.charAt(i) + ""; - if (Utils.isInArray(charI, funzioni)) { + if (Utils.isInArray(charI, functions)) { + // Finds the type of function fron the following list // Cerca il tipo di funzione tra le esistenti - FunzioneBase f = null; + FunctionBase f = null; switch (charI) { - case Simboli.SUM: - f = new Somma(null, null); + case MathematicalSymbols.SUM: + f = new Sum(null, null); break; - case Simboli.MULTIPLICATION: - f = new Moltiplicazione(null, null); + case MathematicalSymbols.MULTIPLICATION: + f = new Multiplication(null, null); break; - case Simboli.PRIORITARY_MULTIPLICATION: - f = new MoltiplicazionePrioritaria(null, null); + case MathematicalSymbols.PRIORITARY_MULTIPLICATION: + f = new PrioritaryMultiplication(null, null); break; - case Simboli.DIVISION: - f = new Divisione(null, null); + case MathematicalSymbols.DIVISION: + f = new Division(null, null); break; - case Simboli.NTH_ROOT: - f = new Radice(null, null); + case MathematicalSymbols.NTH_ROOT: + f = new Root(null, null); break; - case Simboli.SQUARE_ROOT: - f = new RadiceQuadrata(null); + case MathematicalSymbols.SQUARE_ROOT: + f = new RootSquare(null); break; - case Simboli.POTENZA: - f = new Potenza(null, null); + case MathematicalSymbols.POWER: + f = new Power(null, null); break; - case Simboli.PARENTHESIS_OPEN: + case MathematicalSymbols.PARENTHESIS_OPEN: + // Find the last closed parenthesis // cerca l'ultima parentesi chiusa int startIndex = i; int endIndex = -1; int jumps = -1; for (int i2 = startIndex; i2 < processExpression.length(); i2++) { - if ((processExpression.charAt(i2) + "").equals(Simboli.PARENTHESIS_CLOSE)) { + if ((processExpression.charAt(i2) + "").equals(MathematicalSymbols.PARENTHESIS_CLOSE)) { if (jumps == 0) { endIndex = i2; break; } else if (jumps > 0) { jumps -= 1; } else if (jumps < 0) { - throw new Errore(Errori.UNBALANCED_BRACKETS); + throw new Error(Errors.UNBALANCED_BRACKETS); } - } else if ((processExpression.charAt(i2) + "").equals(Simboli.PARENTHESIS_OPEN)) { + } else if ((processExpression.charAt(i2) + "").equals(MathematicalSymbols.PARENTHESIS_OPEN)) { jumps += 1; } } if (endIndex == -1 || endIndex < startIndex) { - throw new Errore(Errori.UNBALANCED_BRACKETS); + throw new Error(Errors.UNBALANCED_BRACKETS); } startIndex += 1; i = startIndex; @@ -235,55 +244,55 @@ public class Espressione extends FunzioneMultiplaBase { tmpExpr += processExpression.charAt(i); i++; } - f = new Espressione(tmpExpr, debugSpaces, false); + f = new Expression(tmpExpr, debugSpaces, false); break; default: - if (Utils.isInArray(charI, Simboli.incognite())) { + if (Utils.isInArray(charI, MathematicalSymbols.variables())) { // Fallback NumeroAvanzato na = NumeroAvanzato.ONE; - Incognite iy = na.getIncognitey(); - iy.incognite.add(new Incognita(charI.charAt(0), 1, 1)); - na = na.setIncognitey(iy); - f = new Termine(na); + Variables iy = na.getVariableY(); + iy.variables.add(new Variable(charI.charAt(0), 1, 1)); + na = na.setVariableY(iy); + f = new Number(na); } else { throw new java.lang.RuntimeException("Il carattere " + charI + " non è tra le funzioni designate!\nAggiungerlo ad esse o rimuovere il carattere dall'espressione!"); } } - if (f instanceof Espressione) { + if (f instanceof Expression) { tmp = ""; - } else if (f instanceof Termine) { - if (parentesiNonSuddivisaCorrettamente.getVariablesLength() == 0) { + } else if (f instanceof Number) { + if (imputRawParenthesis.getVariablesLength() == 0) { if (tmp.length() > 0) { - parentesiNonSuddivisaCorrettamente.addVariableToEnd(new Termine(tmp)); + imputRawParenthesis.addVariableToEnd(new Number(tmp)); Utils.debug.println(debugSpaces + "•Added value to expression:" + tmp); - parentesiNonSuddivisaCorrettamente.addVariableToEnd(new MoltiplicazionePrioritaria(null, null)); - Utils.debug.println(debugSpaces + "•Added variable to expression:" + new MoltiplicazionePrioritaria(null, null).simbolo()); + imputRawParenthesis.addVariableToEnd(new PrioritaryMultiplication(null, null)); + Utils.debug.println(debugSpaces + "•Added variable to expression:" + new PrioritaryMultiplication(null, null).getSymbol()); } } else { if (tmp.length() > 0) { - if (parentesiNonSuddivisaCorrettamente.getVariable(parentesiNonSuddivisaCorrettamente.getVariablesLength() - 1) instanceof Termine) { - parentesiNonSuddivisaCorrettamente.addVariableToEnd(new MoltiplicazionePrioritaria(null, null)); - Utils.debug.println(debugSpaces + "•Added variable to expression:" + new MoltiplicazionePrioritaria(null, null).simbolo()); + if (imputRawParenthesis.getVariable(imputRawParenthesis.getVariablesLength() - 1) instanceof Number) { + imputRawParenthesis.addVariableToEnd(new PrioritaryMultiplication(null, null)); + Utils.debug.println(debugSpaces + "•Added variable to expression:" + new PrioritaryMultiplication(null, null).getSymbol()); } if (tmp.equals("-")) { tmp = "-1"; } - parentesiNonSuddivisaCorrettamente.addVariableToEnd(new Termine(tmp)); + imputRawParenthesis.addVariableToEnd(new Number(tmp)); Utils.debug.println(debugSpaces + "•Added value to expression:" + tmp); } - if (tmp.length() > 0 || parentesiNonSuddivisaCorrettamente.getVariable(parentesiNonSuddivisaCorrettamente.getVariablesLength() - 1) instanceof Termine) { - parentesiNonSuddivisaCorrettamente.addVariableToEnd(new MoltiplicazionePrioritaria(null, null)); - Utils.debug.println(debugSpaces + "•Added variable to expression:" + new MoltiplicazionePrioritaria(null, null).simbolo()); + if (tmp.length() > 0 || imputRawParenthesis.getVariable(imputRawParenthesis.getVariablesLength() - 1) instanceof Number) { + imputRawParenthesis.addVariableToEnd(new PrioritaryMultiplication(null, null)); + Utils.debug.println(debugSpaces + "•Added variable to expression:" + new PrioritaryMultiplication(null, null).getSymbol()); } } } else { if (tmp.length() != 0) { - parentesiNonSuddivisaCorrettamente.addVariableToEnd(new Termine(tmp)); + imputRawParenthesis.addVariableToEnd(new Number(tmp)); Utils.debug.println(debugSpaces + "•Added variable to expression:" + tmp); } } - parentesiNonSuddivisaCorrettamente.addVariableToEnd(f); - Utils.debug.println(debugSpaces + "•Added variable to expression:" + f.simbolo()); + imputRawParenthesis.addVariableToEnd(f); + Utils.debug.println(debugSpaces + "•Added variable to expression:" + f.getSymbol()); tmp = ""; } else { try { @@ -301,9 +310,9 @@ public class Espressione extends FunzioneMultiplaBase { if (tmp.length() > 0) { Utils.debug.println(debugSpaces + "•Added variable to expression:" + tmp); try { - parentesiNonSuddivisaCorrettamente.addVariableToEnd(new Termine(tmp)); + imputRawParenthesis.addVariableToEnd(new Number(tmp)); } catch (NumberFormatException ex) { - throw new Errore(Errori.SYNTAX_ERROR); + throw new Error(Errors.SYNTAX_ERROR); } tmp = ""; } @@ -317,13 +326,13 @@ public class Espressione extends FunzioneMultiplaBase { // Fine suddivisione di insieme Utils.debug.println(debugSpaces + "•Removing useless parentheses"); - for (int i = 0; i < parentesiNonSuddivisaCorrettamente.variables.length; i++) { - if (parentesiNonSuddivisaCorrettamente.variables[i] instanceof Espressione) { - Espressione par = (Espressione) parentesiNonSuddivisaCorrettamente.variables[i]; + for (int i = 0; i < imputRawParenthesis.variables.length; i++) { + if (imputRawParenthesis.variables[i] instanceof Expression) { + Expression par = (Expression) imputRawParenthesis.variables[i]; if (par.variables.length == 1) { - FunzioneBase subFunz = par.variables[0]; - if (subFunz instanceof Espressione || subFunz instanceof Termine) { - parentesiNonSuddivisaCorrettamente.variables[i] = subFunz; + FunctionBase subFunz = par.variables[0]; + if (subFunz instanceof Expression || subFunz instanceof Number) { + imputRawParenthesis.variables[i] = subFunz; Utils.debug.println(debugSpaces + " •Useless parentheses removed"); } } @@ -333,142 +342,142 @@ public class Espressione extends FunzioneMultiplaBase { // Inizia l'affinazione dell'espressione Utils.debug.println(debugSpaces + "•Pushing classes..."); - FunzioneBase[] funzioniOLDArray = parentesiNonSuddivisaCorrettamente.getVariables(); - ArrayList funzioniOLD = new ArrayList(); - for (int i = 0; i < funzioniOLDArray.length; i++) { - FunzioneBase funzione = funzioniOLDArray[i]; + FunctionBase[] oldFunctionsArray = imputRawParenthesis.getVariables(); + ArrayList oldFunctionsList = new ArrayList(); + for (int i = 0; i < oldFunctionsArray.length; i++) { + FunctionBase funzione = oldFunctionsArray[i]; if (funzione != null) { //Affinazione - if (funzione instanceof Radice) { - if ((i - 1) >= 0 && funzioniOLDArray[i-1] instanceof Termine && ((Termine)funzioniOLDArray[i-1]).getTerm().compareTo(new NumeroAvanzatoVec(new NumeroAvanzato(new BigInteger("2")))) == 0) { - funzioniOLDArray[i] = null; - funzioniOLDArray[i-1] = null; - funzioniOLD.remove(funzioniOLD.size()-1); + if (funzione instanceof Root) { + if ((i - 1) >= 0 && oldFunctionsArray[i-1] instanceof Number && ((Number)oldFunctionsArray[i-1]).getTerm().compareTo(new NumeroAvanzatoVec(new NumeroAvanzato(new BigInteger("2")))) == 0) { + oldFunctionsArray[i] = null; + oldFunctionsArray[i-1] = null; + oldFunctionsList.remove(oldFunctionsList.size()-1); i -= 1; - funzione = new RadiceQuadrata(null); + funzione = new RootSquare(null); } } //Aggiunta della funzione alla lista grezza - funzioniOLD.add(funzione); + oldFunctionsList.add(funzione); } } - if (funzioniOLD.size() > 1) { + if (oldFunctionsList.size() > 1) { Utils.debug.println(debugSpaces + " •Correcting classes:"); int before = 0; - String fase = "funzioniSN"; + String step = "SN Functions"; int n = 0; do { - before = funzioniOLD.size(); + before = oldFunctionsList.size(); int i = 0; boolean change = false; - if (Utils.ciSonoMoltiplicazioniPrioritarieNonImpostate(funzioniOLD)) { - fase = "moltiplicazioni prioritarie"; // PRIMA FASE - } else if (Utils.ciSonoFunzioniSNnonImpostate(funzioniOLD)) { - fase = "funzioniSN"; // SECONDA FASE - } else if (Utils.ciSonoFunzioniNSNnonImpostate(funzioniOLD)) { - fase = "funzioniNSN"; // TERZA FASE - } else if (Utils.ciSonoMoltiplicazioniNonImpostate(funzioniOLD)) { - fase = "moltiplicazioni"; // QUARTA FASE - } else if (Utils.ciSonoSommeNonImpostate(funzioniOLD)) { - fase = "somme"; // QUINTA FASE + if (Utils.areThereEmptyPrioritaryMultiplications(oldFunctionsList)) { + step = "prioritary multiplications"; // PRIMA FASE + } else if (Utils.areThereOnlyEmptySNFunctions(oldFunctionsList)) { + step = "SN Functions"; // SECONDA FASE + } else if (Utils.areThereOnlyEmptyNSNFunctions(oldFunctionsList)) { + step = "NSN Functions"; // TERZA FASE + } else if (Utils.areThereEmptyMultiplications(oldFunctionsList)) { + step = "multiplications"; // QUARTA FASE + } else if (Utils.areThereEmptySums(oldFunctionsList)) { + step = "sums"; // QUINTA FASE } else { // fase = "errore"; System.out.println("WARN: ---> POSSIBILE ERRORE????? <---");// BOH // throw new Errore(Errori.SYNTAX_ERROR); - while (funzioniOLD.size() > 1) { - funzioniOLD.set(0, new Moltiplicazione(funzioniOLD.get(0), funzioniOLD.remove(1))); + while (oldFunctionsList.size() > 1) { + oldFunctionsList.set(0, new Multiplication(oldFunctionsList.get(0), oldFunctionsList.remove(1))); } } - Utils.debug.println(debugSpaces + " •Phase: "+fase); - while (i < funzioniOLD.size() && change == false && funzioniOLD.size() > 1) { - FunzioneBase funzioneTMP = funzioniOLD.get(i); - if (funzioneTMP instanceof FunzioneDueValoriBase) { - if (fase != "funzioniSN") { + Utils.debug.println(debugSpaces + " •Phase: "+step); + while (i < oldFunctionsList.size() && change == false && oldFunctionsList.size() > 1) { + FunctionBase funzioneTMP = oldFunctionsList.get(i); + if (funzioneTMP instanceof FunctionTwoValuesBase) { + if (step != "SN Functions") { if ( - (fase == "somme" && (funzioneTMP instanceof Somma) == true && ((funzioneTMP instanceof FunzioneAnterioreBase && ((FunzioneAnterioreBase) funzioneTMP).variable == null) || (funzioneTMP instanceof FunzioneDueValoriBase && ((FunzioneDueValoriBase) funzioneTMP).variable1 == null && ((FunzioneDueValoriBase) funzioneTMP).variable2 == null) || (!(funzioneTMP instanceof FunzioneAnterioreBase) && !(funzioneTMP instanceof FunzioneDueValoriBase)))) + (step == "sums" && (funzioneTMP instanceof Sum) == true && ((funzioneTMP instanceof AnteriorFunctionBase && ((AnteriorFunctionBase) funzioneTMP).variable == null) || (funzioneTMP instanceof FunctionTwoValuesBase && ((FunctionTwoValuesBase) funzioneTMP).variable1 == null && ((FunctionTwoValuesBase) funzioneTMP).variable2 == null) || (!(funzioneTMP instanceof AnteriorFunctionBase) && !(funzioneTMP instanceof FunctionTwoValuesBase)))) || ( - fase.equals("moltiplicazioni prioritarie") + step.equals("prioritary multiplications") && - (funzioneTMP instanceof MoltiplicazionePrioritaria) + (funzioneTMP instanceof PrioritaryMultiplication) && - ((FunzioneDueValoriBase) funzioneTMP).variable1 == null + ((FunctionTwoValuesBase) funzioneTMP).variable1 == null && - ((FunzioneDueValoriBase) funzioneTMP).variable2 == null + ((FunctionTwoValuesBase) funzioneTMP).variable2 == null ) || ( - fase.equals("moltiplicazioni") + step.equals("multiplications") && ( - (funzioneTMP instanceof Moltiplicazione) + (funzioneTMP instanceof Multiplication) || - (funzioneTMP instanceof Divisione) + (funzioneTMP instanceof Division) ) && - ((FunzioneDueValoriBase) funzioneTMP).variable1 == null + ((FunctionTwoValuesBase) funzioneTMP).variable1 == null && - ((FunzioneDueValoriBase) funzioneTMP).variable2 == null + ((FunctionTwoValuesBase) funzioneTMP).variable2 == null ) || ( - fase == "funzioniNSN" + step == "NSN Functions" && - (funzioneTMP instanceof Somma) == false + (funzioneTMP instanceof Sum) == false && - (funzioneTMP instanceof Moltiplicazione) == false + (funzioneTMP instanceof Multiplication) == false && - (funzioneTMP instanceof MoltiplicazionePrioritaria) == false + (funzioneTMP instanceof PrioritaryMultiplication) == false && - (funzioneTMP instanceof Divisione) == false + (funzioneTMP instanceof Division) == false && ( ( - funzioneTMP instanceof FunzioneAnterioreBase + funzioneTMP instanceof AnteriorFunctionBase && - ((FunzioneAnterioreBase) funzioneTMP).variable == null + ((AnteriorFunctionBase) funzioneTMP).variable == null ) || ( - funzioneTMP instanceof FunzioneDueValoriBase + funzioneTMP instanceof FunctionTwoValuesBase && - ((FunzioneDueValoriBase) funzioneTMP).variable1 == null + ((FunctionTwoValuesBase) funzioneTMP).variable1 == null && - ((FunzioneDueValoriBase) funzioneTMP).variable2 == null + ((FunctionTwoValuesBase) funzioneTMP).variable2 == null ) || ( - !(funzioneTMP instanceof FunzioneAnterioreBase) + !(funzioneTMP instanceof AnteriorFunctionBase) && - !(funzioneTMP instanceof FunzioneDueValoriBase) + !(funzioneTMP instanceof FunctionTwoValuesBase) ) ) ) ) { change = true; - if (i + 1 < funzioniOLD.size() && i - 1 >= 0) { - ((FunzioneDueValoriBase) funzioneTMP).setVariable1((FunzioneBase) funzioniOLD.get(i - 1)); - ((FunzioneDueValoriBase) funzioneTMP).setVariable2((FunzioneBase) funzioniOLD.get(i + 1)); - funzioniOLD.set(i, funzioneTMP); + if (i + 1 < oldFunctionsList.size() && i - 1 >= 0) { + ((FunctionTwoValuesBase) funzioneTMP).setVariable1((FunctionBase) oldFunctionsList.get(i - 1)); + ((FunctionTwoValuesBase) funzioneTMP).setVariable2((FunctionBase) oldFunctionsList.get(i + 1)); + oldFunctionsList.set(i, funzioneTMP); // è importante togliere prima gli elementi // in fondo e poi quelli davanti, perché gli // indici scalano da destra a sinistra. - funzioniOLD.remove(i + 1); - funzioniOLD.remove(i - 1); + oldFunctionsList.remove(i + 1); + oldFunctionsList.remove(i - 1); - Utils.debug.println(debugSpaces + " •Set variable to expression:" + funzioneTMP.simbolo()); + Utils.debug.println(debugSpaces + " •Set variable to expression:" + funzioneTMP.getSymbol()); try { - Utils.debug.println(debugSpaces + " " + "var1=" + ((FunzioneDueValoriBase) funzioneTMP).getVariable1().calcola()); + Utils.debug.println(debugSpaces + " " + "var1=" + ((FunctionTwoValuesBase) funzioneTMP).getVariable1().solve()); } catch (NullPointerException ex2) {} try { - Utils.debug.println(debugSpaces + " " + "var2=" + ((FunzioneDueValoriBase) funzioneTMP).getVariable2().calcola()); + Utils.debug.println(debugSpaces + " " + "var2=" + ((FunctionTwoValuesBase) funzioneTMP).getVariable2().solve()); } catch (NullPointerException ex2) {} try { - Utils.debug.println(debugSpaces + " " + "(result)=" + ((FunzioneDueValoriBase) funzioneTMP).calcola()); + Utils.debug.println(debugSpaces + " " + "(result)=" + ((FunctionTwoValuesBase) funzioneTMP).solve()); } catch (NullPointerException ex2) {} } else { @@ -476,24 +485,24 @@ public class Espressione extends FunzioneMultiplaBase { } } } - } else if (funzioneTMP instanceof FunzioneAnterioreBase) { - if ((fase == "funzioniSN" && ((FunzioneAnterioreBase) funzioneTMP).variable == null)) { - if (i + 1 < funzioniOLD.size()) { - FunzioneBase nextFunc = funzioniOLD.get(i + 1); - if (nextFunc instanceof FunzioneAnterioreBase && ((FunzioneAnterioreBase)nextFunc).variable == null) { + } else if (funzioneTMP instanceof AnteriorFunctionBase) { + if ((step == "SN Functions" && ((AnteriorFunctionBase) funzioneTMP).variable == null)) { + if (i + 1 < oldFunctionsList.size()) { + FunctionBase nextFunc = oldFunctionsList.get(i + 1); + if (nextFunc instanceof AnteriorFunctionBase && ((AnteriorFunctionBase)nextFunc).variable == null) { } else { change = true; - ((FunzioneAnterioreBase) funzioneTMP).setVariable((FunzioneBase) nextFunc); - funzioniOLD.set(i, funzioneTMP); + ((AnteriorFunctionBase) funzioneTMP).setVariable((FunctionBase) nextFunc); + oldFunctionsList.set(i, funzioneTMP); // è importante togliere prima gli elementi in // fondo e poi quelli davanti, perché gli indici // scalano da destra a sinistra. - funzioniOLD.remove(i + 1); + oldFunctionsList.remove(i + 1); - Utils.debug.println(debugSpaces + " •Set variable to expression:" + funzioneTMP.simbolo()); - FunzioneBase var = ((FunzioneAnterioreBase) funzioneTMP).getVariable().calcola(); + Utils.debug.println(debugSpaces + " •Set variable to expression:" + funzioneTMP.getSymbol()); + FunctionBase var = ((AnteriorFunctionBase) funzioneTMP).getVariable().solve(); if (var == null) { Utils.debug.println(debugSpaces + " " + "var=null"); } else { @@ -504,7 +513,7 @@ public class Espressione extends FunzioneMultiplaBase { throw new java.lang.RuntimeException("Argomenti mancanti! Sistemare l'equazione!"); } } - } else if (funzioneTMP instanceof Termine || funzioneTMP instanceof Espressione) { + } else if (funzioneTMP instanceof Number || funzioneTMP instanceof Expression) { if (n < 300) { // Utils.debug.println(debugSpaces+" •Set variable // to number:"+funzioneTMP.calcola()); @@ -515,9 +524,9 @@ public class Espressione extends FunzioneMultiplaBase { i++; n++; } - } while (((funzioniOLD.size() != before || fase != "somme") && funzioniOLD.size() > 1)); + } while (((oldFunctionsList.size() != before || step != "sums") && oldFunctionsList.size() > 1)); } - setVariables(funzioniOLD); + setVariables(oldFunctionsList); dsl = debugSpaces.length(); debugSpaces = ""; @@ -526,36 +535,36 @@ public class Espressione extends FunzioneMultiplaBase { } Utils.debug.println(debugSpaces + "•Finished correcting classes."); - Termine result = calcola(); + Number result = solve(); Utils.debug.println(debugSpaces + "•Result:" + result); } } @Override - public String simbolo() { + public String getSymbol() { return "Parentesi"; } @Override - public Termine calcola() throws Errore { + public Number solve() throws Error { if (variables.length == 0) { - return new Termine("0"); + return new Number("0"); } else if (variables.length == 1) { - return (Termine) variables[0].calcola(); + return (Number) variables[0].solve(); } else { - Termine result = new Termine("0"); - for (Funzione f : variables) { - result = result.add((Termine) f.calcola()); + Number result = new Number("0"); + for (Function f : variables) { + result = result.add((Number) f.solve()); } return result; } } @Override - public void calcolaGrafica() { - for (Funzione var : variables) { + public void generateGraphics() { + for (Function var : variables) { var.setSmall(small); - var.calcolaGrafica(); + var.generateGraphics(); } width = calcWidth(); @@ -565,11 +574,11 @@ public class Espressione extends FunzioneMultiplaBase { public boolean parenthesesNeeded() { boolean parenthesesneeded = true; - if (parentesiIniziale) { + if (initialParenthesis) { parenthesesneeded = false; } else { if (variables.length == 1) { - if (variables[0] instanceof Divisione) { + if (variables[0] instanceof Division) { parenthesesneeded = false; } else { parenthesesneeded = true; @@ -593,7 +602,7 @@ public class Espressione extends FunzioneMultiplaBase { glDrawLine(x, y + 2, x, y + h - 3); glDrawLine(x, y + h - 3, x + 2, y + h - 1); x += 4; - for (Funzione f : variables) { + for (Function f : variables) { float fheight = f.getHeight(); float y2 = miny + ((maxy - miny) / 2 - fheight / 2); f.draw(x, (int) y2); @@ -617,7 +626,7 @@ public class Espressione extends FunzioneMultiplaBase { return this.variables[0].getWidth(); } else { int w = 0; - for (Funzione f : variables) { + for (Function f : variables) { w += f.getWidth(); } return 1 + 4 + w + 2 + 4; @@ -630,12 +639,12 @@ public class Espressione extends FunzioneMultiplaBase { } private int calcHeight() { - if (parentesiIniziale || variables.length == 1) { + if (initialParenthesis || variables.length == 1) { return this.variables[0].getHeight(); } else { - Funzione tmin = null; - Funzione tmax = null; - for (Funzione t : variables) { + Function tmin = null; + Function tmax = null; + for (Function t : variables) { if (tmin == null || t.getLine() >= tmin.getLine()) { tmin = t; } @@ -655,11 +664,11 @@ public class Espressione extends FunzioneMultiplaBase { } private int calcLine() { - if (parentesiIniziale || variables.length == 1) { + if (initialParenthesis || variables.length == 1) { return this.variables[0].getLine(); } else { - Funzione tl = null; - for (Funzione t : variables) { + Function tl = null; + for (Function t : variables) { if (tl == null || t.getLine() >= tl.getLine()) { tl = t; } diff --git a/src/org/warp/picalculator/Funzione.java b/src/org/warp/picalculator/Function.java similarity index 55% rename from src/org/warp/picalculator/Funzione.java rename to src/org/warp/picalculator/Function.java index 90d1d914..4906b562 100644 --- a/src/org/warp/picalculator/Funzione.java +++ b/src/org/warp/picalculator/Function.java @@ -1,11 +1,11 @@ package org.warp.picalculator; -public interface Funzione { - public String simbolo(); +public interface Function { + public String getSymbol(); - public Funzione calcola() throws Errore; + public Function solve() throws Error; - public void calcolaGrafica(); + public void generateGraphics(); public void draw(int x, int y); diff --git a/src/org/warp/picalculator/FunzioneBase.java b/src/org/warp/picalculator/FunctionBase.java similarity index 60% rename from src/org/warp/picalculator/FunzioneBase.java rename to src/org/warp/picalculator/FunctionBase.java index 2a74ab06..b2df9b1b 100644 --- a/src/org/warp/picalculator/FunzioneBase.java +++ b/src/org/warp/picalculator/FunctionBase.java @@ -1,15 +1,15 @@ package org.warp.picalculator; -public abstract class FunzioneBase implements Funzione { +public abstract class FunctionBase implements Function { @Override - public abstract String simbolo(); + public abstract String getSymbol(); @Override - public abstract Termine calcola() throws Errore; + public abstract Number solve() throws Error; @Override - public abstract void calcolaGrafica(); + public abstract void generateGraphics(); @Override public abstract void draw(int x, int y); diff --git a/src/org/warp/picalculator/FunzioneMultipla.java b/src/org/warp/picalculator/FunctionMultipleValues.java similarity index 54% rename from src/org/warp/picalculator/FunzioneMultipla.java rename to src/org/warp/picalculator/FunctionMultipleValues.java index 42d4778b..7bcca2b6 100644 --- a/src/org/warp/picalculator/FunzioneMultipla.java +++ b/src/org/warp/picalculator/FunctionMultipleValues.java @@ -5,47 +5,47 @@ import java.util.List; import com.rits.cloning.Cloner; -public abstract class FunzioneMultipla implements Funzione { - public FunzioneMultipla() { - setVariables(new Funzione[] {}); +public abstract class FunctionMultipleValues implements Function { + public FunctionMultipleValues() { + setVariables(new Function[] {}); } - public FunzioneMultipla(Funzione[] values) { + public FunctionMultipleValues(Function[] values) { setVariables(values); } - protected Funzione[] variables; + protected Function[] variables; protected int width; protected int height; protected int line; protected boolean small; - public Funzione[] getVariables() { + public Function[] getVariables() { return variables; } - public void setVariables(Funzione[] value) { + public void setVariables(Function[] value) { variables = value; } - public void setVariables(final List value) { + public void setVariables(final List value) { int vsize = value.size(); - Funzione[] tmp = new Funzione[vsize]; + Function[] tmp = new Function[vsize]; for (int i = 0; i < vsize; i++) { tmp[i] = value.get(i); } variables = tmp; } - public Funzione getVariable(int index) { + public Function getVariable(int index) { return variables[index]; } - public void setVariable(int index, Funzione value) { + public void setVariable(int index, Function value) { variables[index] = value; } - public void addVariableToEnd(Funzione value) { + public void addVariableToEnd(Function value) { int index = variables.length; setVariablesLength(index + 1); variables[index] = value; @@ -60,25 +60,25 @@ public abstract class FunzioneMultipla implements Funzione { } @Override - public abstract String simbolo(); + public abstract String getSymbol(); @Override - public abstract Funzione calcola() throws Errore; + public abstract Function solve() throws Error; @Override - public abstract void calcolaGrafica(); + public abstract void generateGraphics(); @Override public String toString() { try { - return calcola().toString(); - } catch (Errore e) { + return solve().toString(); + } catch (Error e) { return e.id.toString(); } } @Override - public Funzione clone() { + public Function clone() { Cloner cloner = new Cloner(); return cloner.deepClone(this); } diff --git a/src/org/warp/picalculator/FunzioneMultiplaBase.java b/src/org/warp/picalculator/FunctionMultipleValuesBase.java similarity index 52% rename from src/org/warp/picalculator/FunzioneMultiplaBase.java rename to src/org/warp/picalculator/FunctionMultipleValuesBase.java index 87f5a128..e72dde20 100644 --- a/src/org/warp/picalculator/FunzioneMultiplaBase.java +++ b/src/org/warp/picalculator/FunctionMultipleValuesBase.java @@ -5,47 +5,47 @@ import java.util.List; import com.rits.cloning.Cloner; -public abstract class FunzioneMultiplaBase extends FunzioneBase { - public FunzioneMultiplaBase() { - setVariables(new FunzioneBase[] {}); +public abstract class FunctionMultipleValuesBase extends FunctionBase { + public FunctionMultipleValuesBase() { + setVariables(new FunctionBase[] {}); } - public FunzioneMultiplaBase(FunzioneBase[] values) { + public FunctionMultipleValuesBase(FunctionBase[] values) { setVariables(values); } - protected FunzioneBase[] variables; + protected FunctionBase[] variables; protected int width; protected int height; protected int line; protected boolean small; - public FunzioneBase[] getVariables() { + public FunctionBase[] getVariables() { return variables; } - public void setVariables(FunzioneBase[] value) { + public void setVariables(FunctionBase[] value) { variables = value; } - public void setVariables(final List value) { + public void setVariables(final List value) { int vsize = value.size(); - FunzioneBase[] tmp = new FunzioneBase[vsize]; + FunctionBase[] tmp = new FunctionBase[vsize]; for (int i = 0; i < vsize; i++) { tmp[i] = value.get(i); } variables = tmp; } - public FunzioneBase getVariable(int index) { + public FunctionBase getVariable(int index) { return variables[index]; } - public void setVariable(int index, FunzioneBase value) { + public void setVariable(int index, FunctionBase value) { variables[index] = value; } - public void addVariableToEnd(FunzioneBase value) { + public void addVariableToEnd(FunctionBase value) { int index = variables.length; setVariablesLength(index + 1); variables[index] = value; @@ -60,25 +60,25 @@ public abstract class FunzioneMultiplaBase extends FunzioneBase { } @Override - public abstract String simbolo(); + public abstract String getSymbol(); @Override - public abstract Termine calcola() throws Errore; + public abstract Number solve() throws Error; @Override - public abstract void calcolaGrafica(); + public abstract void generateGraphics(); @Override public String toString() { try { - return calcola().toString(); - } catch (Errore e) { + return solve().toString(); + } catch (Error e) { return e.id.toString(); } } @Override - public FunzioneMultiplaBase clone() { + public FunctionMultipleValuesBase clone() { Cloner cloner = new Cloner(); return cloner.deepClone(this); } diff --git a/src/org/warp/picalculator/FunzioneDueValori.java b/src/org/warp/picalculator/FunctionTwoValues.java similarity index 68% rename from src/org/warp/picalculator/FunzioneDueValori.java rename to src/org/warp/picalculator/FunctionTwoValues.java index 25ba467f..0a2e85ee 100644 --- a/src/org/warp/picalculator/FunzioneDueValori.java +++ b/src/org/warp/picalculator/FunctionTwoValues.java @@ -9,49 +9,49 @@ import org.warp.engine.Display; import com.rits.cloning.Cloner; -public abstract class FunzioneDueValori implements Funzione { - public FunzioneDueValori(Funzione value1, Funzione value2) { +public abstract class FunctionTwoValues implements Function { + public FunctionTwoValues(Function value1, Function value2) { setVariable1(value1); setVariable2(value2); } - protected Funzione variable1 = new Termine(Rational.ZERO); + protected Function variable1 = new Number(Rational.ZERO); protected int width; protected int height; protected int line; protected boolean small; - public Funzione getVariable1() { + public Function getVariable1() { return variable1; } - public void setVariable1(Funzione value) { + public void setVariable1(Function value) { variable1 = value; } - protected Funzione variable2 = new Termine(Rational.ZERO); + protected Function variable2 = new Number(Rational.ZERO); - public Funzione getVariable2() { + public Function getVariable2() { return variable2; } - public void setVariable2(Funzione value) { + public void setVariable2(Function value) { variable2 = value; } @Override - public abstract String simbolo(); + public abstract String getSymbol(); @Override - public abstract Funzione calcola() throws Errore; + public abstract Function solve() throws Error; @Override - public void calcolaGrafica() { + public void generateGraphics() { variable1.setSmall(small); - variable1.calcolaGrafica(); + variable1.generateGraphics(); variable2.setSmall(small); - variable2.calcolaGrafica(); + variable2.generateGraphics(); width = calcWidth(); height = calcHeight(); @@ -70,8 +70,8 @@ public abstract class FunzioneDueValori implements Funzione { } else { Display.Render.setFont(PIDisplay.fonts[1]); } - glDrawStringLeft(dx + x, ln - Utils.getFontHeight(small) / 2 + y, simbolo()); - dx += getStringWidth(simbolo()); + glDrawStringLeft(dx + x, ln - Utils.getFontHeight(small) / 2 + y, getSymbol()); + dx += getStringWidth(getSymbol()); } variable2.draw(dx + x, ln - variable2.getLine() + y); } @@ -94,14 +94,14 @@ public abstract class FunzioneDueValori implements Funzione { @Override public String toString() { try { - return calcola().toString(); - } catch (Errore e) { + return solve().toString(); + } catch (Error e) { return e.id.toString(); } } @Override - public FunzioneDueValori clone() { + public FunctionTwoValues clone() { Cloner cloner = new Cloner(); return cloner.deepClone(this); } @@ -116,13 +116,13 @@ public abstract class FunzioneDueValori implements Funzione { } protected int calcWidth() { - return variable1.getWidth() + 1 + (drawSignum() ? getStringWidth(simbolo()) : 0) + variable2.getWidth(); + return variable1.getWidth() + 1 + (drawSignum() ? getStringWidth(getSymbol()) : 0) + variable2.getWidth(); } protected int calcHeight() { - Funzione tmin = variable1; - Funzione tmax = variable1; + Function tmin = variable1; + Function tmax = variable1; if (tmin == null || variable2.getLine() >= tmin.getLine()) { tmin = variable2; } @@ -133,7 +133,7 @@ public abstract class FunzioneDueValori implements Funzione { } protected int calcLine() { - Funzione tl = variable1; + Function tl = variable1; if (tl == null || variable2.getLine() >= tl.getLine()) { tl = variable2; } diff --git a/src/org/warp/picalculator/FunzioneDueValoriBase.java b/src/org/warp/picalculator/FunctionTwoValuesBase.java similarity index 67% rename from src/org/warp/picalculator/FunzioneDueValoriBase.java rename to src/org/warp/picalculator/FunctionTwoValuesBase.java index 73c72aea..4ed78b44 100644 --- a/src/org/warp/picalculator/FunzioneDueValoriBase.java +++ b/src/org/warp/picalculator/FunctionTwoValuesBase.java @@ -9,49 +9,49 @@ import org.warp.engine.Display; import com.rits.cloning.Cloner; -public abstract class FunzioneDueValoriBase extends FunzioneBase { - public FunzioneDueValoriBase(FunzioneBase value1, FunzioneBase value2) { +public abstract class FunctionTwoValuesBase extends FunctionBase { + public FunctionTwoValuesBase(FunctionBase value1, FunctionBase value2) { setVariable1(value1); setVariable2(value2); } - protected FunzioneBase variable1 = new Termine(Rational.ZERO); + protected FunctionBase variable1 = new Number(Rational.ZERO); protected int width; protected int height; protected int line; protected boolean small; - public FunzioneBase getVariable1() { + public FunctionBase getVariable1() { return variable1; } - public void setVariable1(FunzioneBase value) { + public void setVariable1(FunctionBase value) { variable1 = value; } - protected FunzioneBase variable2 = new Termine(Rational.ZERO); + protected FunctionBase variable2 = new Number(Rational.ZERO); - public FunzioneBase getVariable2() { + public FunctionBase getVariable2() { return variable2; } - public void setVariable2(FunzioneBase value) { + public void setVariable2(FunctionBase value) { variable2 = value; } @Override - public abstract String simbolo(); + public abstract String getSymbol(); @Override - public abstract Termine calcola() throws Errore; + public abstract Number solve() throws Error; @Override - public void calcolaGrafica() { + public void generateGraphics() { variable1.setSmall(small); - variable1.calcolaGrafica(); + variable1.generateGraphics(); variable2.setSmall(small); - variable2.calcolaGrafica(); + variable2.generateGraphics(); width = calcWidth(); height = calcHeight(); @@ -70,8 +70,8 @@ public abstract class FunzioneDueValoriBase extends FunzioneBase { } else { Display.Render.setFont(PIDisplay.fonts[0]); } - glDrawStringLeft(dx + x, ln - Utils.getFontHeight(small) / 2 + y, simbolo()); - dx += getStringWidth(simbolo()); + glDrawStringLeft(dx + x, ln - Utils.getFontHeight(small) / 2 + y, getSymbol()); + dx += getStringWidth(getSymbol()); } variable2.draw(dx + x, ln - variable2.getLine() + y); } @@ -94,14 +94,14 @@ public abstract class FunzioneDueValoriBase extends FunzioneBase { @Override public String toString() { try { - return calcola().toString(); - } catch (Errore e) { + return solve().toString(); + } catch (Error e) { return e.id.toString(); } } @Override - public FunzioneDueValoriBase clone() { + public FunctionTwoValuesBase clone() { Cloner cloner = new Cloner(); return cloner.deepClone(this); } @@ -116,13 +116,13 @@ public abstract class FunzioneDueValoriBase extends FunzioneBase { } protected int calcWidth() { - return variable1.getWidth() + 1 + (drawSignum() ? getStringWidth(simbolo()) : 0) + variable2.getWidth(); + return variable1.getWidth() + 1 + (drawSignum() ? getStringWidth(getSymbol()) : 0) + variable2.getWidth(); } protected int calcHeight() { - FunzioneBase tmin = variable1; - FunzioneBase tmax = variable1; + FunctionBase tmin = variable1; + FunctionBase tmax = variable1; if (tmin == null || variable2.getLine() >= tmin.getLine()) { tmin = variable2; } @@ -133,7 +133,7 @@ public abstract class FunzioneDueValoriBase extends FunzioneBase { } protected int calcLine() { - FunzioneBase tl = variable1; + FunctionBase tl = variable1; if (tl == null || variable2.getLine() >= tl.getLine()) { tl = variable2; } diff --git a/src/org/warp/picalculator/Incognita.java b/src/org/warp/picalculator/Incognita.java deleted file mode 100644 index 52296905..00000000 --- a/src/org/warp/picalculator/Incognita.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.warp.picalculator; - -import org.nevec.rjm.Rational; - -public class Incognita { - public char simbolo = 'X'; - public Rational esponente = Rational.ONE; - - public Incognita(char simbolo, Rational esponente) { - this.simbolo = simbolo; - this.esponente = esponente; - } - - public Incognita(char simbolo, int a, int b) { - this.simbolo = simbolo; - this.esponente = new Rational(a, b); - } - - public Incognita(char simbolo) { - this.simbolo = simbolo; - this.esponente = new Rational(1, 1); - } - - @Override - public boolean equals(Object o) { - if (o instanceof Incognita) { - if (this.simbolo == ((Incognita) o).simbolo) { - if (this.esponente == ((Incognita) o).esponente) { - return true; - } - } - } - return false; - } - - @Override - public int hashCode() { - return Character.getNumericValue(simbolo) * 3 + esponente.hashCode(); - } -} diff --git a/src/org/warp/picalculator/Incognite.java b/src/org/warp/picalculator/Incognite.java deleted file mode 100644 index ddebda89..00000000 --- a/src/org/warp/picalculator/Incognite.java +++ /dev/null @@ -1,391 +0,0 @@ -package org.warp.picalculator; - -import java.math.BigInteger; -import java.util.Comparator; -import java.util.Vector; - -import org.nevec.rjm.BigIntegerMath; -import org.nevec.rjm.Rational; - -public class Incognite { - - Vector incognite; - - public Incognite() { - incognite = new Vector(); - } - - public Incognite(Incognita[] value) { - this(); - for (Incognita i : value) { - incognite.add(i); - } - } - - public Incognite(Vector value) { - this(); - incognite = value; - } - - public Incognite(Incognita value) { - this(); - incognite.add(value); - } - - public int count() { - return incognite.size(); - } - - public boolean contieneSimbolo(char simbolo) { - for (Incognita i : incognite) { - if (i.simbolo == simbolo) { - return true; - } - } - return false; - } - - public Rational prendiEsponenteSimbolo(char simbolo) { - for (Incognita i : incognite) { - if (i.simbolo == simbolo) { - return i.esponente; - } - } - return new Rational(0, 1); - } - - public void impostaEsponenteSimbolo(char simbolo, Rational esponente) { - for (Incognita i : incognite) { - if (i.simbolo == simbolo) { - i.esponente = esponente; - } - } - } - - @SuppressWarnings("unchecked") - @Override - public Incognite clone() { - return new Incognite((Vector) incognite.clone()).normalize(); - } - - public Incognite multiply(Incognite val) { - Incognite result = new Incognite(); - // Passaggio 1: test vari - // Se il primo gruppo di incognite à nullo allora ritorna il secondo - // gruppo - if (this.count() == 0) { - result = val.clone(); - return result; - } - // Se il secondo gruppo di incognite à nullo allora ritorna il primo - // gruppo - if (val.count() == 0) { - result = this.clone(); - return result; - } - - // Passaggio 2: le incognite doppie vengono raggruppate. - for (Incognita i1 : incognite) { - for (Incognita i2 : val.incognite) { - if (i1.simbolo == i2.simbolo) { - if (!result.contieneSimbolo(i1.simbolo)) { - Incognita ir = new Incognita(i1.simbolo, i1.esponente.add(i2.esponente)); - result.incognite.add(ir); - } - } - } - } - // Passaggio 3: le incognite non ancora presenti vengono aggiunte. - for (Incognita i : incognite) { - if (!result.contieneSimbolo(i.simbolo)) { - result.incognite.add(i); - } - } - for (Incognita i : val.incognite) { - if (!result.contieneSimbolo(i.simbolo)) { - result.incognite.add(i); - } - } - return result.normalize(); - } - - public Incognite divide(Incognite val) { - Incognite result = new Incognite(); - - // Passaggio 2: le incognite doppie vengono raggruppate. - for (Incognita i1 : incognite) { - for (Incognita i2 : val.incognite) { - if (i1.simbolo == i2.simbolo) { - if (!result.contieneSimbolo(i1.simbolo)) { - Incognita ir = new Incognita(i1.simbolo, i1.esponente.add(i2.esponente.multiply(new Rational(-1, 1)))); - result.incognite.add(ir); - } - } - } - } - // Passaggio 3: le incognite non ancora presenti vengono aggiunte. - for (Incognita i : incognite) { - if (!result.contieneSimbolo(i.simbolo)) { - result.incognite.add(i); - } - } - for (Incognita i : val.incognite) { - if (!result.contieneSimbolo(i.simbolo)) { - result.incognite.add(new Incognita(i.simbolo, i.esponente.multiply(new Rational(-1, 1)))); - } - } - return result.normalize(); - } - - public Incognite sqrt() { - Incognite result = new Incognite(); - for (Incognita i1 : incognite) { - Incognita ir = null; - try { - ir = new Incognita(i1.simbolo, i1.esponente.divide(new Rational(2, 1))); - } catch (Errore e) { - e.printStackTrace(); - } - result.incognite.add(ir); - } - return result.normalize(); - } - - public Incognite normalize() { - Incognite result = new Incognite(); - for (Incognita i1 : incognite) { - if (i1.esponente.compareTo(Rational.ZERO) != 0) { - result.incognite.add(i1); - } - } - result.incognite.sort(new Comparator() { - @Override - public int compare(Incognita o1, Incognita o2) { - int index1 = letterIndex(o1.simbolo); - int index2 = letterIndex(o2.simbolo); - return index1 - index2; - } - }); - return result; - } - - public byte letterIndex(char l) { - return letterIndex(l, false); - } - - public static byte letterIndex(char l, boolean reverse) { - int total = Simboli.incognite().length - 1; - for (byte x = 0; x < Simboli.incognite().length; x++) { - if (Simboli.incognite()[x].equals("" + l)) { - if (reverse) { - return (byte) (total - x); - } else { - return x; - } - } - } - - return -1; - } - - public boolean compareTo(Incognite val) { - if (this.equals(val)) - return true; - return false; - } - - @Override - public boolean equals(Object val) { - if (val == null) - return false; - if (val instanceof Incognite) { - Incognite ii2 = (Incognite) val; - for (Incognita i1 : incognite) { - boolean found = false; - for (Incognita i2 : ii2.incognite) { - if (i1.simbolo == i2.simbolo) { - if (i1.esponente.compareTo(i2.esponente) != 0) - return false; - found = true; - } - } - if (!found) { - return false; - } - } - for (Incognita i1 : ii2.incognite) { - boolean found = false; - for (Incognita i2 : incognite) { - if (i1.simbolo == i2.simbolo) { - if (i1.esponente.compareTo(i2.esponente) != 0) - return false; - found = true; - } - } - if (!found) { - return false; - } - } - return true; - } - return false; - } - - @Override - public String toString() { - String result = ""; - if (incognite.size() != 1) { - for (Incognita i : incognite) { - if (i.esponente.compareTo(Rational.ONE) != 0) { - result += "(" + i.simbolo + "^" + i.esponente + ")"; - } else { - result += i.simbolo; - } - } - } else if (incognite.size() == 1) { - Incognita i = incognite.get(0); - if (i.esponente.compareTo(Rational.ONE) != 0) { - result += "" + i.simbolo + "^" + i.esponente + ""; - } else if (i.esponente.compareTo(Rational.ONE) == 0) { - result += i.simbolo; - } - } - return result; - } - - public static Incognite lcm(Incognite val1, Incognite val2) { - Incognite result = new Incognite(); - // Passaggio 1: test vari - // Se il primo gruppo di incognite à nullo allora ritorna il secondo - // gruppo - if (val1.count() == 0) { - result = val2.clone(); - return result; - } - // Se il secondo gruppo di incognite à nullo allora ritorna il primo - // gruppo - if (val2.count() == 0) { - result = val1.clone(); - return result; - } - - // Passaggio 2: le incognite doppie vengono raggruppate. - for (Incognita i1 : val1.incognite) { - for (Incognita i2 : val2.incognite) { - if (i1.simbolo == i2.simbolo) { - if (!result.contieneSimbolo(i1.simbolo)) { - Incognita ir = new Incognita(i1.simbolo); - if (i1.esponente.compareTo(i2.esponente) > 0) { - ir.esponente = i1.esponente; - } else { - ir.esponente = i2.esponente; - } - result.incognite.add(ir); - } - } - } - } - // Passaggio 3: le incognite non ancora presenti vengono aggiunte. - for (Incognita i : val1.incognite) { - if (!result.contieneSimbolo(i.simbolo)) { - result.incognite.add(i); - } - } - for (Incognita i : val2.incognite) { - if (!result.contieneSimbolo(i.simbolo)) { - result.incognite.add(i); - } - } - return result.normalize(); - } - - @SuppressWarnings("unchecked") - public Vector listaIncognite() { - return (Vector) this.incognite.clone(); - } - - public static Incognite[] normalizeBigSurdVariables(Incognite[] incognitetemp) throws Errore { - Incognite incognitex = incognitetemp[0].clone(); - Incognite incognitey = incognitetemp[1].clone(); - Incognite incognitez = incognitetemp[2].clone(); - - Incognite newincognitex = new Incognite(); - for (Incognita i : incognitex.incognite) { - Vector divisori = BigIntegerMath.divisors(i.esponente.divide(2).denom()); - if (divisori.contains(new BigInteger("2"))) { - newincognitex = newincognitex.multiply(new Incognite(i)); - } else { - incognitey = incognitey.multiply(new Incognite(new Incognita(i.simbolo, i.esponente.divide(2)))); - } - } - incognitex = newincognitex; - - for (Incognita i : incognitey.incognite) { - if (i.esponente.signum() < 0) { - incognitey = incognitey.divide(new Incognite(i)); - incognitez = incognitez.divide(new Incognite(i)); - } - } - for (Incognita i : incognitez.incognite) { - if (i.esponente.signum() < 0) { - incognitey = incognitey.divide(new Incognite(i)); - incognitez = incognitez.divide(new Incognite(i)); - } - } - - // TODO: SPOSTARE LE Y NEGATIVE SOTTO LA FRAZIONE, DALLA Y ALLA Z - - Incognite incogniteyresult = new Incognite(); - Incognite incognitezresult = new Incognite(); - // Le incognite doppie vengono tolte - for (Incognita i1 : incognitey.incognite) { - for (Incognita i2 : incognitez.incognite) { - if (i1.simbolo == i2.simbolo) { - if (i1.esponente.compareTo(i2.esponente) > 0) { - incogniteyresult = incogniteyresult.multiply(new Incognite(new Incognita(i1.simbolo, i1.esponente.subtract(i2.esponente)))); - } else if (i2.esponente.compareTo(i1.esponente) > 0) { - incognitezresult = incognitezresult.multiply(new Incognite(new Incognita(i1.simbolo, i2.esponente.subtract(i1.esponente)))); - } - } - } - } - - // Le altre incognite vengono ri-messe - for (Incognita i : incognitey.incognite) { - if (!incogniteyresult.contieneSimbolo(i.simbolo)) { - incogniteyresult = incogniteyresult.multiply(new Incognite(i)); - } - } - for (Incognita i : incognitez.incognite) { - if (!incognitezresult.contieneSimbolo(i.simbolo)) { - incognitezresult = incognitezresult.multiply(new Incognite(i)); - } - } - - incognitey = incogniteyresult; - incognitez = incognitezresult; - - return new Incognite[] { incognitex, incognitey, incognitez }; - } - - public static int priorità(Incognite ii) { - double priorità = 0; - double letterMax = 0; - for (Incognita i : ii.incognite) { - int lettIndex = letterIndex(i.simbolo, true); - if (lettIndex > letterMax) { - letterMax = lettIndex; - } - } - priorità += letterMax * 100000; - - for (Incognita i : ii.incognite) { - int lettIndex = letterIndex(i.simbolo, true); - if (letterMax == lettIndex) { - priorità += i.esponente.doubleValue() * 100000; - } - priorità += +i.esponente.doubleValue(); - } - return (int) priorità; - } -} diff --git a/src/org/warp/picalculator/Main.java b/src/org/warp/picalculator/Main.java index 5cad9001..c6026617 100644 --- a/src/org/warp/picalculator/Main.java +++ b/src/org/warp/picalculator/Main.java @@ -47,15 +47,6 @@ public class Main { } public static void main(String[] args) throws InterruptedException { - try { - Termine t = new Termine("9999.9"); - Termine r = t.calcola(); - System.out.println(t.toString()); - System.out.println(r.toString()); - } catch (Errore e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } new Main(); } } diff --git a/src/org/warp/picalculator/Simboli.java b/src/org/warp/picalculator/MathematicalSymbols.java similarity index 66% rename from src/org/warp/picalculator/Simboli.java rename to src/org/warp/picalculator/MathematicalSymbols.java index 2f34743a..a517f028 100644 --- a/src/org/warp/picalculator/Simboli.java +++ b/src/org/warp/picalculator/MathematicalSymbols.java @@ -2,7 +2,7 @@ package org.warp.picalculator; import static org.warp.picalculator.Utils.concat; -public class Simboli { +public class MathematicalSymbols { public static final String SUM = "+"; public static final String SUBTRACTION = "-"; public static final String MULTIPLICATION = "*"; @@ -12,23 +12,23 @@ public class Simboli { public static final String SQUARE_ROOT = "Ⓐ"; public static final String PARENTHESIS_OPEN = "("; public static final String PARENTHESIS_CLOSE = ")"; - public static final String POTENZA = "Ⓑ"; + public static final String POWER = "Ⓑ"; public static final String EQUATION = "="; public static final String SYSTEM = "{"; - public static final String[] funzioni() { - return concat(funzioniNSN(), funzioniSN()); + public static final String[] functions() { + return concat(functionsNSN(), functionsSN()); } - public static final String[] funzioniNSN() { - return new String[] { NTH_ROOT, POTENZA }; + public static final String[] functionsNSN() { + return new String[] { NTH_ROOT, POWER }; } - public static final String[] funzioniSN() { + public static final String[] functionsSN() { return new String[] { SQUARE_ROOT }; } - public static final String[] segni(boolean withMultiplication, boolean withPrioritaryMultiplication) { + public static final String[] signums(boolean withMultiplication, boolean withPrioritaryMultiplication) { String[] ret = new String[] { SUM, DIVISION }; if (withMultiplication) { ret = Utils.add(ret, MULTIPLICATION); @@ -39,15 +39,15 @@ public class Simboli { return ret; } - public static final String[] parentesi() { + public static final String[] parentheses() { return new String[] { PARENTHESIS_OPEN, PARENTHESIS_CLOSE }; } - public static String[] incognite() { + public static String[] variables() { return new String[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; } - public static String[] sintassiGenerale() { + public static String[] genericSyntax() { return new String[] { SYSTEM, EQUATION }; } } diff --git a/src/org/warp/picalculator/Moltiplicazione.java b/src/org/warp/picalculator/Moltiplicazione.java deleted file mode 100644 index acb12074..00000000 --- a/src/org/warp/picalculator/Moltiplicazione.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.warp.picalculator; - -import java.math.BigInteger; - -public class Moltiplicazione extends FunzioneDueValoriBase { - - public Moltiplicazione(FunzioneBase value1, FunzioneBase value2) { - super(value1, value2); - } - - @Override - public String simbolo() { - return Simboli.MULTIPLICATION; - } - - @Override - public Termine calcola() throws Errore { - return getVariable1().calcola().multiply(getVariable2().calcola()); - } - - @Override - public boolean drawSignum() { - Funzione[] tmpVar = new Funzione[] { variable1, variable2 }; - boolean[] ok = new boolean[] { false, false }; - for (int val = 0; val < 2; val++) { - while (!ok[val]) { - if (tmpVar[val] instanceof Divisione) { - ok[0] = true; - ok[1] = true; - } else if (tmpVar[val] instanceof Incognita) { - ok[val] = true; - } else if (tmpVar[val] instanceof Termine) { - if (val == 0) { - ok[val] = true; - } else { - if (!(tmpVar[0] instanceof Termine)) { - ok[val] = true; - } else { - if (((Termine) tmpVar[val]).term.isBigInteger(false)) { // TODO: prima era tmpVar[0], ma crashava. RICONTROLLARE! La logica potrebbe essere sbagliata - if (((Termine) tmpVar[val]).term.toBigInteger(true).compareTo(new BigInteger("1")) == 0) { - if (((Termine) tmpVar[val]).term.toNumeroAvanzato().getIncognitey().count() > 0) { - ok[val] = true; - } else { - break; - } - } else { - break; - } - } else { - ok[val] = true; - } - } - } - } else if (tmpVar[val] instanceof Potenza) { - tmpVar[val] = ((Potenza) tmpVar[val]).variable1; - } else if (tmpVar[val] instanceof Radice) { - ok[val] = true; - } else if (tmpVar[val] instanceof RadiceQuadrata) { - ok[val] = true; - } else if (tmpVar[val] instanceof Espressione) { - ok[0] = true; - ok[1] = true; - } else if (tmpVar[val] instanceof FunzioneDueValoriBase) { - if (val == 0) { - tmpVar[val] = ((FunzioneDueValoriBase) tmpVar[val]).variable2; - } else { - tmpVar[val] = ((FunzioneDueValoriBase) tmpVar[val]).variable1; - } - } else if (tmpVar[val] instanceof FunzioneAnterioreBase) { - tmpVar[val] = ((FunzioneAnterioreBase) tmpVar[val]).variable; - } - } - } - - if (ok[0] == true && ok[1] == true) { - return false; - } else { - return true; - } - } -} \ No newline at end of file diff --git a/src/org/warp/picalculator/MoltiplicazionePrioritaria.java b/src/org/warp/picalculator/MoltiplicazionePrioritaria.java deleted file mode 100644 index e24f50b4..00000000 --- a/src/org/warp/picalculator/MoltiplicazionePrioritaria.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.warp.picalculator; - -public class MoltiplicazionePrioritaria extends FunzioneDueValoriBase { - - public MoltiplicazionePrioritaria(FunzioneBase value1, FunzioneBase value2) { - super(value1, value2); - } - - @Override - public String simbolo() { - return Simboli.PRIORITARY_MULTIPLICATION; - } - - @Override - public Termine calcola() throws Errore { - return getVariable1().calcola().multiply(getVariable2().calcola()); - } - - @Override - public boolean drawSignum() { - return false; - } -} \ No newline at end of file diff --git a/src/org/warp/picalculator/Multiplication.java b/src/org/warp/picalculator/Multiplication.java new file mode 100644 index 00000000..555af86f --- /dev/null +++ b/src/org/warp/picalculator/Multiplication.java @@ -0,0 +1,81 @@ +package org.warp.picalculator; + +import java.math.BigInteger; + +public class Multiplication extends FunctionTwoValuesBase { + + public Multiplication(FunctionBase value1, FunctionBase value2) { + super(value1, value2); + } + + @Override + public String getSymbol() { + return MathematicalSymbols.MULTIPLICATION; + } + + @Override + public Number solve() throws Error { + return getVariable1().solve().multiply(getVariable2().solve()); + } + + @Override + public boolean drawSignum() { + Function[] tmpVar = new Function[] { variable1, variable2 }; + boolean[] ok = new boolean[] { false, false }; + for (int val = 0; val < 2; val++) { + while (!ok[val]) { + if (tmpVar[val] instanceof Division) { + ok[0] = true; + ok[1] = true; + } else if (tmpVar[val] instanceof Variable) { + ok[val] = true; + } else if (tmpVar[val] instanceof Number) { + if (val == 0) { + ok[val] = true; + } else { + if (!(tmpVar[0] instanceof Number)) { + ok[val] = true; + } else { + if (((Number) tmpVar[val]).term.isBigInteger(false)) { // TODO: prima era tmpVar[0], ma crashava. RICONTROLLARE! La logica potrebbe essere sbagliata + if (((Number) tmpVar[val]).term.toBigInteger(true).compareTo(new BigInteger("1")) == 0) { + if (((Number) tmpVar[val]).term.toNumeroAvanzato().getVariableY().count() > 0) { + ok[val] = true; + } else { + break; + } + } else { + break; + } + } else { + ok[val] = true; + } + } + } + } else if (tmpVar[val] instanceof Power) { + tmpVar[val] = ((Power) tmpVar[val]).variable1; + } else if (tmpVar[val] instanceof Root) { + ok[val] = true; + } else if (tmpVar[val] instanceof RootSquare) { + ok[val] = true; + } else if (tmpVar[val] instanceof Expression) { + ok[0] = true; + ok[1] = true; + } else if (tmpVar[val] instanceof FunctionTwoValuesBase) { + if (val == 0) { + tmpVar[val] = ((FunctionTwoValuesBase) tmpVar[val]).variable2; + } else { + tmpVar[val] = ((FunctionTwoValuesBase) tmpVar[val]).variable1; + } + } else if (tmpVar[val] instanceof AnteriorFunctionBase) { + tmpVar[val] = ((AnteriorFunctionBase) tmpVar[val]).variable; + } + } + } + + if (ok[0] == true && ok[1] == true) { + return false; + } else { + return true; + } + } +} \ No newline at end of file diff --git a/src/org/warp/picalculator/Termine.java b/src/org/warp/picalculator/Number.java similarity index 83% rename from src/org/warp/picalculator/Termine.java rename to src/org/warp/picalculator/Number.java index 0c96c5a7..6bb84f46 100644 --- a/src/org/warp/picalculator/Termine.java +++ b/src/org/warp/picalculator/Number.java @@ -18,7 +18,7 @@ import org.warp.engine.Display; import com.rits.cloning.Cloner; -public class Termine extends FunzioneBase { +public class Number extends FunctionBase { protected NumeroAvanzatoVec term = NumeroAvanzatoVec.ZERO; protected int width; @@ -26,27 +26,27 @@ public class Termine extends FunzioneBase { protected int line; protected boolean small; - public Termine(NumeroAvanzatoVec val) { + public Number(NumeroAvanzatoVec val) { term = val; } - public Termine(String s) throws Errore { + public Number(String s) throws Error { term = new NumeroAvanzatoVec(new NumeroAvanzato(Utils.getRational(s), Rational.ONE)); } - public Termine(Rational r) { + public Number(Rational r) { term = new NumeroAvanzatoVec(new NumeroAvanzato(r, Rational.ONE)); } - public Termine(BigInteger r) { + public Number(BigInteger r) { term = new NumeroAvanzatoVec(new NumeroAvanzato(new Rational(r, BigInteger.ONE), Rational.ONE)); } - public Termine(BigDecimal r) { + public Number(BigDecimal r) { term = new NumeroAvanzatoVec(new NumeroAvanzato(Utils.getRational(r), Rational.ONE)); } - public Termine(NumeroAvanzato numeroAvanzato) { + public Number(NumeroAvanzato numeroAvanzato) { term = new NumeroAvanzatoVec(numeroAvanzato); } @@ -59,42 +59,42 @@ public class Termine extends FunzioneBase { } @Override - public void calcolaGrafica() { + public void generateGraphics() { line = calcLine(); //TODO pp height = calcHeight(); width = calcWidth(); } @Override - public Termine calcola() { + public Number solve() { return this; } @Override - public String simbolo() { + public String getSymbol() { return toString(); } - public Termine add(Termine f) throws Errore { - Termine ret = new Termine(getTerm().add(f.getTerm())); + public Number add(Number f) throws Error { + Number ret = new Number(getTerm().add(f.getTerm())); return ret; } - public Termine multiply(Termine f) throws Errore { - Termine ret = new Termine(getTerm().multiply(f.getTerm())); + public Number multiply(Number f) throws Error { + Number ret = new Number(getTerm().multiply(f.getTerm())); return ret; } - public Termine divide(Termine f) throws Errore { - Termine ret = new Termine(getTerm().divide(f.getTerm())); + public Number divide(Number f) throws Error { + Number ret = new Number(getTerm().divide(f.getTerm())); return ret; } - public Termine pow(Termine f) throws Errore { - Termine ret = new Termine(NumeroAvanzatoVec.ONE); + public Number pow(Number f) throws Error { + Number ret = new Number(NumeroAvanzatoVec.ONE); if (f.getTerm().isBigInteger(true)) { for (BigInteger i = BigInteger.ZERO; i.compareTo(f.getTerm().toBigInteger(true)) < 0; i = i.add(BigInteger.ONE)) { - ret = ret.multiply(new Termine(getTerm())); + ret = ret.multiply(new Number(getTerm())); } } else if (getTerm().isRational(true) && f.getTerm().isRational(false) && f.getTerm().toRational(false).compareTo(Rational.HALF) == 0) { // Rational originalExponent = f.getTerm().toRational(); @@ -102,12 +102,12 @@ public class Termine extends FunzioneBase { // originalExponent.numer()); Rational numberToRoot = getTerm().toRational(true); NumeroAvanzato na = new NumeroAvanzato(Rational.ONE, numberToRoot); - na = na.setIncognitex(getTerm().toNumeroAvanzato().getIncognitey().multiply(getTerm().toNumeroAvanzato().getIncognitez())); - na = na.setIncognitey(new Incognite()); - na = na.setIncognitez(getTerm().toNumeroAvanzato().getIncognitez()); - ret = new Termine(na); + na = na.setVariableX(getTerm().toNumeroAvanzato().getVariableY().multiply(getTerm().toNumeroAvanzato().getVariableZ())); + na = na.setVariableY(new Variables()); + na = na.setVariableZ(getTerm().toNumeroAvanzato().getVariableZ()); + ret = new Number(na); } else { - ret = new Termine(BigDecimalMath.pow(getTerm().BigDecimalValue(new MathContext(Utils.scale, Utils.scaleMode2)), f.getTerm().BigDecimalValue(new MathContext(Utils.scale, Utils.scaleMode2)))); + ret = new Number(BigDecimalMath.pow(getTerm().BigDecimalValue(new MathContext(Utils.scale, Utils.scaleMode2)), f.getTerm().BigDecimalValue(new MathContext(Utils.scale, Utils.scaleMode2)))); } return ret; } @@ -346,7 +346,7 @@ public class Termine extends FunzioneBase { public boolean soloIncognitaSemplice() { if (this.getTerm().isBigInteger(true)) { - if (this.getTerm().toBigInteger(true).compareTo(BigInteger.ONE) == 0 && this.getTerm().toNumeroAvanzato().getIncognitey().count() > 0) { + if (this.getTerm().toBigInteger(true).compareTo(BigInteger.ONE) == 0 && this.getTerm().toNumeroAvanzato().getVariableY().count() > 0) { return true; } } @@ -376,7 +376,7 @@ public class Termine extends FunzioneBase { } @Override - public Termine clone() { + public Number clone() { Cloner cloner = new Cloner(); return cloner.deepClone(this); } diff --git a/src/org/warp/picalculator/Potenza.java b/src/org/warp/picalculator/Power.java similarity index 64% rename from src/org/warp/picalculator/Potenza.java rename to src/org/warp/picalculator/Power.java index 8b57dd18..f79a9229 100644 --- a/src/org/warp/picalculator/Potenza.java +++ b/src/org/warp/picalculator/Power.java @@ -1,23 +1,23 @@ package org.warp.picalculator; -public class Potenza extends FunzioneDueValoriBase { +public class Power extends FunctionTwoValuesBase { - public Potenza(FunzioneBase value1, FunzioneBase value2) { + public Power(FunctionBase value1, FunctionBase value2) { super(value1, value2); } @Override - public String simbolo() { - return Simboli.POTENZA; + public String getSymbol() { + return MathematicalSymbols.POWER; } @Override - public void calcolaGrafica() { + public void generateGraphics() { variable1.setSmall(small); - variable1.calcolaGrafica(); + variable1.generateGraphics(); variable2.setSmall(true); - variable2.calcolaGrafica(); + variable2.generateGraphics(); height = variable1.getHeight() + variable2.getHeight() - 4; line = variable2.getHeight() - 4 + variable1.getLine(); @@ -25,8 +25,8 @@ public class Potenza extends FunzioneDueValoriBase { } @Override - public Termine calcola() throws NumberFormatException, Errore { - return getVariable1().calcola().pow(getVariable2().calcola()); + public Number solve() throws NumberFormatException, Error { + return getVariable1().solve().pow(getVariable2().solve()); } @Override diff --git a/src/org/warp/picalculator/PrioritaryMultiplication.java b/src/org/warp/picalculator/PrioritaryMultiplication.java new file mode 100644 index 00000000..5b96728e --- /dev/null +++ b/src/org/warp/picalculator/PrioritaryMultiplication.java @@ -0,0 +1,23 @@ +package org.warp.picalculator; + +public class PrioritaryMultiplication extends FunctionTwoValuesBase { + + public PrioritaryMultiplication(FunctionBase value1, FunctionBase value2) { + super(value1, value2); + } + + @Override + public String getSymbol() { + return MathematicalSymbols.PRIORITARY_MULTIPLICATION; + } + + @Override + public Number solve() throws Error { + return getVariable1().solve().multiply(getVariable2().solve()); + } + + @Override + public boolean drawSignum() { + return false; + } +} \ No newline at end of file diff --git a/src/org/warp/picalculator/RisultatoEquazione.java b/src/org/warp/picalculator/RisultatoEquazione.java deleted file mode 100644 index 8093d263..00000000 --- a/src/org/warp/picalculator/RisultatoEquazione.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.warp.picalculator; - -import java.math.BigInteger; - -public class RisultatoEquazione { - public boolean isAnEquation = false; - public Termine LR = new Termine(new BigInteger("0")); - - public RisultatoEquazione(Termine LR, boolean isAnEquation) { - this.LR = LR; - this.isAnEquation = isAnEquation; - } -} diff --git a/src/org/warp/picalculator/Radice.java b/src/org/warp/picalculator/Root.java similarity index 71% rename from src/org/warp/picalculator/Radice.java rename to src/org/warp/picalculator/Root.java index f114e2d0..517d79d0 100644 --- a/src/org/warp/picalculator/Radice.java +++ b/src/org/warp/picalculator/Root.java @@ -4,24 +4,24 @@ import static org.warp.engine.Display.Render.glDrawLine; import org.nevec.rjm.NumeroAvanzatoVec; -public class Radice extends FunzioneDueValoriBase { +public class Root extends FunctionTwoValuesBase { - public Radice(FunzioneBase value1, FunzioneBase value2) { + public Root(FunctionBase value1, FunctionBase value2) { super(value1, value2); } @Override - public String simbolo() { - return Simboli.NTH_ROOT; + public String getSymbol() { + return MathematicalSymbols.NTH_ROOT; } @Override - public void calcolaGrafica() { + public void generateGraphics() { variable1.setSmall(true); - variable1.calcolaGrafica(); + variable1.generateGraphics(); variable2.setSmall(small); - variable2.calcolaGrafica(); + variable2.generateGraphics(); width = 1 + variable1.getWidth() + 2 + variable2.getWidth() + 2; height = variable1.getHeight() + variable2.getHeight() - 2; @@ -29,10 +29,10 @@ public class Radice extends FunzioneDueValoriBase { } @Override - public Termine calcola() throws NumberFormatException, Errore { - Termine exponent = new Termine(NumeroAvanzatoVec.ONE); - exponent = exponent.divide(getVariable1().calcola()); - return getVariable2().calcola().pow(exponent); + public Number solve() throws NumberFormatException, Error { + Number exponent = new Number(NumeroAvanzatoVec.ONE); + exponent = exponent.divide(getVariable1().solve()); + return getVariable2().solve().pow(exponent); } @Override diff --git a/src/org/warp/picalculator/RadiceQuadrata.java b/src/org/warp/picalculator/RootSquare.java similarity index 58% rename from src/org/warp/picalculator/RadiceQuadrata.java rename to src/org/warp/picalculator/RootSquare.java index dafeae9b..d627ad79 100644 --- a/src/org/warp/picalculator/RadiceQuadrata.java +++ b/src/org/warp/picalculator/RootSquare.java @@ -2,21 +2,21 @@ package org.warp.picalculator; import org.nevec.rjm.Rational; -public class RadiceQuadrata extends FunzioneAnterioreBase { +public class RootSquare extends AnteriorFunctionBase { - public RadiceQuadrata(FunzioneBase value) { + public RootSquare(FunctionBase value) { super(value); } @Override - public String simbolo() { - return Simboli.SQUARE_ROOT; + public String getSymbol() { + return MathematicalSymbols.SQUARE_ROOT; } @Override - public void calcolaGrafica() { + public void generateGraphics() { variable.setSmall(small); - variable.calcolaGrafica(); + variable.generateGraphics(); height = getVariable().getHeight() + 2; width = 1 + 4 + getVariable().getWidth() + 1; @@ -24,17 +24,17 @@ public class RadiceQuadrata extends FunzioneAnterioreBase { } @Override - public Termine calcola() throws Errore { + public Number solve() throws Error { try { - Termine result = getVariable().calcola(); - result = result.pow(new Termine(new Rational(1, 2))); + Number result = getVariable().solve(); + result = result.pow(new Number(new Rational(1, 2))); return result; } catch(NullPointerException ex) { - throw new Errore(Errori.ERROR); + throw new Error(Errors.ERROR); } catch(NumberFormatException ex) { - throw new Errore(Errori.SYNTAX_ERROR); + throw new Error(Errors.SYNTAX_ERROR); } catch(ArithmeticException ex) { - throw new Errore(Errori.NUMBER_TOO_SMALL); + throw new Error(Errors.NUMBER_TOO_SMALL); } } diff --git a/src/org/warp/picalculator/Sistema.java b/src/org/warp/picalculator/Sistema.java deleted file mode 100644 index 81529f4a..00000000 --- a/src/org/warp/picalculator/Sistema.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.warp.picalculator; - -import static org.warp.engine.Display.Render.glDrawLine; - -public class Sistema extends FunzioneMultipla { - static final int spacing = 2; - - public Sistema() { - super(); - } - - public Sistema(Funzione value) { - super(new Funzione[]{value}); - } - - public Sistema(Funzione[] value) { - super(value); - } - - @Override - public String simbolo() { - return null; - } - - @Override - public Funzione calcola() throws NumberFormatException, Errore { - // TODO implementare il calcolo dei sistemi - return variables[0].calcola(); - } - - @Override - public void calcolaGrafica() { - for (Funzione f : variables) { - f.setSmall(false); - f.calcolaGrafica(); - } - - width = 0; - for (Funzione f : variables) { - if (f.getWidth() > width) { - width = f.getWidth(); - } - } - width += 5; - - height = 3; - for (Funzione f : variables) { - height += f.getHeight()+spacing; - } - height = height - spacing + 2; - - line = height/2; - } - - @Override - public void draw(int x, int y) { - - final int h = this.getHeight() - 1; - final int paddingTop = 3; - final int spazioSotto = (h - 3 - 2) / 2 + paddingTop; - final int spazioSopra = h - spazioSotto; - int dy = paddingTop; - for (Funzione f : variables) { - f.draw(x + 5, y + dy); - dy+=f.getHeight()+spacing; - } - - - glDrawLine(x + 2, y + 0, x + 3, y + 0); - glDrawLine(x + 1, y + 1, x + 1, y + spazioSotto / 2); - glDrawLine(x + 2, y + spazioSotto / 2 + 1, x + 2, y + spazioSotto - 1); - glDrawLine(x + 0, y + spazioSotto, x + 1, y + spazioSotto); - glDrawLine(x + 2, y + spazioSotto + 1, x + 2, y + spazioSotto + spazioSopra / 2 - 1); - glDrawLine(x + 1, y + spazioSotto + spazioSopra / 2, x + 1, y + h - 1); - glDrawLine(x + 2, y + h, x + 3, y + h); - } - - @Override - public int getWidth() { - return width; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getLine() { - return line; - } -} diff --git a/src/org/warp/picalculator/SolveMethod.java b/src/org/warp/picalculator/SolveMethod.java new file mode 100644 index 00000000..33aa4ff7 --- /dev/null +++ b/src/org/warp/picalculator/SolveMethod.java @@ -0,0 +1,9 @@ +package org.warp.picalculator; + +import java.util.ArrayList; + +public interface SolveMethod { + public static final SolveMethod[] techniques = new SolveMethod[] {}; + + public abstract ArrayList solve(Equation equation); +} diff --git a/src/org/warp/picalculator/Sottrazione.java b/src/org/warp/picalculator/Sottrazione.java deleted file mode 100644 index f35d92ab..00000000 --- a/src/org/warp/picalculator/Sottrazione.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.warp.picalculator; - -public class Sottrazione extends FunzioneDueValoriBase { - - public Sottrazione(FunzioneBase value1, FunzioneBase value2) { - super(value1, value2); - } - - @Override - public String simbolo() { - return Simboli.SUBTRACTION; - } - - @Override - public Termine calcola() throws Errore { - return getVariable1().calcola().add(getVariable2().calcola().multiply(new Termine("-1"))); - } - -} \ No newline at end of file diff --git a/src/org/warp/picalculator/Subtraction.java b/src/org/warp/picalculator/Subtraction.java new file mode 100644 index 00000000..06f4dd45 --- /dev/null +++ b/src/org/warp/picalculator/Subtraction.java @@ -0,0 +1,19 @@ +package org.warp.picalculator; + +public class Subtraction extends FunctionTwoValuesBase { + + public Subtraction(FunctionBase value1, FunctionBase value2) { + super(value1, value2); + } + + @Override + public String getSymbol() { + return MathematicalSymbols.SUBTRACTION; + } + + @Override + public Number solve() throws Error { + return getVariable1().solve().add(getVariable2().solve().multiply(new Number("-1"))); + } + +} \ No newline at end of file diff --git a/src/org/warp/picalculator/Somma.java b/src/org/warp/picalculator/Sum.java similarity index 67% rename from src/org/warp/picalculator/Somma.java rename to src/org/warp/picalculator/Sum.java index 0c205f77..3c2ae4d4 100644 --- a/src/org/warp/picalculator/Somma.java +++ b/src/org/warp/picalculator/Sum.java @@ -6,32 +6,32 @@ import static org.warp.engine.Display.Render.glDrawStringLeft; import org.warp.device.PIDisplay; import org.warp.engine.Display; -public class Somma extends FunzioneDueValoriBase { +public class Sum extends FunctionTwoValuesBase { - public Somma(FunzioneBase value1, FunzioneBase value2) { + public Sum(FunctionBase value1, FunctionBase value2) { super(value1, value2); } @Override - public String simbolo() { - return Simboli.SUM; + public String getSymbol() { + return MathematicalSymbols.SUM; } @Override - public Termine calcola() throws Errore { - Termine val1 = getVariable1().calcola(); - Termine val2 = getVariable2().calcola(); - Termine result = val1.add(val2); + public Number solve() throws Error { + Number val1 = getVariable1().solve(); + Number val2 = getVariable2().solve(); + Number result = val1.add(val2); return result; } @Override - public void calcolaGrafica() { + public void generateGraphics() { variable1.setSmall(small); - variable1.calcolaGrafica(); + variable1.generateGraphics(); variable2.setSmall(small); - variable2.calcolaGrafica(); + variable2.generateGraphics(); width = calcWidth(); height = calcHeight(); @@ -54,8 +54,8 @@ public class Somma extends FunzioneDueValoriBase { Display.Render.setFont(PIDisplay.fonts[0]); } dx += 1; - glDrawStringLeft(dx + x, ln - Utils.getFontHeight(small) / 2 + y, simbolo()); - dx += getStringWidth(simbolo()); + glDrawStringLeft(dx + x, ln - Utils.getFontHeight(small) / 2 + y, getSymbol()); + dx += getStringWidth(getSymbol()); variable2.draw(dx + x, ln - variable2.getLine() + y); } @@ -69,7 +69,7 @@ public class Somma extends FunzioneDueValoriBase { int dx = 0; dx += variable1.getWidth(); dx += 1; - dx += getStringWidth(simbolo()); + dx += getStringWidth(getSymbol()); return dx += variable2.getWidth(); } } diff --git a/src/org/warp/picalculator/Tecnica.java b/src/org/warp/picalculator/Tecnica.java deleted file mode 100644 index d166b40c..00000000 --- a/src/org/warp/picalculator/Tecnica.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.warp.picalculator; - -import java.util.ArrayList; - -public interface Tecnica { - public static final Tecnica[] tecniche = new Tecnica[] {}; - - public abstract ArrayList risolvi(Equazione equazione); -} diff --git a/src/org/warp/picalculator/Utils.java b/src/org/warp/picalculator/Utils.java index 0a96e8bf..8a6a2338 100644 --- a/src/org/warp/picalculator/Utils.java +++ b/src/org/warp/picalculator/Utils.java @@ -80,15 +80,15 @@ public class Utils { return c; } - public static boolean ciSonoSoloFunzioniImpostateSommeEquazioniESistemi(ArrayList fl) { + public static boolean areThereOnlySettedUpFunctionsSumsEquationsAndSystems(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (!(fl.get(i) instanceof Termine || fl.get(i) instanceof Somma || fl.get(i) instanceof Equazione || fl.get(i) instanceof ParteSistema || fl.get(i) instanceof Espressione)) { - if (fl.get(i) instanceof FunzioneAnterioreBase) { - if (((FunzioneAnterioreBase) fl.get(i)).variable == null) { + if (!(fl.get(i) instanceof Number || fl.get(i) instanceof Sum || fl.get(i) instanceof Equation || fl.get(i) instanceof EquationsSystemPart || fl.get(i) instanceof Expression)) { + if (fl.get(i) instanceof AnteriorFunctionBase) { + if (((AnteriorFunctionBase) fl.get(i)).variable == null) { return false; } - } else if (fl.get(i) instanceof FunzioneDueValoriBase) { - if (((FunzioneDueValoriBase) fl.get(i)).variable1 == null || ((FunzioneDueValoriBase) fl.get(i)).variable2 == null) { + } else if (fl.get(i) instanceof FunctionTwoValuesBase) { + if (((FunctionTwoValuesBase) fl.get(i)).variable1 == null || ((FunctionTwoValuesBase) fl.get(i)).variable2 == null) { return false; } } else { @@ -99,15 +99,15 @@ public class Utils { return true; } - public static boolean ciSonoSoloFunzioniImpostateSommeMoltiplicazioniEquazioniESistemi(ArrayList fl) { + public static boolean areThereOnlySettedUpFunctionsSumsMultiplicationsEquationsAndSystems(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (!(fl.get(i) instanceof Termine || fl.get(i) instanceof Moltiplicazione || fl.get(i) instanceof MoltiplicazionePrioritaria || fl.get(i) instanceof Somma || fl.get(i) instanceof Equazione || fl.get(i) instanceof ParteSistema || fl.get(i) instanceof Espressione)) { - if (fl.get(i) instanceof FunzioneAnterioreBase) { - if (((FunzioneAnterioreBase) fl.get(i)).variable == null) { + if (!(fl.get(i) instanceof Number || fl.get(i) instanceof Multiplication || fl.get(i) instanceof PrioritaryMultiplication || fl.get(i) instanceof Sum || fl.get(i) instanceof Equation || fl.get(i) instanceof EquationsSystemPart || fl.get(i) instanceof Expression)) { + if (fl.get(i) instanceof AnteriorFunctionBase) { + if (((AnteriorFunctionBase) fl.get(i)).variable == null) { return false; } - } else if (fl.get(i) instanceof FunzioneDueValoriBase) { - if (((FunzioneDueValoriBase) fl.get(i)).variable1 == null || ((FunzioneDueValoriBase) fl.get(i)).variable2 == null) { + } else if (fl.get(i) instanceof FunctionTwoValuesBase) { + if (((FunctionTwoValuesBase) fl.get(i)).variable1 == null || ((FunctionTwoValuesBase) fl.get(i)).variable2 == null) { return false; } } else { @@ -118,15 +118,15 @@ public class Utils { return true; } - public static boolean ciSonoSoloFunzioniImpostateEquazioniESistemi(ArrayList fl) { + public static boolean areThereOnlySettedUpFunctionsEquationsAndSystems(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (!(fl.get(i) instanceof Termine || fl.get(i) instanceof Equazione || fl.get(i) instanceof ParteSistema || fl.get(i) instanceof Espressione)) { - if (fl.get(i) instanceof FunzioneAnterioreBase) { - if (((FunzioneAnterioreBase) fl.get(i)).variable == null) { + if (!(fl.get(i) instanceof Number || fl.get(i) instanceof Equation || fl.get(i) instanceof EquationsSystemPart || fl.get(i) instanceof Expression)) { + if (fl.get(i) instanceof AnteriorFunctionBase) { + if (((AnteriorFunctionBase) fl.get(i)).variable == null) { return false; } - } else if (fl.get(i) instanceof FunzioneDueValoriBase) { - if (((FunzioneDueValoriBase) fl.get(i)).variable1 == null || ((FunzioneDueValoriBase) fl.get(i)).variable2 == null) { + } else if (fl.get(i) instanceof FunctionTwoValuesBase) { + if (((FunctionTwoValuesBase) fl.get(i)).variable1 == null || ((FunctionTwoValuesBase) fl.get(i)).variable2 == null) { return false; } } else { @@ -137,15 +137,15 @@ public class Utils { return true; } - public static boolean ciSonoSoloFunzioniImpostateESistemi(ArrayList fl) { + public static boolean areThereOnlySettedUpFunctionsAndSystems(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (!(fl.get(i) instanceof Termine || fl.get(i) instanceof Equazione || fl.get(i) instanceof ParteSistema || fl.get(i) instanceof Espressione)) { - if (fl.get(i) instanceof FunzioneAnterioreBase) { - if (((FunzioneAnterioreBase) fl.get(i)).variable == null) { + if (!(fl.get(i) instanceof Number || fl.get(i) instanceof Equation || fl.get(i) instanceof EquationsSystemPart || fl.get(i) instanceof Expression)) { + if (fl.get(i) instanceof AnteriorFunctionBase) { + if (((AnteriorFunctionBase) fl.get(i)).variable == null) { return false; } - } else if (fl.get(i) instanceof FunzioneDueValoriBase) { - if (((FunzioneDueValoriBase) fl.get(i)).variable1 == null || ((FunzioneDueValoriBase) fl.get(i)).variable2 == null) { + } else if (fl.get(i) instanceof FunctionTwoValuesBase) { + if (((FunctionTwoValuesBase) fl.get(i)).variable1 == null || ((FunctionTwoValuesBase) fl.get(i)).variable2 == null) { return false; } } else { @@ -156,10 +156,10 @@ public class Utils { return true; } - public static boolean ciSonoFunzioniSNnonImpostate(ArrayList fl) { + public static boolean areThereOnlyEmptySNFunctions(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (fl.get(i) instanceof FunzioneAnterioreBase) { - if (((FunzioneAnterioreBase) fl.get(i)).variable == null) { + if (fl.get(i) instanceof AnteriorFunctionBase) { + if (((AnteriorFunctionBase) fl.get(i)).variable == null) { return true; } } @@ -167,10 +167,10 @@ public class Utils { return false; } - public static boolean ciSonoFunzioniNSNnonImpostate(ArrayList fl) { + public static boolean areThereOnlyEmptyNSNFunctions(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (fl.get(i) instanceof FunzioneDueValoriBase && !(fl.get(i) instanceof Somma) && !(fl.get(i) instanceof Sottrazione) && !(fl.get(i) instanceof Moltiplicazione) && !(fl.get(i) instanceof MoltiplicazionePrioritaria) && !(fl.get(i) instanceof Divisione)) { - if (((FunzioneDueValoriBase) fl.get(i)).variable1 == null && ((FunzioneDueValoriBase) fl.get(i)).variable2 == null) { + if (fl.get(i) instanceof FunctionTwoValuesBase && !(fl.get(i) instanceof Sum) && !(fl.get(i) instanceof Subtraction) && !(fl.get(i) instanceof Multiplication) && !(fl.get(i) instanceof PrioritaryMultiplication) && !(fl.get(i) instanceof Division)) { + if (((FunctionTwoValuesBase) fl.get(i)).variable1 == null && ((FunctionTwoValuesBase) fl.get(i)).variable2 == null) { return true; } } @@ -179,10 +179,10 @@ public class Utils { } - public static boolean ciSonoMoltiplicazioniPrioritarieNonImpostate(ArrayList funzioniOLD) { + public static boolean areThereEmptyPrioritaryMultiplications(ArrayList funzioniOLD) { for (int i = 0; i < funzioniOLD.size(); i++) { - if (funzioniOLD.get(i) instanceof MoltiplicazionePrioritaria) { - if (((FunzioneDueValoriBase) funzioniOLD.get(i)).variable1 == null && ((FunzioneDueValoriBase) funzioniOLD.get(i)).variable2 == null) { + if (funzioniOLD.get(i) instanceof PrioritaryMultiplication) { + if (((FunctionTwoValuesBase) funzioniOLD.get(i)).variable1 == null && ((FunctionTwoValuesBase) funzioniOLD.get(i)).variable2 == null) { return true; } } @@ -190,10 +190,10 @@ public class Utils { return false; } - public static boolean ciSonoMoltiplicazioniNonImpostate(ArrayList fl) { + public static boolean areThereEmptyMultiplications(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (fl.get(i) instanceof Moltiplicazione || fl.get(i) instanceof Divisione) { - if (((FunzioneDueValoriBase) fl.get(i)).variable1 == null && ((FunzioneDueValoriBase) fl.get(i)).variable2 == null) { + if (fl.get(i) instanceof Multiplication || fl.get(i) instanceof Division) { + if (((FunctionTwoValuesBase) fl.get(i)).variable1 == null && ((FunctionTwoValuesBase) fl.get(i)).variable2 == null) { return true; } } @@ -201,10 +201,10 @@ public class Utils { return false; } - public static boolean ciSonoSommeNonImpostate(ArrayList fl) { + public static boolean areThereEmptySums(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (fl.get(i) instanceof Somma) { - if (((FunzioneDueValoriBase) fl.get(i)).variable1 == null && ((FunzioneDueValoriBase) fl.get(i)).variable2 == null) { + if (fl.get(i) instanceof Sum) { + if (((FunctionTwoValuesBase) fl.get(i)).variable1 == null && ((FunctionTwoValuesBase) fl.get(i)).variable2 == null) { return true; } } @@ -212,10 +212,10 @@ public class Utils { return false; } - public static boolean ciSonoSistemiNonImpostati(ArrayList fl) { + public static boolean areThereEmptySystems(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (fl.get(i) instanceof ParteSistema) { - if (((ParteSistema) fl.get(i)).variable == null) { + if (fl.get(i) instanceof EquationsSystemPart) { + if (((EquationsSystemPart) fl.get(i)).variable == null) { return true; } } @@ -223,15 +223,15 @@ public class Utils { return false; } - public static boolean ciSonoAltreFunzioniImpostate(ArrayList fl) { + public static boolean areThereOtherSettedUpFunctions(ArrayList fl) { for (int i = 0; i < fl.size(); i++) { - if (!(fl.get(i) instanceof Termine || fl.get(i) instanceof Somma || fl.get(i) instanceof Espressione || fl.get(i) instanceof FunzioneAnterioreBase || fl.get(i) instanceof Moltiplicazione || fl.get(i) instanceof MoltiplicazionePrioritaria || fl.get(i) instanceof Divisione)) { - if (fl.get(i) instanceof FunzioneAnterioreBase) { - if (((FunzioneAnterioreBase) fl.get(i)).variable == null) { + if (!(fl.get(i) instanceof Number || fl.get(i) instanceof Sum || fl.get(i) instanceof Expression || fl.get(i) instanceof AnteriorFunctionBase || fl.get(i) instanceof Multiplication || fl.get(i) instanceof PrioritaryMultiplication || fl.get(i) instanceof Division)) { + if (fl.get(i) instanceof AnteriorFunctionBase) { + if (((AnteriorFunctionBase) fl.get(i)).variable == null) { return true; } - } else if (fl.get(i) instanceof FunzioneDueValoriBase) { - if (((FunzioneDueValoriBase) fl.get(i)).variable1 == null || ((FunzioneDueValoriBase) fl.get(i)).variable2 == null) { + } else if (fl.get(i) instanceof FunctionTwoValuesBase) { + if (((FunctionTwoValuesBase) fl.get(i)).variable1 == null || ((FunctionTwoValuesBase) fl.get(i)).variable2 == null) { return true; } } else { @@ -245,13 +245,13 @@ public class Utils { public static Rational getRational(BigDecimal str) { try { return getRational(str.toString()); - } catch (Errore e) { + } catch (Error e) { //E' IMPOSSIBILE CHE VENGA THROWATO UN ERRORE return new Rational("0"); } } - public static Rational getRational(String str) throws Errore { + public static Rational getRational(String str) throws Error { try { return new Rational(str); } catch (NumberFormatException ex) { @@ -304,11 +304,11 @@ public class Utils { return BigDecimalMath.divideRound(new BigDecimal(r.numer()).setScale(Utils.scale, Utils.scaleMode), new BigDecimal(r.denom()).setScale(Utils.scale, Utils.scaleMode)); } - public static boolean variabiliUguali(ArrayList variables, ArrayList variables2) { + public static boolean equalsVariables(ArrayList variables, ArrayList variables2) { if (variables.size() != variables2.size()) { return false; } else { - for (Incognita v : variables) { + for (Variable v : variables) { if (!variables2.contains(v)) { return false; } @@ -317,7 +317,7 @@ public class Utils { } } - public static void writeSquareRoot(Funzione var, int x, int y, boolean small) { + public static void writeSquareRoot(Function var, int x, int y, boolean small) { var.setSmall(small); int w1 = var.getWidth(); int h1 = var.getHeight(); diff --git a/src/org/warp/picalculator/Variable.java b/src/org/warp/picalculator/Variable.java new file mode 100644 index 00000000..4ee95512 --- /dev/null +++ b/src/org/warp/picalculator/Variable.java @@ -0,0 +1,40 @@ +package org.warp.picalculator; + +import org.nevec.rjm.Rational; + +public class Variable { + public char symbol = 'X'; + public Rational exponent = Rational.ONE; + + public Variable(char simbolo, Rational esponente) { + this.symbol = simbolo; + this.exponent = esponente; + } + + public Variable(char simbolo, int a, int b) { + this.symbol = simbolo; + this.exponent = new Rational(a, b); + } + + public Variable(char simbolo) { + this.symbol = simbolo; + this.exponent = new Rational(1, 1); + } + + @Override + public boolean equals(Object o) { + if (o instanceof Variable) { + if (this.symbol == ((Variable) o).symbol) { + if (this.exponent == ((Variable) o).exponent) { + return true; + } + } + } + return false; + } + + @Override + public int hashCode() { + return Character.getNumericValue(symbol) * 3 + exponent.hashCode(); + } +} diff --git a/src/org/warp/picalculator/Variables.java b/src/org/warp/picalculator/Variables.java new file mode 100644 index 00000000..ae794bcc --- /dev/null +++ b/src/org/warp/picalculator/Variables.java @@ -0,0 +1,391 @@ +package org.warp.picalculator; + +import java.math.BigInteger; +import java.util.Comparator; +import java.util.Vector; + +import org.nevec.rjm.BigIntegerMath; +import org.nevec.rjm.Rational; + +public class Variables { + + Vector variables; + + public Variables() { + variables = new Vector(); + } + + public Variables(Variable[] value) { + this(); + for (Variable i : value) { + variables.add(i); + } + } + + public Variables(Vector value) { + this(); + variables = value; + } + + public Variables(Variable value) { + this(); + variables.add(value); + } + + public int count() { + return variables.size(); + } + + public boolean containsSymbol(char simbolo) { + for (Variable i : variables) { + if (i.symbol == simbolo) { + return true; + } + } + return false; + } + + public Rational getExponentOfSymbol(char simbolo) { + for (Variable i : variables) { + if (i.symbol == simbolo) { + return i.exponent; + } + } + return new Rational(0, 1); + } + + public void setExponentOfSymbol(char simbolo, Rational esponente) { + for (Variable i : variables) { + if (i.symbol == simbolo) { + i.exponent = esponente; + } + } + } + + @SuppressWarnings("unchecked") + @Override + public Variables clone() { + return new Variables((Vector) variables.clone()).normalize(); + } + + public Variables multiply(Variables val) { + Variables result = new Variables(); + // Passaggio 1: test vari + // Se il primo gruppo di incognite à nullo allora ritorna il secondo + // gruppo + if (this.count() == 0) { + result = val.clone(); + return result; + } + // Se il secondo gruppo di incognite à nullo allora ritorna il primo + // gruppo + if (val.count() == 0) { + result = this.clone(); + return result; + } + + // Passaggio 2: le incognite doppie vengono raggruppate. + for (Variable i1 : variables) { + for (Variable i2 : val.variables) { + if (i1.symbol == i2.symbol) { + if (!result.containsSymbol(i1.symbol)) { + Variable ir = new Variable(i1.symbol, i1.exponent.add(i2.exponent)); + result.variables.add(ir); + } + } + } + } + // Passaggio 3: le incognite non ancora presenti vengono aggiunte. + for (Variable i : variables) { + if (!result.containsSymbol(i.symbol)) { + result.variables.add(i); + } + } + for (Variable i : val.variables) { + if (!result.containsSymbol(i.symbol)) { + result.variables.add(i); + } + } + return result.normalize(); + } + + public Variables divide(Variables val) { + Variables result = new Variables(); + + // Passaggio 2: le incognite doppie vengono raggruppate. + for (Variable i1 : variables) { + for (Variable i2 : val.variables) { + if (i1.symbol == i2.symbol) { + if (!result.containsSymbol(i1.symbol)) { + Variable ir = new Variable(i1.symbol, i1.exponent.add(i2.exponent.multiply(new Rational(-1, 1)))); + result.variables.add(ir); + } + } + } + } + // Passaggio 3: le incognite non ancora presenti vengono aggiunte. + for (Variable i : variables) { + if (!result.containsSymbol(i.symbol)) { + result.variables.add(i); + } + } + for (Variable i : val.variables) { + if (!result.containsSymbol(i.symbol)) { + result.variables.add(new Variable(i.symbol, i.exponent.multiply(new Rational(-1, 1)))); + } + } + return result.normalize(); + } + + public Variables sqrt() { + Variables result = new Variables(); + for (Variable i1 : variables) { + Variable ir = null; + try { + ir = new Variable(i1.symbol, i1.exponent.divide(new Rational(2, 1))); + } catch (Error e) { + e.printStackTrace(); + } + result.variables.add(ir); + } + return result.normalize(); + } + + public Variables normalize() { + Variables result = new Variables(); + for (Variable i1 : variables) { + if (i1.exponent.compareTo(Rational.ZERO) != 0) { + result.variables.add(i1); + } + } + result.variables.sort(new Comparator() { + @Override + public int compare(Variable o1, Variable o2) { + int index1 = letterIndex(o1.symbol); + int index2 = letterIndex(o2.symbol); + return index1 - index2; + } + }); + return result; + } + + public byte letterIndex(char l) { + return letterIndex(l, false); + } + + public static byte letterIndex(char l, boolean reverse) { + int total = MathematicalSymbols.variables().length - 1; + for (byte x = 0; x < MathematicalSymbols.variables().length; x++) { + if (MathematicalSymbols.variables()[x].equals("" + l)) { + if (reverse) { + return (byte) (total - x); + } else { + return x; + } + } + } + + return -1; + } + + public boolean compareTo(Variables val) { + if (this.equals(val)) + return true; + return false; + } + + @Override + public boolean equals(Object val) { + if (val == null) + return false; + if (val instanceof Variables) { + Variables ii2 = (Variables) val; + for (Variable i1 : variables) { + boolean found = false; + for (Variable i2 : ii2.variables) { + if (i1.symbol == i2.symbol) { + if (i1.exponent.compareTo(i2.exponent) != 0) + return false; + found = true; + } + } + if (!found) { + return false; + } + } + for (Variable i1 : ii2.variables) { + boolean found = false; + for (Variable i2 : variables) { + if (i1.symbol == i2.symbol) { + if (i1.exponent.compareTo(i2.exponent) != 0) + return false; + found = true; + } + } + if (!found) { + return false; + } + } + return true; + } + return false; + } + + @Override + public String toString() { + String result = ""; + if (variables.size() != 1) { + for (Variable i : variables) { + if (i.exponent.compareTo(Rational.ONE) != 0) { + result += "(" + i.symbol + "^" + i.exponent + ")"; + } else { + result += i.symbol; + } + } + } else if (variables.size() == 1) { + Variable i = variables.get(0); + if (i.exponent.compareTo(Rational.ONE) != 0) { + result += "" + i.symbol + "^" + i.exponent + ""; + } else if (i.exponent.compareTo(Rational.ONE) == 0) { + result += i.symbol; + } + } + return result; + } + + public static Variables lcm(Variables val1, Variables val2) { + Variables result = new Variables(); + // Passaggio 1: test vari + // Se il primo gruppo di incognite à nullo allora ritorna il secondo + // gruppo + if (val1.count() == 0) { + result = val2.clone(); + return result; + } + // Se il secondo gruppo di incognite à nullo allora ritorna il primo + // gruppo + if (val2.count() == 0) { + result = val1.clone(); + return result; + } + + // Passaggio 2: le incognite doppie vengono raggruppate. + for (Variable i1 : val1.variables) { + for (Variable i2 : val2.variables) { + if (i1.symbol == i2.symbol) { + if (!result.containsSymbol(i1.symbol)) { + Variable ir = new Variable(i1.symbol); + if (i1.exponent.compareTo(i2.exponent) > 0) { + ir.exponent = i1.exponent; + } else { + ir.exponent = i2.exponent; + } + result.variables.add(ir); + } + } + } + } + // Passaggio 3: le incognite non ancora presenti vengono aggiunte. + for (Variable i : val1.variables) { + if (!result.containsSymbol(i.symbol)) { + result.variables.add(i); + } + } + for (Variable i : val2.variables) { + if (!result.containsSymbol(i.symbol)) { + result.variables.add(i); + } + } + return result.normalize(); + } + + @SuppressWarnings("unchecked") + public Vector getVariablesList() { + return (Vector) this.variables.clone(); + } + + public static Variables[] normalizeBigSurdVariables(Variables[] incognitetemp) throws Error { + Variables incognitex = incognitetemp[0].clone(); + Variables incognitey = incognitetemp[1].clone(); + Variables incognitez = incognitetemp[2].clone(); + + Variables newincognitex = new Variables(); + for (Variable i : incognitex.variables) { + Vector divisori = BigIntegerMath.divisors(i.exponent.divide(2).denom()); + if (divisori.contains(new BigInteger("2"))) { + newincognitex = newincognitex.multiply(new Variables(i)); + } else { + incognitey = incognitey.multiply(new Variables(new Variable(i.symbol, i.exponent.divide(2)))); + } + } + incognitex = newincognitex; + + for (Variable i : incognitey.variables) { + if (i.exponent.signum() < 0) { + incognitey = incognitey.divide(new Variables(i)); + incognitez = incognitez.divide(new Variables(i)); + } + } + for (Variable i : incognitez.variables) { + if (i.exponent.signum() < 0) { + incognitey = incognitey.divide(new Variables(i)); + incognitez = incognitez.divide(new Variables(i)); + } + } + + // TODO: SPOSTARE LE Y NEGATIVE SOTTO LA FRAZIONE, DALLA Y ALLA Z + + Variables incogniteyresult = new Variables(); + Variables incognitezresult = new Variables(); + // Le incognite doppie vengono tolte + for (Variable i1 : incognitey.variables) { + for (Variable i2 : incognitez.variables) { + if (i1.symbol == i2.symbol) { + if (i1.exponent.compareTo(i2.exponent) > 0) { + incogniteyresult = incogniteyresult.multiply(new Variables(new Variable(i1.symbol, i1.exponent.subtract(i2.exponent)))); + } else if (i2.exponent.compareTo(i1.exponent) > 0) { + incognitezresult = incognitezresult.multiply(new Variables(new Variable(i1.symbol, i2.exponent.subtract(i1.exponent)))); + } + } + } + } + + // Le altre incognite vengono ri-messe + for (Variable i : incognitey.variables) { + if (!incogniteyresult.containsSymbol(i.symbol)) { + incogniteyresult = incogniteyresult.multiply(new Variables(i)); + } + } + for (Variable i : incognitez.variables) { + if (!incognitezresult.containsSymbol(i.symbol)) { + incognitezresult = incognitezresult.multiply(new Variables(i)); + } + } + + incognitey = incogniteyresult; + incognitez = incognitezresult; + + return new Variables[] { incognitex, incognitey, incognitez }; + } + + public static int priority(Variables ii) { + double priorità = 0; + double letterMax = 0; + for (Variable i : ii.variables) { + int lettIndex = letterIndex(i.symbol, true); + if (lettIndex > letterMax) { + letterMax = lettIndex; + } + } + priorità += letterMax * 100000; + + for (Variable i : ii.variables) { + int lettIndex = letterIndex(i.symbol, true); + if (letterMax == lettIndex) { + priorità += i.exponent.doubleValue() * 100000; + } + priorità += +i.exponent.doubleValue(); + } + return (int) priorità; + } +} diff --git a/src/org/warp/picalculator/screens/EquationScreen.java b/src/org/warp/picalculator/screens/EquationScreen.java index ebd96b34..52a086ab 100644 --- a/src/org/warp/picalculator/screens/EquationScreen.java +++ b/src/org/warp/picalculator/screens/EquationScreen.java @@ -1,8 +1,6 @@ package org.warp.picalculator.screens; -import static org.warp.engine.Display.Render.glClearColor; -import static org.warp.engine.Display.Render.glDrawStringLeft; -import static org.warp.engine.Display.Render.setFont; +import static org.warp.engine.Display.Render.*; import java.io.PrintWriter; import java.io.StringWriter; @@ -12,9 +10,9 @@ import org.warp.device.PIDisplay; import org.warp.engine.Display; import org.warp.engine.Screen; import org.warp.picalculator.Calculator; -import org.warp.picalculator.Errore; -import org.warp.picalculator.Errori; -import org.warp.picalculator.Funzione; +import org.warp.picalculator.Error; +import org.warp.picalculator.Errors; +import org.warp.picalculator.Function; import org.warp.picalculator.Utils; public class EquationScreen extends Screen { @@ -25,8 +23,8 @@ public class EquationScreen extends Screen { public volatile int caretPos = 0; public volatile boolean showCaret = true; public volatile float showCaretDelta = 0f; - public Funzione f; - public Funzione f2; + public Function f; + public Function f2; public int ew1; public int ew2; public int eh2; @@ -37,8 +35,8 @@ public class EquationScreen extends Screen { public boolean aftersleep; public boolean autoscroll; public int errorLevel = 0; // 0 = nessuno, 1 = risultato, 2 = tutto - public Errore err1; - public Errore err2; + public Error err1; + public Error err2; boolean mustRefresh = true; public EquationScreen() { @@ -109,7 +107,7 @@ public class EquationScreen extends Screen { // System.out.println("Time elapsed: " + (double) timeElapsed / // 1000000 + " milliseconds\n"); - } catch (Errore e) { + } catch (Error e) { glClearColor(0xFFDC3C32); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); @@ -120,13 +118,13 @@ public class EquationScreen extends Screen { } } - public void interpreta(String eqn) throws Errore { + public void interpreta(String eqn) throws Error { equazioneCorrente = eqn; - f = Calculator.interpreta(equazioneCorrente.replace("sqrt", "Ⓐ").replace("^", "Ⓑ")); - f.calcolaGrafica(); + f = Calculator.parseString(equazioneCorrente.replace("sqrt", "Ⓐ").replace("^", "Ⓑ")); + f.generateGraphics(); } - public void solve() throws Errore { + public void solve() throws Error { Calculator.solve(); } @@ -148,6 +146,7 @@ public class EquationScreen extends Screen { public void render() { setFont(PIDisplay.fonts[0]); glClearColor(0xFFCCE7D4); + glColor3f(0, 0, 0); glDrawStringLeft(2, 22, nuovaEquazione.substring(0, caretPos)+(showCaret?"|":"")+nuovaEquazione.substring(((showCaret==false||nuovaEquazione.length()<=caretPos)?caretPos:caretPos+1), nuovaEquazione.length())); if (f != null) f.draw(2, 22+1+9+1); @@ -185,9 +184,9 @@ public class EquationScreen extends Screen { interpreta(nuovaEquazione); solve(); } catch (Exception ex) { - throw new Errore(Errori.ERROR); + throw new Error(Errors.ERROR); } - } catch (Errore e) { + } catch (Error e) { glClearColor(0xFFDC3C32); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); diff --git a/src/org/warp/picalculator/screens/MarioScreen.java b/src/org/warp/picalculator/screens/MarioScreen.java index fea27e62..8a212db7 100644 --- a/src/org/warp/picalculator/screens/MarioScreen.java +++ b/src/org/warp/picalculator/screens/MarioScreen.java @@ -21,8 +21,19 @@ public class MarioScreen extends Screen { private int[] skin; private int[] skinSize; + private int[] ground; + private int[] groundSize; private boolean errored; - public int posX = 0; + public float[] marioPos = new float[]{30,0}; + public float[] marioForces = new float[]{0,0}; + public float walkAnimation = 0; + public float jumptime = 0; + public boolean walking = false; + public boolean running = false; + public boolean jumping = false; + public boolean flipped = false; + public boolean onGround = true; + public int[] marioSkinPos = new int[]{0,0}; public MarioScreen() { super(); @@ -40,6 +51,14 @@ public class MarioScreen extends Screen { e.printStackTrace(); errored = true; } + try { + img = ImageIO.read(Main.instance.getClass().getResource("/marioground.png")); + ground = getMatrixOfImage(img); + groundSize = new int[] { img.getWidth(), img.getHeight() }; + } catch (IOException e) { + e.printStackTrace(); + errored = true; + } } @Override @@ -52,9 +71,69 @@ public class MarioScreen extends Screen { @Override public void beforeRender(float dt) { if (!errored) { - if (Keyboard.isKeyDown(2, 5)) { //RIGHT - posX+=1; + walkAnimation += dt; + boolean rightPressed = Keyboard.isKeyDown(2, 5); + boolean leftPressed = Keyboard.isKeyDown(2, 3); + boolean jumpPressed = Keyboard.isKeyDown(2, 1); + if ((leftPressed | rightPressed) == (leftPressed & rightPressed)) { + walking = false; + walkAnimation = 0; + } else { + if (rightPressed) { //RIGHT + if (marioForces[0] < 500f) { + marioForces[0] += dt*500f; + } + walking = true; + flipped = false; + } + if (leftPressed) { //LEFT + if (marioForces[0] > -500f) { + marioForces[0] -= dt*500f; + } + walking = true; + flipped = true; + } } + if (jumpPressed) { //JUMP + jumptime+=dt; + if (!jumping && onGround) { + marioForces[1] = dt*(4*1569.6f); + jumping = true; + onGround = false; + } else if (jumptime <= 0.5f) { + marioForces[1] = dt*(4*1569.6f); + } + } else { + jumping = false; + jumptime = 0; + } + if (!walking & !running & !jumping) { + marioSkinPos[0] = 0; + marioSkinPos[1] = 0; + } else if (onGround & walking & !running & !jumping && walkAnimation >= 0.08) { + while(walkAnimation > 0.08) { + walkAnimation -= 0.08; + if (marioSkinPos[0] == 1 & marioSkinPos[1] == 0) { + marioSkinPos[0] += 2; + } else if (marioSkinPos[0] == 3 & marioSkinPos[1] == 0) { + marioSkinPos[0] -= 1; + } else if (marioSkinPos[0] == 2 & marioSkinPos[1] == 0) { + marioSkinPos[0] -= 1; + } else { + marioSkinPos[0] = 1; + marioSkinPos[1] = 0; + } + } + } else if (jumping) { + marioSkinPos[0] = 5; + marioSkinPos[1] = 1; + } + marioForces[1] -= dt*1569.6; + marioPos[0] += dt*marioForces[0]; + if (!onGround) { + marioPos[1] -= dt*marioForces[1]; + } + marioForces[0] *= 0.75; } } @@ -64,8 +143,28 @@ public class MarioScreen extends Screen { glDrawStringLeft(0, 20, "ERROR"); } else { setFont(PIDisplay.fonts[0]); - glClearColor(0xFFCCE7D4); - glDrawSkin(skinSize[0], skin, posX, 25, 36, 1, 70, 27, true); + glClearColor(0xff9290ff); + glDrawSkin(groundSize[0], ground, 0, 25+25, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16, 25+25, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*2, 25+25, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*3, 25+25, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*4, 25+25, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*5, 25+25, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*6, 25+25, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*7, 25+25, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*8, 25+25, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 0, 25+25+16, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16, 25+25+16, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*2, 25+25+16, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*3, 25+25+16, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*4, 25+25+16, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*5, 25+25+16, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*6, 25+25+16, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*7, 25+25+16, 0, 0, 16, 16, false); + glDrawSkin(groundSize[0], ground, 16*8, 25+25+16, 0, 0, 16, 16, false); + + //DRAW MARIO + glDrawSkin(skinSize[0], skin, getPosX()-18, 25+getPosY(), 35*(marioSkinPos[0]+(flipped?2:1)), 27*marioSkinPos[1], 35*(marioSkinPos[0]+(flipped?1:2)), 27*(marioSkinPos[1]+1), true); } } @@ -83,5 +182,13 @@ public class MarioScreen extends Screen { public boolean keyPressed(Key k) { return false; } + + private int getPosX() { + return (int)marioPos[0]; + } + + private int getPosY() { + return (int)marioPos[1]; + } } diff --git a/src/org/warp/picalculator/screens/SolveEquationScreen.java b/src/org/warp/picalculator/screens/SolveEquationScreen.java index 35caa3f7..b98cf96e 100644 --- a/src/org/warp/picalculator/screens/SolveEquationScreen.java +++ b/src/org/warp/picalculator/screens/SolveEquationScreen.java @@ -1,12 +1,12 @@ package org.warp.picalculator.screens; -import static org.warp.engine.Display.Render.glDrawStringCenter; +import static org.warp.engine.Display.Render.*; import org.warp.device.Keyboard.Key; import org.warp.engine.Display; import org.warp.engine.Screen; import org.warp.picalculator.Calculator; -import org.warp.picalculator.Errore; +import org.warp.picalculator.Error; import org.warp.picalculator.Main; public class SolveEquationScreen extends Screen { @@ -30,7 +30,12 @@ public class SolveEquationScreen extends Screen { @Override public void render() { - glDrawStringCenter(Display.getWidth()/2, 29, "ciaoooooooooooooooooooooooooooooo"); + glColor4f(0, 0, 0, 64); + glDrawStringCenter(Main.screenSize[0]/2+1, Main.screenSize[1]/4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + glDrawStringCenter(Main.screenSize[0]/2, Main.screenSize[1]/4+1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + glDrawStringCenter(Main.screenSize[0]/2+1, Main.screenSize[1]/4+1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + glColor3f(255, 0, 0); + glDrawStringCenter(Main.screenSize[0]/2, Main.screenSize[1]/4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); } @Override @@ -50,7 +55,7 @@ public class SolveEquationScreen extends Screen { Main.d.goBack(); try { Calculator.solve('X'); - } catch (Errore e) { + } catch (Error e) { Screen scr = Main.d.getScreen(); if (scr instanceof EquationScreen) { EquationScreen escr = (EquationScreen) scr;