From 9fce4683ab842313c70cc4c6309c9cd119101673 Mon Sep 17 00:00:00 2001 From: Simon Feiden Date: Thu, 30 Jul 2015 17:30:12 +0200 Subject: [PATCH 01/13] fixed typo --- src/main/java/org/math/plot/PlotPanel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/math/plot/PlotPanel.java b/src/main/java/org/math/plot/PlotPanel.java index ac169d0..189d8d5 100644 --- a/src/main/java/org/math/plot/PlotPanel.java +++ b/src/main/java/org/math/plot/PlotPanel.java @@ -94,7 +94,7 @@ public void addLegend(String location) { plotLegend = new LegendPanel(this, LegendPanel.INVISIBLE); // add(legends, BorderLayout.NORTH); } else { - System.err.println("Orientation " + location + " is unknonw."); + System.err.println("Orientation " + location + " is unknown."); } } @@ -150,7 +150,7 @@ public void addPlotToolBar(String location) { plotToolBar.setFloatable(false); add(plotToolBar, NORTH); } else { - System.err.println("Location " + location + " is unknonw."); + System.err.println("Location " + location + " is unknown."); } } From 51430a903a109c11e6ab4ce484859cbbd5a56a0c Mon Sep 17 00:00:00 2001 From: Yann Richet Date: Thu, 4 Feb 2016 17:07:44 +0100 Subject: [PATCH 02/13] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 99a1f1d..25ec9d8 100644 --- a/README.md +++ b/README.md @@ -54,3 +54,5 @@ Then - create a new PlotPanel instance: `PlotPanel plot = new Plot2DPanel();` - add a plot inside `plot.addLinePlot("my plot", x, y);` - use the PlotPanel as any Swing component (all PlotPanel extends JPanel, in fact) + +![Analytics](https://ga-beacon.appspot.com/UA-109580-20/jmathplot) From b7b22ad36dc139972144fe7b24de9c2d85ee897f Mon Sep 17 00:00:00 2001 From: Yann Richet Date: Wed, 27 Jul 2016 16:46:15 +0200 Subject: [PATCH 03/13] support for NaN values in line plot : skip data point --- src/main/java/org/math/plot/plots/LinePlot.java | 9 +++++++++ src/main/java/org/math/plot/utils/Array.java | 16 ++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/math/plot/plots/LinePlot.java b/src/main/java/org/math/plot/plots/LinePlot.java index cf1c309..4bd8690 100644 --- a/src/main/java/org/math/plot/plots/LinePlot.java +++ b/src/main/java/org/math/plot/plots/LinePlot.java @@ -33,9 +33,17 @@ public void plot(AbstractDrawer draw, Color c) { draw.setColor(c); draw.setLineType(AbstractDrawer.CONTINOUS_LINE); for (int i = 0; i < XY.length - 1; i++) + if (!anyNaN(XY[i]) && !anyNaN(XY[i+1])) draw.drawLine(XY[i], XY[i + 1]); } + boolean anyNaN(double[] xy) { + for (int i = 0; i < xy.length; i++) { + if(Double.isNaN(xy[i])) return true; + } + return false; + } + public static void main(String[] args) { Plot2DPanel p2 = new Plot2DPanel(); @@ -44,6 +52,7 @@ public static void main(String[] args) { XYZ[j][0] = 2*Math.PI*(double)j/XYZ.length; XYZ[j][1] = Math.sin(XYZ[j][0]); } + XYZ[50][0] = Double.NaN; p2.addLinePlot("sin" , XYZ); diff --git a/src/main/java/org/math/plot/utils/Array.java b/src/main/java/org/math/plot/utils/Array.java index 6a013c2..6dc0eb4 100644 --- a/src/main/java/org/math/plot/utils/Array.java +++ b/src/main/java/org/math/plot/utils/Array.java @@ -448,7 +448,9 @@ public static double[] min(double[][] M) { for (int j = 0; j < min.length; j++) { min[j] = M[0][j]; for (int i = 1; i < M.length; i++) { - min[j] = FastMath.min(min[j], M[i][j]); + if (!Double.isNaN(M[i][j])) { + min[j] = FastMath.min(min[j], M[i][j]); + } } } return min; @@ -473,7 +475,9 @@ public static int max(int... M) { public static double min(double... M) { double min = M[0]; for (int i = 1; i < M.length; i++) { - min = FastMath.min(min, M[i]); + if (!Double.isNaN(M[i])) { + min = FastMath.min(min, M[i]); + } } return min; } @@ -483,7 +487,9 @@ public static double[] max(double[][] M) { for (int j = 0; j < max.length; j++) { max[j] = M[0][j]; for (int i = 1; i < M.length; i++) { - max[j] = FastMath.max(max[j], M[i][j]); + if (!Double.isNaN(M[i][j])) { + max[j] = FastMath.max(max[j], M[i][j]); + } } } return max; @@ -492,7 +498,9 @@ public static double[] max(double[][] M) { public static double max(double... M) { double max = M[0]; for (int i = 1; i < M.length; i++) { - max = FastMath.max(max, M[i]); + if (!Double.isNaN(M[i])) { + max = FastMath.max(max, M[i]); + } } return max; } From cc3eb20f99e29ff39c2d6b9c6e112a63e2c37d8b Mon Sep 17 00:00:00 2001 From: Yann Richet Date: Wed, 27 Jul 2016 16:50:07 +0200 Subject: [PATCH 04/13] move icons to resources --- .../java/org/math/plot/icons/adjustbounds.png | Bin 191 -> 0 bytes src/main/java/org/math/plot/icons/back.png | Bin 898 -> 0 bytes src/main/java/org/math/plot/icons/center.png | Bin 903 -> 0 bytes src/main/java/org/math/plot/icons/data.png | Bin 171 -> 0 bytes src/main/java/org/math/plot/icons/edit.png | Bin 703 -> 0 bytes .../java/org/math/plot/icons/noadjustbounds.png | Bin 236 -> 0 bytes src/main/java/org/math/plot/icons/position.png | Bin 622 -> 0 bytes src/main/java/org/math/plot/icons/rotation.png | Bin 759 -> 0 bytes src/main/java/org/math/plot/icons/scale.png | Bin 689 -> 0 bytes src/main/java/org/math/plot/icons/toclipboard.png | Bin 657 -> 0 bytes src/main/java/org/math/plot/icons/tofile.png | Bin 838 -> 0 bytes src/main/java/org/math/plot/icons/topngfile.png | Bin 590 -> 0 bytes src/main/java/org/math/plot/icons/zoom.png | Bin 868 -> 0 bytes 13 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/org/math/plot/icons/adjustbounds.png delete mode 100644 src/main/java/org/math/plot/icons/back.png delete mode 100644 src/main/java/org/math/plot/icons/center.png delete mode 100644 src/main/java/org/math/plot/icons/data.png delete mode 100644 src/main/java/org/math/plot/icons/edit.png delete mode 100644 src/main/java/org/math/plot/icons/noadjustbounds.png delete mode 100644 src/main/java/org/math/plot/icons/position.png delete mode 100644 src/main/java/org/math/plot/icons/rotation.png delete mode 100644 src/main/java/org/math/plot/icons/scale.png delete mode 100644 src/main/java/org/math/plot/icons/toclipboard.png delete mode 100644 src/main/java/org/math/plot/icons/tofile.png delete mode 100644 src/main/java/org/math/plot/icons/topngfile.png delete mode 100644 src/main/java/org/math/plot/icons/zoom.png diff --git a/src/main/java/org/math/plot/icons/adjustbounds.png b/src/main/java/org/math/plot/icons/adjustbounds.png deleted file mode 100644 index 075f531af792a0b00f0af6efc0bf4b15488c7cf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m=sPPZ!4!i{9h}35E~yGt;Cv#1(coDV-J2m$9pn$cu7zW}YJ}DA<_C z9Tt6(li4k0mf%g+>hJGbSMMr(%+|F|R68uewD(hlM2Eow)eHrt#sw=AkElAfIQH=H ggzz&P?O|Y;c2;BIgZoE&fR-_My85}Sb4q9e0Q%%Mo&W#< diff --git a/src/main/java/org/math/plot/icons/back.png b/src/main/java/org/math/plot/icons/back.png deleted file mode 100644 index 825c6f7636592c382130d3ff74d150fc5401a93d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmV-|1AY97P)w3bpS`tz5m;ftzT=q z!D=@d?xWRoLL_E}h%ymoG%O~fzW4&ZXrd-c2)d9s9*m&TL?0m0H#H_2F(3khiy4|= z3}jnjnYwm^ZO}5>&fDJhws*Jf^}$F|HJ;?Wp8WEY_U(J0px-S!U7jb4&bGapv-MtV zc6?~My_o%$Lhjv4x$>K_Y9h-L|3r}`OBAch$b$2pH^sX3!q@7+VS}(O8Fz|mH0!J zETy0^A{S)OD~_Is6mBnbV(Mk0cXX3ACb?BPjn8Az)-DKbj&+-|JX|j6R4PV;vTpZp z@~v_4!{xUrdY0I-c?;Vg*~V9wN671!@C%D|(J*zJGL%;}G_BO2T(x@~vx}c_K7W+8 zgKIgLcXcCKL7v>eK-cVS)az z&f()P@ZQs(QB?D4K`WscRV2x}{ej5Drbi5C!Cp^-k*{EOnV6c1amGN*C@jv;qg~6h z@YBlSiebh@U8iOmR96iy{QL#7D;3zkRXt$57(GESekUvg6<`5g^1RBa=f)8;etbUP z;?Cad><*7HbN5h>pJky0b`PY06y5EG+Kw4R!k zj~;ur`Z)ljNaF7^GTB6`(4GF8>pV&`AzA=8(24lNlk@Kn-o?h@$FS!Tk)8|HQ{Qz~ z`xxio?EnBtbUL}n65A=`#|GGecKG=BYwQxe+`aVy-0Ey!@SOS0nx^Kl#sI)oZqmU? zQg}(w%T?;csS-drx*TU`wT}%$1GJZuk?CY9BK7wV17OuH6sLngI7G9%8TIBZ)LfAV zqYhe^j^@RCt_ikxOh;WgNxN|NHK}-<>-% zZJC);`WU8Ucv)s@4QX15j{*rS2&HL)N*WD;jVlcy7~{q?E>R)`Fc?W#U=R_FsVi3# z35k(VD6~9Es8Fyr?X+`en7MNwz4vorsiK_Zzc`EY`zPnnp+iRyUlw6{INDd%>kmHB z6YWqn)Z&SymGeKLGRqx%`d&qU7wI6m#j*JTG|FJ>scGC)`dsy0wCJ!myyh{mp#*-G)Gd2{47$!H3A z7Q#v_`kq+5j#`@~);2J-*D*vmkZRUY8e;Rb~5^Z*To#>2*&JPUUh^S zYY+gN8^3YcnlHfvhvNYOBRBwb08s!*B8*)c#^l5wLoXdTL7O`J=;h8n0)VcKeZ(U? zHc3p~^TL)6H6$2>3Pcnj1Rzd?*+L1YkDr5G^^R?68h`M5_*X2KlQ)d(^b>i+|rg7bqN6-gfJ2Aj7{LwXJ^2fj!cW6?68JfEst(h9cfvvgzW~PY_=ED z_YnlLGuE0q*pyCog~B?wX6MbvEX}zx zpa1}I4nlCHI5qXwr4Qefi~S_q-u<+_ZH)xK{mqK>?o@wf^8mC9U+;E&CBXAEI`SZ0>vz9ociq6G=C)&TCJo*!z{q}(~&w;z@ z7RMG$`E;u4{hN&*PM1n1B#Jq&{km*=qFB}Sl$nex>*q^+Xy%)C(1^i;@%rS-;xkKD RXaX%_@O1TaS?83{1OP_hJ4*ln diff --git a/src/main/java/org/math/plot/icons/edit.png b/src/main/java/org/math/plot/icons/edit.png deleted file mode 100644 index 67f56f1ec6e988561bcec28a2167373429d94b01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmV;w0zmzVP)qS4CMex)vM$6i|l+s#Pv^Eh@BBB6VT3Y_X_4P&G>Q~RAlM{N-<;F_0q20)( zr@YHBhhw)cEQiC}mKYcvE3^Fm)VVirnGHrbTz-OS&m4g|&%+Xly4Gqp8TdXompG01 zr9^u&lZJsx)baHB7_6Ofg_Nq;sNZA|aJwrrmn_Zf=ti?U7>!5qS5Hu9gd1wCSbU>? z-8bg+4_2lmB<;0a&8ScqM?xZdG>uPIvhzFn25EN!MX(6v^Sd{Jz!eIER*?IWZ|6=xp~`&YzYG(B8Uj%FKVt1#yToXN$GsYg{4?agBL20;S~fH|NWm;^?EpseXbU)e%kSLu#aZ8#`q l?B8o)AOQG9B>KM!{s6t-FDo*cNqhhR002ovPDHLkV1hY?NCyA_ diff --git a/src/main/java/org/math/plot/icons/noadjustbounds.png b/src/main/java/org/math/plot/icons/noadjustbounds.png deleted file mode 100644 index f7e362a8315207d0e987ac171437a0fd18e482e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m=sJPZ!4!i{7I_2YC-DaM;XUeYZK!d3z!MF7evL4X(NJzWRo2d#oK9 z>l%L9?hkmmyV-F0vC6bdg6hU6+dWi`idBUt&a$vP$g8v{E#dU>z?*U>c^DERuS+K? zGcimFI>a<9{>Dt_O9K0t(!%bank**Oy!uCy(Edj8-6^l0IyDOxrcFwpoUtg5_3Jcs c<-eSMbslkzM+29x0=kUB)78&qol`;+0A`9%2LJ#7 diff --git a/src/main/java/org/math/plot/icons/position.png b/src/main/java/org/math/plot/icons/position.png deleted file mode 100644 index ef53c240101ca590a217dfc092831559b45a34d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmV-!0+IcRP)R9UL+_ zN(*id(xsDQ7pH9EU|ocWQ0ST#V?nt@gi>h|L&?xV&`_&VtcEk8?=|;z$X#0DxU}XrOZdA)KDxU41nb_tiC?<$6`=xYmkKk=s4#~>y+1dZfn}7Kk+y@Hby5B z;orGAHum>WgfZoellKQ)gBnas0asnm-c@TC@sAOc|E-~jdEVZ0;pR;kATwn##BdIThsuFo!> zE-pS4>+83#>H1v>41I64_C7b8t2X)S37{^W>>#`$HO=7vQtS1xA9qM4K$zymc+VaM z(CQY+=iA3GOp{C|5x7eb-MQYoXwTb!z<;q_Azfa){MwEG2fW{9@;1n0#Q*>R07*qo IM6N<$f-vn66aWAK diff --git a/src/main/java/org/math/plot/icons/rotation.png b/src/main/java/org/math/plot/icons/rotation.png deleted file mode 100644 index ba7772a0b415ef03acac460cba92359193903ad5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcmVE=e7`?_-!IQE*oIc*k->FtX=uv6-FefkPmewE zdp=1RI^X`=xeL=H3m2~ptGM7_TtY}C1k|9cqp_}W|3J^s3uCQ+Z-S>4c8Z_B+~7D@S^^WUC4IWd}<%dAuO4LXJNEh}Ii z3vLT{hry#OkD8pFRQ#+sgC;2cRqQXGE!K-xs@SVy1RGGvU_i!J!As?v%UPH{JZ=7m z`6G)X6wPFsO)pvQuz3%dbwbHqN@QL3if;EPl^U>{zOlH~uu9-0ip2X2o$T!VgWwA?esMKOs<^rmQoJ;b#)q7?w4-O zL5%uB^rup4J)~);ND>MkhaYuXXBpbjj9L7O@BN}^vy9X7XeAhsZsTmVDsGUoL*90+ pIs{yF**`v4@~*72qICUR_z%Fx^^jFWeVzaS002ovPDHLkV1ivEXq^B6 diff --git a/src/main/java/org/math/plot/icons/scale.png b/src/main/java/org/math/plot/icons/scale.png deleted file mode 100644 index 9f1d555acbe4ec5027c929490bdc8f2ef13eb165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 689 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 Date: Thu, 25 May 2017 13:55:14 +0200 Subject: [PATCH 05/13] Changes needed in order not to get a null exception when trying to display the images within a jar file. --- .../org/math/plot/components/PlotToolBar.java | 247 +++++++++--------- 1 file changed, 126 insertions(+), 121 deletions(-) diff --git a/src/main/java/org/math/plot/components/PlotToolBar.java b/src/main/java/org/math/plot/components/PlotToolBar.java index 19ee39d..1202635 100644 --- a/src/main/java/org/math/plot/components/PlotToolBar.java +++ b/src/main/java/org/math/plot/components/PlotToolBar.java @@ -6,13 +6,14 @@ import javax.swing.*; import javax.swing.filechooser.FileFilter; +import javax.imageio.ImageIO; import org.math.plot.*; import org.math.plot.canvas.*; /** * BSD License - * + * * @author Yann RICHET */ public class PlotToolBar extends JToolBar { @@ -32,7 +33,9 @@ public class PlotToolBar extends JToolBar { protected JButton buttonAdjustBounds; private boolean denySaveSecurity; private JFileChooser pngFileChooser; - /** the currently selected PlotPanel */ + /** + * the currently selected PlotPanel + */ private PlotCanvas plotCanvas; private PlotPanel plotPanel; @@ -56,157 +59,155 @@ public String getDescription() { denySaveSecurity = true; } - buttonGroup = new ButtonGroup(); - - buttonCenter = new JToggleButton(new ImageIcon(PlotPanel.class.getResource("icons/center.png"))); - buttonCenter.setToolTipText("Center axis"); - buttonCenter.setSelected(plotCanvas.ActionMode == PlotCanvas.TRANSLATION); - - buttonZoom = new JToggleButton(new ImageIcon(PlotPanel.class.getResource("icons/zoom.png"))); - buttonZoom.setToolTipText("Zoom"); - buttonZoom.setSelected(plotCanvas.ActionMode == PlotCanvas.ZOOM); - - //buttonEdit = new JToggleButton(new ImageIcon(PlotPanel.class.getResource("icons/edit.png"))); - //buttonEdit.setToolTipText("Edit mode"); - - //buttonViewCoords = new JToggleButton(new ImageIcon(PlotPanel.class.getResource("icons/position.png"))); - //buttonViewCoords.setToolTipText("Highlight coordinates / Highlight plot"); - - buttonSetScales = new JButton(new ImageIcon(PlotPanel.class.getResource("icons/scale.png"))); - buttonSetScales.setToolTipText("Edit axis scales"); - - buttonDatas = new JButton(new ImageIcon(PlotPanel.class.getResource("icons/data.png"))); - buttonDatas.setToolTipText("Get data"); - - buttonSavePNGFile = new JButton(new ImageIcon(PlotPanel.class.getResource("icons/topngfile.png"))); - buttonSavePNGFile.setToolTipText("Save graphics in a .PNG File"); - - buttonReset = new JButton(new ImageIcon(PlotPanel.class.getResource("icons/back.png"))); - buttonReset.setToolTipText("Reset zoom & axis"); + try { + buttonGroup = new ButtonGroup(); - buttonAdjustBounds = new JButton(new ImageIcon(PlotPanel.class.getResource(plotCanvas.getAdjustBounds() ? "icons/adjustbounds.png" : "icons/noadjustbounds.png"))); - buttonAdjustBounds.setToolTipText("Auto-update/fix bounds"); + buttonCenter = new JToggleButton(new ImageIcon(ImageIO.read(PlotPanel.class.getResourceAsStream("icons/center.png")))); + buttonCenter.setToolTipText("Center axis"); + buttonCenter.setSelected(plotCanvas.ActionMode == PlotCanvas.TRANSLATION); - /*buttonEdit.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - plotCanvas.ActionMode = PlotCanvas.EDIT; - } - });*/ + buttonZoom = new JToggleButton(new ImageIcon(ImageIO.read(PlotPanel.class.getResourceAsStream("icons/zoom.png")))); + buttonZoom.setToolTipText("Zoom"); + buttonZoom.setSelected(plotCanvas.ActionMode == PlotCanvas.ZOOM); - buttonZoom.setSelected(true); - buttonZoom.addActionListener(new ActionListener() { + //buttonEdit = new JToggleButton(new ImageIcon(PlotPanel.class.getResource("icons/edit.png"))); + //buttonEdit.setToolTipText("Edit mode"); + //buttonViewCoords = new JToggleButton(new ImageIcon(PlotPanel.class.getResource("icons/position.png"))); + //buttonViewCoords.setToolTipText("Highlight coordinates / Highlight plot"); + buttonSetScales = new JButton(new ImageIcon(ImageIO.read(PlotPanel.class.getResourceAsStream("icons/scale.png")))); + buttonSetScales.setToolTipText("Edit axis scales"); - public void actionPerformed(ActionEvent e) { - plotCanvas.ActionMode = PlotCanvas.ZOOM; - } - }); + buttonDatas = new JButton(new ImageIcon(ImageIO.read(PlotPanel.class.getResourceAsStream("icons/data.png")))); + buttonDatas.setToolTipText("Get data"); - buttonCenter.addActionListener(new ActionListener() { + buttonSavePNGFile = new JButton(new ImageIcon(ImageIO.read(PlotPanel.class.getResourceAsStream("icons/topngfile.png")))); + buttonSavePNGFile.setToolTipText("Save graphics in a .PNG File"); - public void actionPerformed(ActionEvent e) { - plotCanvas.ActionMode = PlotCanvas.TRANSLATION; - } - }); + buttonReset = new JButton(new ImageIcon(PlotPanel.class.getResource("icons/back.png"))); + buttonReset.setToolTipText("Reset zoom & axis"); - /*buttonViewCoords.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - plotCanvas.setNoteCoords(buttonViewCoords.isSelected()); - } - });*/ + buttonAdjustBounds = new JButton(new ImageIcon(ImageIO.read(PlotPanel.class.getResourceAsStream(plotCanvas.getAdjustBounds() ? "icons/adjustbounds.png" : "icons/noadjustbounds.png")))); + buttonAdjustBounds.setToolTipText("Auto-update/fix bounds"); - buttonSetScales.addActionListener(new ActionListener() { + /*buttonEdit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + plotCanvas.ActionMode = PlotCanvas.EDIT; + } + });*/ + buttonZoom.setSelected(true); + buttonZoom.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - plotCanvas.displayScalesFrame(); - } - }); + public void actionPerformed(ActionEvent e) { + plotCanvas.ActionMode = PlotCanvas.ZOOM; + } + }); - buttonDatas.addActionListener(new ActionListener() { + buttonCenter.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - plotCanvas.displayDataFrame(); - } - }); + public void actionPerformed(ActionEvent e) { + plotCanvas.ActionMode = PlotCanvas.TRANSLATION; + } + }); - buttonSavePNGFile.addActionListener(new ActionListener() { + /*buttonViewCoords.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + plotCanvas.setNoteCoords(buttonViewCoords.isSelected()); + } + });*/ + buttonSetScales.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - choosePNGFile(); - } - }); + public void actionPerformed(ActionEvent e) { + plotCanvas.displayScalesFrame(); + } + }); - buttonReset.addActionListener(new ActionListener() { + buttonDatas.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - plotCanvas.resetBase(); - } - }); + public void actionPerformed(ActionEvent e) { + plotCanvas.displayDataFrame(); + } + }); - buttonAdjustBounds.addActionListener(new ActionListener() { + buttonSavePNGFile.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - plotCanvas.setAdjustBounds(!plotCanvas.getAdjustBounds()); - ajustBoundsChanged(); - } - }); - - buttonGroup.add(buttonCenter); - buttonGroup.add(buttonZoom); - //buttonGroup.add(buttonEdit); - - add(buttonCenter, null); - add(buttonZoom, null); - add(buttonReset, null); - //add(buttonViewCoords, null); - add(buttonSetScales, null); - if (adjustBoundsVisible) { - add(buttonAdjustBounds, null); - } - //add(buttonEdit, null); - add(buttonSavePNGFile, null); - add(buttonDatas, null); + public void actionPerformed(ActionEvent e) { + choosePNGFile(); + } + }); - if (!denySaveSecurity) { - pngFileChooser.addActionListener(new ActionListener() { + buttonReset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - saveGraphicFile(); + plotCanvas.resetBase(); } }); - } else { - buttonSavePNGFile.setEnabled(false); - } - //buttonEdit.setEnabled(plotCanvas.getEditable()); + buttonAdjustBounds.addActionListener(new ActionListener() { - //buttonViewCoords.setEnabled(plotCanvas.getNotable()); + public void actionPerformed(ActionEvent e) { + plotCanvas.setAdjustBounds(!plotCanvas.getAdjustBounds()); + ajustBoundsChanged(); + } + }); - // allow mixed (2D/3D) plots managed by one toolbar - if (plotCanvas instanceof Plot3DCanvas) { - if (buttonRotate == null) { - buttonRotate = new JToggleButton(new ImageIcon(PlotPanel.class.getResource("icons/rotation.png"))); - buttonRotate.setToolTipText("Rotate axes"); + buttonGroup.add(buttonCenter); + buttonGroup.add(buttonZoom); + //buttonGroup.add(buttonEdit); + + add(buttonCenter, null); + add(buttonZoom, null); + add(buttonReset, null); + //add(buttonViewCoords, null); + add(buttonSetScales, null); + if (adjustBoundsVisible) { + add(buttonAdjustBounds, null); + } + //add(buttonEdit, null); + add(buttonSavePNGFile, null); + add(buttonDatas, null); - buttonRotate.addActionListener(new ActionListener() { + if (!denySaveSecurity) { + pngFileChooser.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - plotCanvas.ActionMode = Plot3DCanvas.ROTATION; + saveGraphicFile(); } }); - buttonGroup.add(buttonRotate); - add(buttonRotate, null, 2); - buttonRotate.setSelected(plotCanvas.ActionMode == Plot3DCanvas.ROTATION); } else { - buttonRotate.setEnabled(true); + buttonSavePNGFile.setEnabled(false); } - } else { - if (buttonRotate != null) { - // no removal/disabling just disable - if (plotCanvas.ActionMode == Plot3DCanvas.ROTATION) { - plotCanvas.ActionMode = PlotCanvas.ZOOM; + + //buttonEdit.setEnabled(plotCanvas.getEditable()); + //buttonViewCoords.setEnabled(plotCanvas.getNotable()); + // allow mixed (2D/3D) plots managed by one toolbar + if (plotCanvas instanceof Plot3DCanvas) { + if (buttonRotate == null) { + buttonRotate = new JToggleButton(new ImageIcon(ImageIO.read(PlotPanel.class.getResourceAsStream("icons/rotation.png")))); + buttonRotate.setToolTipText("Rotate axes"); + + buttonRotate.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + plotCanvas.ActionMode = Plot3DCanvas.ROTATION; + } + }); + buttonGroup.add(buttonRotate); + add(buttonRotate, null, 2); + buttonRotate.setSelected(plotCanvas.ActionMode == Plot3DCanvas.ROTATION); + } else { + buttonRotate.setEnabled(true); + } + } else { + if (buttonRotate != null) { + // no removal/disabling just disable + if (plotCanvas.ActionMode == Plot3DCanvas.ROTATION) { + plotCanvas.ActionMode = PlotCanvas.ZOOM; + } + buttonRotate.setEnabled(false); } - buttonRotate.setEnabled(false); } + } catch (Exception e) { + e.printStackTrace(); } } @@ -237,6 +238,10 @@ public void viewAdjustBounds(boolean visible) { } public void ajustBoundsChanged() { - buttonAdjustBounds.setIcon(new ImageIcon(PlotPanel.class.getResource(plotCanvas.getAdjustBounds() ? "icons/adjustbounds.png" : "icons/noadjustbounds.png"))); + try { + buttonAdjustBounds.setIcon(new ImageIcon(ImageIO.read(PlotPanel.class.getResourceAsStream(plotCanvas.getAdjustBounds() ? "icons/adjustbounds.png" : "icons/noadjustbounds.png")))); + } catch (Exception e) { + e.printStackTrace(); + } } -} \ No newline at end of file +} From 15e3b46f4bc306abcb9d38cff827f73aaa7d7337 Mon Sep 17 00:00:00 2001 From: Panagiotis Sotiropoulos Date: Wed, 14 Jun 2017 10:07:28 +0200 Subject: [PATCH 06/13] Adding some edge/null condition checks. --- src/main/java/org/math/plot/plotObjects/Axis.java | 8 +++++--- src/main/java/org/math/plot/render/Projection.java | 7 +++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/math/plot/plotObjects/Axis.java b/src/main/java/org/math/plot/plotObjects/Axis.java index 34934fc..17893ec 100644 --- a/src/main/java/org/math/plot/plotObjects/Axis.java +++ b/src/main/java/org/math/plot/plotObjects/Axis.java @@ -238,13 +238,15 @@ public void plot(AbstractDrawer draw) { ); for (int i = 0; i < lightLabels.length; i=i+inc) { - lightLabels[i].plot(draw); + if(lightLabels[i]!=null) + lightLabels[i].plot(draw); } draw.setLineType(AbstractDrawer.DOTTED_LINE); for (int i = 0; i < lightLines.length; i++) { for (int j = base.getAxeScale(index).equalsIgnoreCase(Base.STRINGS) ? 0 : 1; j < lightLines[i].length; j=j+inc) { - lightLines[i][j].plot(draw); + if(lightLines[i][j]!=null) + lightLines[i][j].plot(draw); } } } @@ -633,4 +635,4 @@ public static void main(String[] args) { System.out.println(it.next()); } } -} \ No newline at end of file +} diff --git a/src/main/java/org/math/plot/render/Projection.java b/src/main/java/org/math/plot/render/Projection.java index 5019a19..d3d3e01 100644 --- a/src/main/java/org/math/plot/render/Projection.java +++ b/src/main/java/org/math/plot/render/Projection.java @@ -28,7 +28,9 @@ public void initBaseCoordsProjection(boolean reset) { } for (int i = 0; i < draw.canvas.base.dimension + 1; i++) { // Compute the basis extremity coordinates in the normed-centered screen (ie [-0.5,0.5]x[-0.5,0.5] screen) - double[] ratio = baseCoordsScreenProjectionRatio(draw.canvas.base.baseCoords[i]); + double[] ratio = new double[]{1,1}; + if (draw.canvas.base.baseCoords!=null) + ratio = baseCoordsScreenProjectionRatio(draw.canvas.base.baseCoords[i]); // Compute the basis extremity coordinates in the true screen (ie in px: [0,400]x[0,400]) baseScreenCoords[i][0] = (int) (draw.canvas.getWidth() * (.5 + (borderCoeff * ratio[0] / totalScreenRatio[0]))); baseScreenCoords[i][1] = (int) (draw.canvas.getHeight() * (.5 - (borderCoeff * ratio[1] / totalScreenRatio[1]))); @@ -89,7 +91,8 @@ public int[] screenProjection(double... pC) { if (draw.canvas.base.axesScales[i].equalsIgnoreCase(Base.LOGARITHM)) { normdist_pC_baseCoords = ((FastMath.log(pC[i]) - FastMath.log(draw.canvas.base.baseCoords[0][i])) / (FastMath.log(draw.canvas.base.baseCoords[i + 1][i]) - FastMath.log(draw.canvas.base.baseCoords[0][i]))); } else if (draw.canvas.base.axesScales[i].equalsIgnoreCase(Base.LINEAR) || draw.canvas.base.axesScales[i].equalsIgnoreCase(Base.STRINGS)) { - normdist_pC_baseCoords = ((pC[i] - draw.canvas.base.baseCoords[0][i]) / (draw.canvas.base.baseCoords[i + 1][i] - draw.canvas.base.baseCoords[0][i])); + if(pC!=null && draw.canvas.base.baseCoords!=null && draw.canvas.base.baseCoords[i+1] != null) + normdist_pC_baseCoords = ((pC[i] - draw.canvas.base.baseCoords[0][i]) / (draw.canvas.base.baseCoords[i + 1][i] - draw.canvas.base.baseCoords[0][i])); } sC[0] += normdist_pC_baseCoords * (baseScreenCoords[i + 1][0] - baseScreenCoords[0][0]); sC[1] += normdist_pC_baseCoords * (baseScreenCoords[i + 1][1] - baseScreenCoords[0][1]); From 283bb9c77a3b0f97a19e84bb4d6098b8ede7d269 Mon Sep 17 00:00:00 2001 From: Max Krivich Date: Fri, 13 Oct 2017 18:05:11 +0300 Subject: [PATCH 07/13] Fix bug with lost values on bounds and little optimization --- src/main/java/org/math/plot/utils/Histogram.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/math/plot/utils/Histogram.java b/src/main/java/org/math/plot/utils/Histogram.java index 651f10d..2fc5bd1 100644 --- a/src/main/java/org/math/plot/utils/Histogram.java +++ b/src/main/java/org/math/plot/utils/Histogram.java @@ -26,8 +26,9 @@ public static double[] histogram(double[] values, double[] bounds) { double[] h = new double[bounds.length - 1]; for (int i = 0; i < values.length; i++) { for (int j = 0; j < h.length; j++) { - if (((bounds[j + 1] - values[i]) * (bounds[j] - values[i]) < 0) || ((bounds[j] == values[i]))) + if (((bounds[j + 1] - values[i]) * (bounds[j] - values[i]) <= 0) || ((bounds[j] == values[i]))) h[j]++; + break; } } return h; From 7cd7b6fd23268121a655720e3f981c6b675af761 Mon Sep 17 00:00:00 2001 From: Max Krivich Date: Sat, 14 Oct 2017 00:44:06 +0300 Subject: [PATCH 08/13] Brackets typo correction --- src/main/java/org/math/plot/utils/Histogram.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/math/plot/utils/Histogram.java b/src/main/java/org/math/plot/utils/Histogram.java index 2fc5bd1..dd47d1b 100644 --- a/src/main/java/org/math/plot/utils/Histogram.java +++ b/src/main/java/org/math/plot/utils/Histogram.java @@ -26,9 +26,10 @@ public static double[] histogram(double[] values, double[] bounds) { double[] h = new double[bounds.length - 1]; for (int i = 0; i < values.length; i++) { for (int j = 0; j < h.length; j++) { - if (((bounds[j + 1] - values[i]) * (bounds[j] - values[i]) <= 0) || ((bounds[j] == values[i]))) + if (((bounds[j + 1] - values[i]) * (bounds[j] - values[i]) <= 0) || ((bounds[j] == values[i]))) { h[j]++; break; + } } } return h; From 22f98604c4b47c922020db3dea79f65d64476354 Mon Sep 17 00:00:00 2001 From: Yann Richet Date: Sat, 11 Nov 2017 13:48:08 +0100 Subject: [PATCH 09/13] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 25ec9d8..9b4e39f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.yannrichet/JMathPlot/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.yannrichet/JMathPlot) + # JMathPlot: interactive 2D and 3D plots # Provides interactive 2D/3D plot (without openGL) : From 3fdc877f2eed781ea939e1f2318d0df1eccceb77 Mon Sep 17 00:00:00 2001 From: Yann Richet Date: Sat, 11 Nov 2017 17:26:07 +0100 Subject: [PATCH 10/13] Create .travis.yml --- .travis.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..24bbfc9 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: java +jdk: + - oraclejdk8 +install: mvn install -DskipTests=true -Dgpg.skip=true +script: "mvn cobertura:cobertura" +after_success: +- bash <(curl -s https://codecov.io/bash) From d77e6057462000a5ef8c6bc667af0ac23dcf1e1e Mon Sep 17 00:00:00 2001 From: Yann Richet Date: Sat, 11 Nov 2017 17:26:43 +0100 Subject: [PATCH 11/13] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b4e39f..cebbfe8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.yannrichet/JMathPlot/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.yannrichet/JMathPlot) +[![Build Status](https://travis-ci.org/yannrichet/jmathplot.png)](https://travis-ci.org/yannrichet/jmathplot) +[![codecov](https://codecov.io/gh/yannrichet/jmathplot/branch/master/graph/badge.svg)](https://codecov.io/gh/yannrichet/jmathplot) -# JMathPlot: interactive 2D and 3D plots # +# JMathPlot: interactive 2D and 3D plots Provides interactive 2D/3D plot (without openGL) : From 6a00a1968bcdd9c38d091c1f53a8f39346aaa3cd Mon Sep 17 00:00:00 2001 From: Yann Richet Date: Sat, 11 Nov 2017 17:27:17 +0100 Subject: [PATCH 12/13] Update pom.xml --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index c3a5ee2..aab25ce 100644 --- a/pom.xml +++ b/pom.xml @@ -114,6 +114,18 @@ true + + org.codehaus.mojo + cobertura-maven-plugin + 2.7 + + + html + xml + + + + jmathplot From 2938687e601c7f6782e8200ea991c6f160c13917 Mon Sep 17 00:00:00 2001 From: Yann Richet Date: Tue, 16 Mar 2021 18:02:31 +0100 Subject: [PATCH 13/13] Create LICENSE fix #42 #28 --- LICENSE | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7d0d8e7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,25 @@ +BSD 2-Clause License + +Copyright (c) 2021, Yann Richet +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.