From 3d4492892556d230a1b1a621716a6496a940d91d Mon Sep 17 00:00:00 2001 From: Benjamin Culkin Date: Mon, 9 Apr 2018 19:08:47 -0700 Subject: Update --- CSMath/src/CulkinAsssignmentNine.java | 451 +++++++++++++++++++++------------- 1 file changed, 284 insertions(+), 167 deletions(-) diff --git a/CSMath/src/CulkinAsssignmentNine.java b/CSMath/src/CulkinAsssignmentNine.java index e1e7da7..76af01a 100644 --- a/CSMath/src/CulkinAsssignmentNine.java +++ b/CSMath/src/CulkinAsssignmentNine.java @@ -7,8 +7,12 @@ import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.function.Consumer; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; @@ -27,19 +31,38 @@ import javax.swing.border.BevelBorder; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; -@SuppressWarnings("javadoc") public class CulkinAsssignmentNine { + public final Holder currentCurve; + public final Map curveDirectory; + + public CulkinAsssignmentNine() { + Bezier curve = new Bezier(); + + curveDirectory = new HashMap<>(); + curveDirectory.put("Default Curve", curve); + + currentCurve = new Holder<>(); + currentCurve.setVal(curve); + } + public static void main(String[] args) { + CulkinAsssignmentNine assign = new CulkinAsssignmentNine(); + + JFrame fram = assign.setupFrame(); + + fram.setSize(640, 480); + fram.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + fram.setVisible(true); + } + + private JFrame setupFrame() { JFrame fram = new JFrame("Bezier Grapher"); fram.setLayout(new GridLayout(1, 1)); JPanel canvasPanel = new JPanel(); canvasPanel.setLayout(new GridLayout(1, 1)); - Bezier curve = new Bezier(); - - BezierPanel canvas = new BezierPanel(); - canvas.curves.add(curve); + BezierPanel canvas = new BezierPanel(curveDirectory.values()); canvasPanel.add(canvas); @@ -52,6 +75,14 @@ public class CulkinAsssignmentNine { DefaultListModel pointModel = new DefaultListModel<>(); pointModel.addListDataListener(new CanvasRepainter(canvas)); + currentCurve.addHolderListener((val) -> { + pointModel.clear(); + + for(TDPoint punkt : val.controls) { + pointModel.addElement(punkt); + } + }); + JList pointList = new JList<>(pointModel); pointList.setCellRenderer(new TDPointRenderer()); @@ -63,7 +94,7 @@ public class CulkinAsssignmentNine { buttonPanel.setLayout(new GridLayout(1, 2)); JButton addPoint = new JButton("Add Control Points..."); - addPoint.addActionListener(new PointAdder(pointModel, curve, fram)); + addPoint.addActionListener(new PointAdder(pointModel, currentCurve, fram)); JButton remPoint = new JButton("Remove Control Point"); remPoint.addActionListener(new PointRemover(fram, pointList, pointModel)); @@ -77,167 +108,12 @@ public class CulkinAsssignmentNine { JSplitPane main = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, points, canvasPanel); fram.add(main); - - fram.setSize(640, 480); - fram.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - fram.setVisible(true); - } -} - -class CanvasRepainter implements ListDataListener { - private final BezierPanel canvas; - - public CanvasRepainter(BezierPanel canvas) { - this.canvas = canvas; - } - - @Override - public void intervalRemoved(ListDataEvent e) { - canvas.repaint(); - } - - @Override - public void intervalAdded(ListDataEvent e) { - canvas.repaint(); - } - - @Override - public void contentsChanged(ListDataEvent e) { - canvas.repaint(); - } -} - -class PointAdder implements ActionListener { - private final DefaultListModel pointModel; - private final Bezier curve; - private final JFrame fram; - - public PointAdder(DefaultListModel pointModel, Bezier curve, JFrame fram) { - this.pointModel = pointModel; - this.curve = curve; - this.fram = fram; - } - - @Override - public void actionPerformed(ActionEvent ev) { - JDialog dia = new JDialog(fram); - dia.setTitle("Add Control Point"); - dia.setModalityType(ModalityType.MODELESS); - dia.setLayout(new BorderLayout()); - - JPanel fields = new JPanel(); - fields.setLayout(new GridLayout(2, 1)); - - DoubleInputPanel xPanel = new DoubleInputPanel("X Coordinate: "); - DoubleInputPanel yPanel = new DoubleInputPanel("Y Coordinate: "); - - fields.add(xPanel); - fields.add(yPanel); - - JPanel buttons = new JPanel(); - buttons.setLayout(new GridLayout(1, 2)); - - JButton add = new JButton("Add Control Point"); - - AddListener addListener = new AddListener(xPanel, yPanel); - add.addActionListener(addListener); - - JButton cancel = new JButton("Cancel"); - cancel.addActionListener((aev) -> { - dia.dispose(); - }); - - buttons.add(add); - buttons.add(cancel); - - xPanel.field.addActionListener((aev) -> { - yPanel.field.requestFocusInWindow(); - }); - - yPanel.field.addActionListener((aev) -> { - addListener.actionPerformed(null); - }); - - dia.add(fields, BorderLayout.CENTER); - dia.add(buttons, BorderLayout.PAGE_END); - - dia.pack(); - dia.setVisible(true); - } - - class AddListener implements ActionListener { - private final DoubleInputPanel xPanel; - private final DoubleInputPanel yPanel; - - public AddListener(DoubleInputPanel xPanel, DoubleInputPanel yPanel) { - this.xPanel = xPanel; - this.yPanel = yPanel; - } - - @Override - public void actionPerformed(ActionEvent aev) { - double xVal = (Double) xPanel.field.getValue(); - double yVal = (Double) yPanel.field.getValue(); - - TDPoint punkt = new TDPoint(xVal, yVal); - - pointModel.addElement(punkt); - curve.controls.add(punkt); - - xPanel.field.setValue(0.0); - yPanel.field.setValue(0.0); - - xPanel.field.requestFocusInWindow(); - } - } -} - -class PointRemover implements ActionListener { - private final JFrame fram; - private final JList pointList; - private final DefaultListModel pointModel; - - public PointRemover(JFrame fram, JList pointList, DefaultListModel pointModel) { - this.fram = fram; - this.pointList = pointList; - this.pointModel = pointModel; - } - - @Override - public void actionPerformed(ActionEvent ev) { - int selectedIndex = pointList.getSelectedIndex(); - TDPoint punkt = pointModel.get(selectedIndex); - - String msg = String.format("Do you want to remove the control point (%.2f, %.2f)?", punkt.x, punkt.y); - - int confirmed = JOptionPane.showConfirmDialog(fram, msg, "Remove Control Point?", JOptionPane.YES_NO_OPTION); - - if (confirmed == JOptionPane.YES_OPTION) { - pointModel.remove(selectedIndex); - } - } -} - -class DoubleInputPanel extends JPanel { - private static final long serialVersionUID = 1031310890698539040L; - - public final JFormattedTextField field; - - public DoubleInputPanel(String label) { - super(); - setLayout(new BorderLayout()); - - JLabel xLabel = new JLabel(label); - - field = new JFormattedTextField(0.0); - - add(xLabel, BorderLayout.LINE_START); - add(field, BorderLayout.CENTER); + return fram; } } class BezierPanel extends JPanel { - public final List curves; + public final Collection curves; private static final long serialVersionUID = 8748298173487657108L; @@ -245,6 +121,14 @@ class BezierPanel extends JPanel { super(); curves = new LinkedList<>(); + + setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); + } + + public BezierPanel(Collection curvs) { + super(); + + curves = curvs; setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); } @@ -261,23 +145,36 @@ class BezierPanel extends JPanel { g.setColor(Color.WHITE); - g.translate(halfWidth, halfHeight); + g.fillRect(0, 0, ourWidth, ourHeight); + + g.setColor(Color.BLUE); - g.fillRect(-halfWidth, -halfHeight, ourWidth, ourHeight); + g.drawLine(halfWidth, 0, halfWidth, ourHeight * 2); + g.drawLine(0, halfHeight, ourWidth * 2, halfHeight); - g.setColor(Color.BLACK); + g.translate(halfWidth, halfHeight); for (Bezier curve : curves) { + g.setColor(Color.RED); + for(TDPoint control : curve.controls) { + drawCircle(g, control.x, control.y, 6); + } + for (int i = 0; i < curve.parts; i++) { double dT = 1.0 / curve.parts; TDPoint first = curve.scaleEval(dT * i); TDPoint second = curve.scaleEval(dT * (i + 1)); - + + g.setColor(curve.col); g.drawLine((int) first.x, (int) first.y, (int) second.x, (int) second.y); } } } + + private static void drawCircle(Graphics g, double x, double y, int diameter) { + g.fillOval((int)x - diameter/2, (int)y - diameter/2, diameter, diameter); + } } class Bezier { @@ -286,6 +183,8 @@ class Bezier { public int parts = 100; public int scale = 5; + public Color col = Color.BLACK; + public Bezier(TDPoint... points) { controls = new ArrayList<>(); @@ -453,4 +352,222 @@ final class TDPointRenderer extends JLabel implements ListCellRenderer return this; } +} + +class PointRemover implements ActionListener { + private final JFrame fram; + private final JList pointList; + private final DefaultListModel pointModel; + + public PointRemover(JFrame fram, JList pointList, DefaultListModel pointModel) { + this.fram = fram; + this.pointList = pointList; + this.pointModel = pointModel; + } + + @Override + public void actionPerformed(ActionEvent ev) { + int selectedIndex = pointList.getSelectedIndex(); + TDPoint punkt = pointModel.get(selectedIndex); + + String msg = String.format("Do you want to remove the control point (%.2f, %.2f)?", punkt.x, punkt.y); + + int confirmed = JOptionPane.showConfirmDialog(fram, msg, "Remove Control Point?", + JOptionPane.YES_NO_OPTION); + + if (confirmed == JOptionPane.YES_OPTION) { + pointModel.remove(selectedIndex); + } + } +} + +class PointAdder implements ActionListener { + private final DefaultListModel pointModel; + private Bezier curve; + private final JFrame fram; + + public PointAdder(DefaultListModel pointModel, Holder curveHolder, JFrame fram) { + this.pointModel = pointModel; + this.curve = curveHolder.getVal(); + this.fram = fram; + + curveHolder.addHolderListener((curv) -> { + curve = curv; + }); + } + + @Override + public void actionPerformed(ActionEvent ev) { + JDialog dia = new JDialog(fram); + dia.setTitle("Add Control Point"); + dia.setModalityType(ModalityType.MODELESS); + dia.setLayout(new BorderLayout()); + + JPanel fields = new JPanel(); + fields.setLayout(new GridLayout(2, 1)); + + DoubleInputPanel xPanel = new DoubleInputPanel("X Coordinate: "); + DoubleInputPanel yPanel = new DoubleInputPanel("Y Coordinate: "); + + fields.add(xPanel); + fields.add(yPanel); + + JPanel buttons = new JPanel(); + buttons.setLayout(new GridLayout(1, 2)); + + JButton add = new JButton("Add Control Point"); + + AddListener addListener = new AddListener(xPanel, yPanel); + add.addActionListener(addListener); + + JButton cancel = new JButton("Cancel"); + cancel.addActionListener((aev) -> { + dia.dispose(); + }); + + buttons.add(add); + buttons.add(cancel); + + xPanel.field.addActionListener((aev) -> { + yPanel.field.requestFocusInWindow(); + }); + + yPanel.field.addActionListener((aev) -> { + addListener.actionPerformed(null); + }); + + dia.add(fields, BorderLayout.CENTER); + dia.add(buttons, BorderLayout.PAGE_END); + + dia.pack(); + dia.setVisible(true); + } + + class AddListener implements ActionListener { + private final DoubleInputPanel xPanel; + private final DoubleInputPanel yPanel; + + public AddListener(DoubleInputPanel xPanel, DoubleInputPanel yPanel) { + this.xPanel = xPanel; + this.yPanel = yPanel; + } + + @Override + public void actionPerformed(ActionEvent aev) { + double xVal = (Double) xPanel.field.getValue(); + double yVal = (Double) yPanel.field.getValue(); + + TDPoint punkt = new TDPoint(xVal, yVal); + + pointModel.addElement(punkt); + curve.controls.add(punkt); + + xPanel.field.setValue(0.0); + yPanel.field.setValue(0.0); + + xPanel.field.requestFocusInWindow(); + } + } +} + +class CanvasRepainter implements ListDataListener { + private final BezierPanel canvas; + + public CanvasRepainter(BezierPanel canvas) { + this.canvas = canvas; + } + + @Override + public void intervalRemoved(ListDataEvent e) { + canvas.repaint(); + } + + @Override + public void intervalAdded(ListDataEvent e) { + canvas.repaint(); + } + + @Override + public void contentsChanged(ListDataEvent e) { + canvas.repaint(); + } +} + +class DoubleInputPanel extends JPanel { + private static final long serialVersionUID = 1031310890698539040L; + + public final JFormattedTextField field; + + public DoubleInputPanel(String label) { + super(); + setLayout(new BorderLayout()); + + JLabel xLabel = new JLabel(label); + + field = new JFormattedTextField(0.0); + + add(xLabel, BorderLayout.LINE_START); + add(field, BorderLayout.CENTER); + } +} + +class Holder { + private E val; + + private final List> listeners; + + public Holder() { + listeners = new LinkedList<>(); + } + + public Holder(E val) { + this(); + + this.val = val; + } + + public E getVal() { + return val; + } + + public void setVal(E val) { + this.val = val; + + for (Consumer listen : listeners) { + listen.accept(val); + } + } + + public void addHolderListener(Consumer listen) { + listeners.add(listen); + } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((val == null) ? 0 : val.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Holder other = (Holder) obj; + if (val == null) { + if (other.val != null) + return false; + } else if (!val.equals(other.val)) + return false; + return true; + } + + @Override + public String toString() { + return "Holder [val=" + val + "]"; + } } \ No newline at end of file -- cgit v1.2.3