diff options
Diffstat (limited to 'CSMath/src/bezier/BezierPanel.java')
| -rw-r--r-- | CSMath/src/bezier/BezierPanel.java | 128 |
1 files changed, 128 insertions, 0 deletions
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<Bezier> curves;
+
+ private static final long serialVersionUID = 8748298173487657108L;
+
+ public BezierPanel() {
+ super();
+
+ curves = new LinkedList<>();
+
+ setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
+ }
+
+ public BezierPanel(Collection<Bezier> 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 |
