Java Draw Bezier Curve drawBezierCurve(AffineTransform affine, Vector gPathPoints, Graphics g)

Here you can find the source of drawBezierCurve(AffineTransform affine, Vector gPathPoints, Graphics g)

Description

draw Bezier Curve

License

Apache License

Declaration

public static GeneralPath drawBezierCurve(AffineTransform affine, Vector<Point2D.Double> gPathPoints,
            Graphics g) 

Method Source Code


//package com.java2s;
//License from project: Apache License 

import java.awt.*;
import java.util.*;
import java.awt.geom.*;

public class Main {
    public static GeneralPath drawBezierCurve(AffineTransform affine, Vector<Point2D.Double> gPathPoints,
            Graphics g) {/*  w  w  w  . j a  v  a2 s.c o m*/
        if (affine == null) {
            affine = new AffineTransform();
            affine.setToIdentity();
        }
        boolean drawPath = true;
        if (g == null)
            drawPath = false;
        int pixelSize = 1;
        Point2D.Double pt;
        if (gPathPoints.size() == 0)
            return null;
        // if (gPathPoints.size() % 2 == 0) return  null;
        // System.out.println("Path Points Size: "+gPathPoints.size() + 
        // " Mod2: "+gPathPoints.size() % 2 );
        Point2D.Double[] points = gPathPoints.toArray(new Point2D.Double[0]);
        Graphics2D g2 = null;
        AffineTransform origAffine = null;
        if (drawPath) {
            g2 = (Graphics2D) g;
            origAffine = g2.getTransform();
        }
        GeneralPath gPath = new GeneralPath();
        gPath.moveTo(points[0].x, points[0].y);
        if (points.length == 1) {
            if (drawPath)
                drawPoint(affine, g2, points[0], pixelSize, Color.BLACK);
            return null;
        }
        for (int i = 1; i < points.length; i += 3) {
            if (i + 1 == points.length)
                gPath.lineTo(points[i].x, points[i].y);
            else if (i + 2 == points.length)
                gPath.quadTo(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y);
            else
                gPath.curveTo(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y, points[i + 2].x,
                        points[i + 2].y);
        }
        Color ptColor;
        if (drawPath) {
            drawPoint(affine, g2, points[0], pixelSize, Color.BLUE);
            for (int i = 1; i < points.length; i += 3) {
                if (i + 1 == points.length) {
                    drawPoint(affine, g2, points[i], pixelSize, Color.CYAN);
                } else if (i + 2 == points.length) {
                    drawPoint(affine, g2, points[i], pixelSize, Color.CYAN);
                    drawPoint(affine, g2, points[i + 1], pixelSize, Color.CYAN);
                } else {
                    for (int cntr = 0; cntr < 3; cntr++) {
                        int ptCntr = i + cntr;
                        if (cntr == 2)
                            g2.setColor(Color.blue);
                        else
                            g2.setColor(Color.cyan);
                        Point2D.Double affinePt = (Point2D.Double) affine.transform(points[ptCntr], null);
                        g2.fill(new Ellipse2D.Double(affinePt.x - 4 * pixelSize, affinePt.y - 4 * pixelSize,
                                8 * pixelSize, 8 * pixelSize));
                        // System.out.println("Drawing Point at PtCntr: "+ptCntr);
                    }
                }
            } // for (int i = 1; i < points.length;  i += 3)
        }
        gPath = (GeneralPath) gPath.createTransformedShape(affine);
        if (drawPath) {
            g2.setColor(Color.DARK_GRAY);
            Stroke origStroke = g2.getStroke();
            g2.setStroke(new BasicStroke(0.5f));
            g2.draw(gPath);
            g2.setStroke(origStroke);
            g2.transform(origAffine);
        }
        return gPath;
    }

    public static void drawPoint(Graphics2D g2, Point2D.Double pt, int ptSize, Color color) {
        AffineTransform affine = new AffineTransform();
        affine.setToIdentity();
        drawPoint(affine, g2, pt, ptSize, color);
    }

    public static void drawPoint(AffineTransform affine, Graphics2D g2, Point2D.Double point, int ptSize,
            Color color) {
        Point2D.Double pt = (Point2D.Double) affine.transform(point, null);
        Color origColor = g2.getColor();
        g2.setColor(color);
        g2.fill(new Ellipse2D.Double(pt.x - 4 * ptSize, pt.y - 4 * ptSize, 8 * ptSize, 8 * ptSize));
        g2.setColor(origColor);
    }
}

Related

  1. drawBezier(Graphics2D g, float x1, float y1, float ctrlx1, float ctrly1, float ctrlx2, float ctrly2, float x2, float y2)
  2. drawBezier(Graphics2D g2, @Nonnull Point2D p0, @Nonnull Point2D p1, @Nonnull Point2D p2, @Nonnull Point2D p3)