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;
}
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);
}
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;
}
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;
}
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;
}
Aggregations