From dcb6c2159446135a142cad41eec185bb24c45bfb Mon Sep 17 00:00:00 2001 From: bjculkin Date: Wed, 11 Apr 2018 15:29:25 -0400 Subject: Split #9 into one class/file --- CSMath/src/bezier/BezierPanel.java | 128 +++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CSMath/src/bezier/BezierPanel.java (limited to 'CSMath/src/bezier/BezierPanel.java') diff --git a/CSMath/src/bezier/BezierPanel.java b/CSMath/src/bezier/BezierPanel.java new file mode 100644 index 0000000..86b4dd9 --- /dev/null +++ b/CSMath/src/bezier/BezierPanel.java @@ -0,0 +1,128 @@ +package bezier; + +import java.awt.Color; +import java.awt.Graphics; +import java.util.Collection; +import java.util.LinkedList; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.border.BevelBorder; + +import bezier.transforms.TDHCombination; +import bezier.transforms.TDHTransform; +import bezier.transforms.TDHTranslate; +import bezier.transforms.TDHXAxisReflection; + +/* + * Panel that graphs a set of bezier curves. + */ +public class BezierPanel extends JPanel { + public final Collection curves; + + private static final long serialVersionUID = 8748298173487657108L; + + public BezierPanel() { + super(); + + curves = new LinkedList<>(); + + setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); + } + + public BezierPanel(Collection curvs) { + super(); + + curves = curvs; + + setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + + int ourWidth = getWidth(); + int ourHeight = getHeight(); + + int halfWidth = ourWidth / 2; + int halfHeight = ourHeight / 2; + + g.setColor(Color.WHITE); + + /* + * Draw background + */ + g.fillRect(0, 0, ourWidth, ourHeight); + + g.setColor(Color.BLUE); + + /* + * Draw coordinate grid. + */ + g.drawLine(halfWidth, 0, halfWidth, ourHeight); + g.drawLine(0, halfHeight, ourWidth, halfHeight); + + /* + * Transform to place points at center of grid w/ right orientation. + */ + TDHTransform translate = new TDHCombination(new TDHXAxisReflection(), new TDHTranslate(halfWidth, halfHeight)); + + for (Bezier curve : curves) { + /* + * Skip curves with no points. + */ + if (curve.controls.isEmpty()) { + continue; + } + + { + /* + * Draw curve bounding box. + */ + g.setColor(curve.data.boxColor); + TDPoint[] ex = curve.extrema(translate); + + g.drawLine((int) ex[0].x, (int) ex[0].y, (int) ex[1].x, (int) ex[1].y); + g.drawLine((int) ex[1].x, (int) ex[1].y, (int) ex[2].x, (int) ex[2].y); + g.drawLine((int) ex[2].x, (int) ex[2].y, (int) ex[3].x, (int) ex[3].y); + g.drawLine((int) ex[3].x, (int) ex[3].y, (int) ex[0].x, (int) ex[0].y); + } + + g.setColor(curve.data.pointColor); + for (TDPoint control : curve.controls) { + /* + * Draw curve points. + */ + TDHPoint translatedPoint = translate.transform(control.multiply(curve.data.scale).toTDHPoint()); + + control = translatedPoint.toTDPoint(); + + drawCircle(g, control.x, control.y, 6); + } + + g.setColor(curve.data.curveColor); + for (int i = 0; i < curve.data.parts; i++) { + /* + * Draw curve itself. + */ + double dT = 1.0 / curve.data.parts; + + TDPoint firt = curve.scaleEval(dT * i); + TDPoint secod = curve.scaleEval(dT * (i + 1)); + + TDPoint first = translate.transform(firt.toTDHPoint()).toTDPoint(); + TDPoint second = translate.transform(secod.toTDHPoint()).toTDPoint(); + + g.drawLine((int) first.x, (int) first.y, (int) second.x, (int) second.y); + } + } + } + + /* + * Draw a circle of a given diameter at a point. + */ + private static void drawCircle(Graphics g, double x, double y, int diameter) { + g.fillOval((int) x - diameter / 2, (int) y - diameter / 2, diameter, diameter); + } +} \ No newline at end of file -- cgit v1.2.3