Search in sources :

Example 26 with Point2DArray

use of com.ait.lienzo.client.core.types.Point2DArray in project lienzo-core by ahome-it.

the class BezierCurve method prepare.

/**
 * Draws this Bezier Curve.
 *
 * @param context the {@link Context2D} used to draw this bezier curve.
 */
@Override
protected boolean prepare(final Context2D context, final Attributes attr, final double alpha) {
    final Point2DArray points = attr.getControlPoints();
    if ((points != null) && (points.size() == 4)) {
        context.beginPath();
        final Point2D p0 = points.get(0);
        final Point2D p1 = points.get(1);
        final Point2D p2 = points.get(2);
        final Point2D p3 = points.get(3);
        context.moveTo(p0.getX(), p0.getY());
        context.bezierCurveTo(p1.getX(), p1.getY(), p2.getX(), p2.getY(), p3.getX(), p3.getY());
        return true;
    }
    return false;
}
Also used : Point2DArray(com.ait.lienzo.client.core.types.Point2DArray) Point2D(com.ait.lienzo.client.core.types.Point2D)

Example 27 with Point2DArray

use of com.ait.lienzo.client.core.types.Point2DArray in project lienzo-core by ahome-it.

the class GridLayer method drawWithoutTransforms.

@Override
protected void drawWithoutTransforms(final Context2D context, final double alpha, final BoundingBox bounds) {
    if (false == isVisible()) {
        return;
    }
    final Viewport vp = getViewport();
    final int vw = vp.getWidth();
    final int vh = vp.getHeight();
    final Point2D a = new Point2D(0, 0);
    final Point2D b = new Point2D(vw, vh);
    double scaleX = 1, scaleY = 1;
    Transform t = isTransformable() ? vp.getTransform() : null;
    if (t != null) {
        scaleX = t.getScaleX();
        scaleY = t.getScaleY();
        t = t.getInverse();
        t.transform(a, a);
        t.transform(b, b);
    }
    final double x1 = a.getX();
    final double y1 = a.getY();
    final double x2 = b.getX();
    final double y2 = b.getY();
    for (int direction = X; direction <= Y; direction++) {
        final boolean vertical = (direction == X);
        final double scale = vertical ? scaleX : scaleY;
        final double min = vertical ? x1 : y1;
        final double max = vertical ? x2 : y2;
        for (int primSec = 0; primSec <= 1; primSec++) {
            final int index = (primSec * 2) + direction;
            final boolean isSecondary = (primSec == 1);
            if (m_lines[index] == null) {
                continue;
            }
            int n = 0;
            if (isSecondary) {
                // n = primarySize div secondary
                // ASSUMPTION: primarySize is a multiple of secondarySize
                n = (int) Math.round(m_sizes[direction] / m_sizes[index]);
            }
            final Line line = m_lines[index];
            final double size = m_sizes[index];
            final double previousLineWidth = line.getStrokeWidth();
            line.setStrokeWidth(previousLineWidth / scale);
            final DashArray previousDashes = line.getDashArray();
            if (previousDashes != null) {
                final double[] d = previousDashes.getNormalizedArray();
                final DashArray dashes = new DashArray();
                for (final double element : d) {
                    dashes.push(element / scale);
                }
                line.setDashArray(dashes);
            }
            long n1 = Math.round(min / size);
            if ((n1 * size) < min) {
                n1++;
            }
            long n2 = Math.round(max / size);
            if ((n2 * size) > max) {
                n2--;
            }
            final Point2DArray points = line.getPoints();
            final Point2D p1 = points.get(0);
            final Point2D p2 = points.get(1);
            if (vertical) {
                p1.setY(y1);
                p2.setY(y2);
            } else {
                p1.setX(x1);
                p2.setX(x2);
            }
            for (long ni = n1; ni <= n2; ni++) {
                if (// skip primary lines
                isSecondary && ((ni % n) == 0)) {
                    continue;
                }
                if (vertical) {
                    final double x = ni * size;
                    p1.setX(x);
                    p2.setX(x);
                } else {
                    final double y = ni * size;
                    p1.setY(y);
                    p2.setY(y);
                }
                line.drawWithTransforms(context, alpha, bounds);
            }
            // restore stroke width
            line.setStrokeWidth(previousLineWidth);
            if (previousDashes != null) {
                line.setDashArray(previousDashes);
            }
        }
    }
    // Draw children (if any)
    super.drawWithoutTransforms(context, alpha, bounds);
}
Also used : Point2DArray(com.ait.lienzo.client.core.types.Point2DArray) Point2D(com.ait.lienzo.client.core.types.Point2D) DashArray(com.ait.lienzo.client.core.types.DashArray) Transform(com.ait.lienzo.client.core.types.Transform)

Example 28 with Point2DArray

use of com.ait.lienzo.client.core.types.Point2DArray in project kie-wb-common by kiegroup.

the class PolygonView method create.

// TODO: If cornerRadius > 0 -> bug.
private static MultiPath create(final MultiPath result, final int sides, final double radius, final double cornerRadius) {
    final double ix = radius;
    final double iy = radius;
    if ((sides > 2) && (radius > 0)) {
        result.M(ix, iy - radius);
        if (cornerRadius <= 0) {
            for (int n = 1; n < sides; n++) {
                final double theta = (n * 2 * Math.PI / sides);
                result.L(ix + (radius * Math.sin(theta)), iy + (-1 * radius * Math.cos(theta)));
            }
            result.Z();
        } else {
            final Point2DArray list = new Point2DArray(ix, iy - radius);
            for (int n = 1; n < sides; n++) {
                final double theta = (n * 2 * Math.PI / sides);
                list.push(ix + (radius * Math.sin(theta)), iy + (-1 * radius * Math.cos(theta)));
            }
            Geometry.drawArcJoinedLines(result.getPathPartList(), list.push(ix, iy - radius), cornerRadius);
        }
    }
    return result;
}
Also used : Point2DArray(com.ait.lienzo.client.core.types.Point2DArray)

Example 29 with Point2DArray

use of com.ait.lienzo.client.core.types.Point2DArray in project lienzo-core by ahome-it.

the class ShapeControlUtils method checkForAndApplyLineSplice.

public static boolean checkForAndApplyLineSplice(final WiresManager wiresManager, final WiresShape shape) {
    if (!wiresManager.isSpliceEnabled() || (shape.getMagnets() == null)) {
        // cannot connect to a shape with no magnets.
        return true;
    }
    boolean accept = true;
    for (final WiresConnector c : wiresManager.getConnectorList()) {
        final Point2DArray linePoints = ((OrthogonalPolyLine) c.getLine()).getComputedPoint2DArray();
        final MultiPath path = shape.getPath();
        Point2DArray intersectPoints = null;
        final Point2D absLoc = path.getComputedLocation();
        intersectPoints = getIntersections(linePoints, path, intersectPoints, absLoc);
        if (((c.getHeadConnection().getMagnet() != null) && (c.getHeadConnection().getMagnet().getMagnets().getWiresShape() == shape)) || ((c.getTailConnection().getMagnet() != null) && (c.getTailConnection().getMagnet().getMagnets().getWiresShape() == shape))) {
            // don't split yourself
            return accept;
        }
        if (intersectPoints != null) {
            final WiresConnection headCon = c.getHeadConnection();
            final WiresConnection tailCon = c.getTailConnection();
            if (intersectPoints.size() == 1) {
                // one arrow end is enclosed in the shape, we can only splice/connect if that connection is not already connected.
                final BoundingBox bbox = shape.getContainer().getComputedBoundingPoints().getBoundingBox();
                if (bbox.contains(headCon.getPoint()) && (headCon.getMagnet() != null)) {
                    return accept;
                } else if (bbox.contains(tailCon.getPoint()) && (headCon.getMagnet() != null)) {
                    return accept;
                } else {
                    throw new RuntimeException("Defensive programming: should not be possible if there is a single intersection.");
                }
            }
            c.getWiresConnectorHandler().getControl().hideControlPoints();
            final Point2DArray oldPoints = c.getLine().getPoint2DArray();
            int firstSegmentIndex = Integer.MAX_VALUE;
            int lastSegmentIndex = 0;
            for (final Point2D p : intersectPoints) {
                final double x = p.getX() + absLoc.getX();
                final double y = p.getY() + absLoc.getY();
                // get first and last segment, this can happen if shape straddles multiple segments of the line
                final int pointIndex = WiresConnectorControlImpl.getIndexForSelectedSegment(c, (int) x, (int) y, oldPoints);
                if (pointIndex < firstSegmentIndex) {
                    firstSegmentIndex = pointIndex;
                }
                if (pointIndex > lastSegmentIndex) {
                    lastSegmentIndex = pointIndex;
                }
            }
            WiresConnector c2 = null;
            // record these, as they may need restoring later.
            double tailXOffset = 0;
            double tailYOffset = 0;
            boolean tailAutoConnection = false;
            Point2D tailPoint = null;
            WiresMagnet tailMagnet = null;
            if (tailCon != null) {
                tailXOffset = tailCon.getXOffset();
                tailYOffset = tailCon.getYOffset();
                tailAutoConnection = tailCon.isAutoConnection();
                tailMagnet = tailCon.getMagnet();
                tailPoint = tailCon.getPoint();
            }
            if (firstSegmentIndex > 0) {
                final Point2DArray newPoints1 = new Point2DArray();
                final Point2DArray newPoints2 = new Point2DArray();
                newPoints1.push(oldPoints.get(0));
                for (int i = 1; i < firstSegmentIndex; i++) {
                    newPoints1.push(oldPoints.get(i));
                }
                final WiresMagnet cmagnet = shape.getMagnets().getMagnet(1);
                // check if isAllowed
                WiresConnectionControlImpl.allowedMagnetAndUpdateAutoConnections(headCon, true, shape, cmagnet, false);
                accept = accept && WiresConnectionControlImpl.allowedMagnetAndUpdateAutoConnections(tailCon, false, shape, cmagnet, false);
                if (!accept) {
                    return accept;
                }
                if (intersectPoints.size() > 1) {
                    final Point2D startPoint = new Point2D(cmagnet.getControl().getX(), cmagnet.getControl().getY());
                    newPoints2.push(startPoint);
                    // will skip any segments between first and last. this happens if a shape straddles multiple segments.
                    for (int i = lastSegmentIndex; i < oldPoints.size(); i++) {
                        newPoints2.push(oldPoints.get(i));
                    }
                    final AbstractDirectionalMultiPointShape<?> line = c.getLine().copy();
                    line.setPoint2DArray(newPoints2);
                    c2 = new WiresConnector(line, c.getHeadDecorator().copy(), c.getTailDecorator().copy());
                    wiresManager.register(c2);
                    final WiresConnection headCon2 = c2.getHeadConnection();
                    headCon2.setAutoConnection(true);
                    // reset, if not already 0
                    headCon2.setXOffset(0);
                    headCon2.setYOffset(0);
                    final WiresConnection tailCon2 = c2.getTailConnection();
                    // preserve tail auto connection
                    tailCon2.setAutoConnection(tailCon.isAutoConnection());
                    tailCon2.setMagnet(tailCon.getMagnet());
                    // reset, if not already 0
                    tailCon2.setXOffset(tailCon.getXOffset());
                    tailCon2.setYOffset(tailCon.getYOffset());
                    tailCon2.setPoint(tailCon.getPoint());
                    accept = accept && WiresConnectionControlImpl.allowedMagnetAndUpdateAutoConnections(headCon2, true, shape, cmagnet, true);
                    if (!accept) {
                        // we already checked isAllowed before mutation, so this in theory should not be needed. Adding for future proofing and completeness - in
                        // case a future version doesn't require identical behavioural logic for allowed and accept.
                        tailCon2.setMagnet(null);
                        wiresManager.deregister(c2);
                        return accept;
                    }
                }
                // this is done after the potential newPoitns2, as it reads values from the original connector.
                final Point2D endPoint = new Point2D(cmagnet.getControl().getX(), cmagnet.getControl().getY());
                newPoints1.push(endPoint);
                tailCon.setAutoConnection(true);
                // reset, if not already 0
                tailCon.setXOffset(0);
                tailCon.setYOffset(0);
                tailCon.setPoint(endPoint);
                c.getLine().setPoint2DArray(newPoints1);
                accept = accept && WiresConnectionControlImpl.allowedMagnetAndUpdateAutoConnections(tailCon, false, shape, cmagnet, true);
                if (!accept) {
                    // case a future version doesn't require identical behavioural logic for allowed and accept.
                    if (c2 != null) {
                        c2.getTailConnection().setMagnet(null);
                        c2.getHeadConnection().setMagnet(null);
                        wiresManager.deregister(c2);
                    }
                    tailCon.setAutoConnection(tailAutoConnection);
                    // reset, if not already 0
                    tailCon.setXOffset(tailXOffset);
                    tailCon.setYOffset(tailYOffset);
                    tailCon.setMagnet(tailMagnet);
                    tailCon.setPoint(tailPoint);
                    return accept;
                }
            }
        }
    }
    return accept;
}
Also used : MultiPath(com.ait.lienzo.client.core.shape.MultiPath) WiresConnector(com.ait.lienzo.client.core.shape.wires.WiresConnector) WiresConnection(com.ait.lienzo.client.core.shape.wires.WiresConnection) Point2DArray(com.ait.lienzo.client.core.types.Point2DArray) Point2D(com.ait.lienzo.client.core.types.Point2D) OrthogonalPolyLine(com.ait.lienzo.client.core.shape.OrthogonalPolyLine) BoundingBox(com.ait.lienzo.client.core.types.BoundingBox) WiresMagnet(com.ait.lienzo.client.core.shape.wires.WiresMagnet)

Example 30 with Point2DArray

use of com.ait.lienzo.client.core.types.Point2DArray in project lienzo-core by ahome-it.

the class ShapeControlUtils method getPoint2Ds.

private static Point2DArray getPoint2Ds(final Point2DArray linePoints, Point2DArray intersectPoints, final Point2D absLoc, final PathPartList pathPartList) {
    final Point2DArray offsetLinePoints = new Point2DArray();
    for (final Point2D p : linePoints) {
        offsetLinePoints.push(p.copy().offset(-absLoc.getX(), -absLoc.getY()));
    }
    final Point2DArray pathPartIntersectPoints = Geometry.getIntersectPolyLinePath(offsetLinePoints, pathPartList, false);
    if (pathPartIntersectPoints != null) {
        if (intersectPoints == null) {
            intersectPoints = new Point2DArray();
        }
        for (final Point2D p : pathPartIntersectPoints) {
            intersectPoints.push(p);
        }
    }
    return intersectPoints;
}
Also used : Point2DArray(com.ait.lienzo.client.core.types.Point2DArray) Point2D(com.ait.lienzo.client.core.types.Point2D)

Aggregations

Point2DArray (com.ait.lienzo.client.core.types.Point2DArray)47 Point2D (com.ait.lienzo.client.core.types.Point2D)37 BoundingBox (com.ait.lienzo.client.core.types.BoundingBox)6 HashSet (java.util.HashSet)6 Set (java.util.Set)5 Direction (com.ait.lienzo.shared.core.types.Direction)4 IControlHandle (com.ait.lienzo.client.core.shape.wires.IControlHandle)3 IControlHandleList (com.ait.lienzo.client.core.shape.wires.IControlHandleList)3 PathPartList (com.ait.lienzo.client.core.types.PathPartList)3 Attributes (com.ait.lienzo.client.core.shape.Attributes)2 MultiPath (com.ait.lienzo.client.core.shape.MultiPath)2 WiresMagnet (com.ait.lienzo.client.core.shape.wires.WiresMagnet)2 DashArray (com.ait.lienzo.client.core.types.DashArray)2 Transform (com.ait.lienzo.client.core.types.Transform)2 NFastDoubleArrayJSO (com.ait.tooling.nativetools.client.collection.NFastDoubleArrayJSO)2 Test (org.junit.Test)2 Group (com.ait.lienzo.client.core.shape.Group)1 Line (com.ait.lienzo.client.core.shape.Line)1 Node (com.ait.lienzo.client.core.shape.Node)1 OrthogonalPolyLine (com.ait.lienzo.client.core.shape.OrthogonalPolyLine)1