use of net.sf.latexdraw.model.api.shape.Point in project latexdraw by arnobl.
the class SVGBezierCurve method pathToBezierCurve.
/**
* Creates a bezier curve and initialises its path from an SVG element.
*/
private static BezierCurve pathToBezierCurve(final SVGElement elt) {
if (!(elt instanceof SVGPathElement)) {
return null;
}
final SVGPathSegList list = ((SVGPathElement) elt).getSegList();
if (list.size() < 2 || !(list.get(0) instanceof SVGPathSegMoveto)) {
return null;
}
final SVGPathSegMoveto m = (SVGPathSegMoveto) list.get(0);
CtrlPointsSeg c;
int i = 1;
final int size = list.size();
// Creating a point to support when the first path element is relative.
Point2D pt = new Point2D.Double();
final List<Point> pts = new ArrayList<>();
final List<Point> ctrlpts = new ArrayList<>();
final boolean closed;
pt = m.getPoint(pt);
pts.add(ShapeFactory.INST.createPoint(pt));
if (list.get(1) instanceof CtrlPointsSeg) {
// We set the control point of the first point.
c = (CtrlPointsSeg) list.get(1);
ctrlpts.add(ShapeFactory.INST.createPoint(c.getCtrl1(pt)));
}
while (i < size && list.get(i) instanceof CtrlPointsSeg) {
c = (CtrlPointsSeg) list.get(i);
final Point2D currPt = c.getPoint(pt);
pts.add(ShapeFactory.INST.createPoint(currPt));
ctrlpts.add(ShapeFactory.INST.createPoint(c.getCtrl2(pt)));
pt = currPt;
i++;
}
if (pts.size() > 2 && pts.get(pts.size() - 1).equals(pts.get(0), 0.00001)) {
// We set the shape as closed
pts.remove(pts.size() - 1);
ctrlpts.remove(ctrlpts.size() - 1);
closed = true;
} else {
// There is something else at the end of the path.
closed = i < size && list.get(i) instanceof SVGPathSegClosePath;
}
final BezierCurve bc = ShapeFactory.INST.createBezierCurve(pts, ctrlpts);
bc.setOpened(!closed);
return bc;
}
use of net.sf.latexdraw.model.api.shape.Point in project latexdraw by arnobl.
the class SVGRhombus method toSVG.
@Override
SVGElement toSVG(@NotNull final SVGDocument doc) {
final Point tl = shape.getTopLeftPoint();
final Point br = shape.getBottomRightPoint();
final Point gc = shape.getGravityCentre();
final Point p1 = ShapeFactory.INST.createPoint((tl.getX() + br.getX()) / 2d, tl.getY());
final Point p2 = ShapeFactory.INST.createPoint(br.getX(), (tl.getY() + br.getY()) / 2d);
final Point p3 = ShapeFactory.INST.createPoint((tl.getX() + br.getX()) / 2d, br.getY());
final SVGElement root = new SVGGElement(doc);
final double gap = getPositionGap() / 2d;
final double cornerGap1 = MathUtils.INST.getCornerGap(gc, p1, p2, gap);
double cornerGap2 = MathUtils.INST.getCornerGap(gc, p2, p3, gap);
if (p2.getX() < p3.getX()) {
cornerGap2 *= -1d;
}
final String points = String.valueOf(p1.getX()) + ',' + (p1.getY() - cornerGap1) + ' ' + (p2.getX() + cornerGap2) + ',' + p2.getY() + ' ' + p3.getX() + ',' + (p3.getY() + cornerGap1) + ' ' + (tl.getX() - cornerGap2) + ',' + p2.getY();
root.setAttribute(LNamespace.LATEXDRAW_NAMESPACE + ':' + LNamespace.XML_TYPE, LNamespace.XML_TYPE_RHOMBUS);
root.setAttribute(SVGAttributes.SVG_ID, getSVGID());
setShadowPolygon(doc, root, points);
final SVGElement elt = new SVGPolygonElement(doc);
elt.setAttribute(SVGAttributes.SVG_POINTS, points);
root.appendChild(elt);
root.setAttribute(LNamespace.LATEXDRAW_NAMESPACE + ':' + LNamespace.XML_POINTS, String.valueOf(tl.getX()) + ' ' + tl.getY() + ' ' + br.getX() + ' ' + tl.getY() + ' ' + tl.getX() + ' ' + br.getY() + ' ' + br.getX() + ' ' + br.getY());
setDbleBorderPolygon(doc, root, points);
setSVGAttributes(doc, elt, true);
setSVGRotationAttribute(root);
return root;
}
use of net.sf.latexdraw.model.api.shape.Point in project latexdraw by arnobl.
the class SVGSquare method toSVG.
@Override
SVGElement toSVG(@NotNull final SVGDocument document) {
if (document.getFirstChild().getDefs() == null) {
return null;
}
final double gap = getPositionGap();
final Point tl = shape.getTopLeftPoint();
final Point br = shape.getBottomRightPoint();
SVGElement elt;
final SVGElement root = new SVGGElement(document);
final double width = Math.max(1d, br.getX() - tl.getX() + gap);
final double x = tl.getX() - gap / 2d;
final double y = tl.getY() - gap / 2d;
root.setAttribute(LNamespace.LATEXDRAW_NAMESPACE + ':' + LNamespace.XML_TYPE, LNamespace.XML_TYPE_SQUARE);
root.setAttribute(SVGAttributes.SVG_ID, getSVGID());
setShadowSVGRect(root, x, y, width, width, document);
if (shape.hasShadow() && !PSTricksConstants.LINE_NONE_STYLE.equals(shape.getLineStyle().getLatexToken())) {
// The background of the borders must be filled is there is a shadow.
elt = new SVGRectElement(x, y, width, width, document);
setSVGBorderBackground(elt, root);
setSVGRoundCorner(elt);
}
elt = new SVGRectElement(x, y, width, width, document);
root.appendChild(elt);
setSVGAttributes(document, elt, true);
setSVGRoundCorner(elt);
setDbleBordSVGRect(root, x, y, width, width, document);
setSVGRotationAttribute(root);
return root;
}
use of net.sf.latexdraw.model.api.shape.Point in project latexdraw by arnobl.
the class SVGTriangle method toSVG.
@Override
SVGElement toSVG(@NotNull final SVGDocument doc) {
if (doc.getFirstChild().getDefs() == null) {
return null;
}
final SVGElement root = new SVGGElement(doc);
root.setAttribute(LNamespace.LATEXDRAW_NAMESPACE + ':' + LNamespace.XML_TYPE, LNamespace.XML_TYPE_TRIANGLE);
root.setAttribute(SVGAttributes.SVG_ID, getSVGID());
final double gap = getPositionGap() / 2d;
final Point pt1 = shape.getTopLeftPoint();
final Point pt2 = shape.getBottomRightPoint();
final Point p1 = ShapeFactory.INST.createPoint((pt1.getX() + pt2.getX()) / 2d, pt1.getY());
final Point p2 = ShapeFactory.INST.createPoint(pt2.getX(), pt2.getY());
final Point p3 = ShapeFactory.INST.createPoint(pt1.getX(), pt2.getY());
final double p1x = p1.getX();
final double p1y = p1.getY();
final double p2x = p2.getX();
final double p2y = p2.getY();
final double p3x = p3.getX();
double cornerGap1 = MathUtils.INST.getCornerGap(ShapeFactory.INST.createPoint(p1x, p2y), p1, p2, gap);
double cornerGap2 = MathUtils.INST.getCornerGap(shape.getGravityCentre(), p2, p3, gap);
if (p2x > p3x) {
cornerGap2 *= -1d;
}
if (p1y > p2y) {
cornerGap1 *= -1d;
}
final double value = p2y + (p1y < p2y ? gap : -gap);
final String points = p1x + "," + (p1y - cornerGap1) + " " + (p2x - cornerGap2) + "," + value + " " + (p3x + cornerGap2) + "," + value;
final String ltdPoints = shape.getPoints().stream().flatMap(pt -> Stream.of(String.valueOf(pt.getX()), String.valueOf(pt.getY()))).collect(Collectors.joining(" "));
setShadowPolygon(doc, root, points);
final SVGElement elt = new SVGPolygonElement(doc);
elt.setAttribute(SVGAttributes.SVG_POINTS, points);
root.appendChild(elt);
root.setAttribute(LNamespace.LATEXDRAW_NAMESPACE + ':' + LNamespace.XML_POINTS, ltdPoints);
setDbleBorderPolygon(doc, root, points);
setSVGAttributes(doc, elt, true);
setSVGRotationAttribute(root);
return root;
}
use of net.sf.latexdraw.model.api.shape.Point in project latexdraw by arnobl.
the class SVGPolylines method toSVG.
@Override
SVGElement toSVG(@NotNull final SVGDocument doc) {
final SVGElement root = new SVGGElement(doc);
final SVGDefsElement defs = doc.getFirstChild().getDefs();
final StringBuilder points = new StringBuilder();
final List<Point> pts = shape.getPoints();
SVGPolyLineElement elt;
root.setAttribute(LNamespace.LATEXDRAW_NAMESPACE + ':' + LNamespace.XML_TYPE, LNamespace.XML_TYPE_JOINED_LINES);
root.setAttribute(SVGAttributes.SVG_ID, getSVGID());
for (final Point pt : pts) {
points.append(pt.getX()).append(',').append(pt.getY()).append(' ');
}
final String pointsStr = points.toString();
if (shape.hasShadow()) {
final SVGPolyLineElement shad = new SVGPolyLineElement(doc);
shad.setPoints(pointsStr);
setSVGShadowAttributes(shad, false);
root.appendChild(shad);
parameteriseSVGArrow(shape, shad, 0, true, doc, defs);
parameteriseSVGArrow(shape, shad, 1, true, doc, defs);
}
if (shape.hasShadow() && !PSTricksConstants.LINE_NONE_STYLE.equals(shape.getLineStyle().getLatexToken()) && shape.isFilled()) {
// The background of the borders must be filled is there is a shadow.
elt = new SVGPolyLineElement(doc);
elt.setPoints(pointsStr);
setSVGBorderBackground(elt, root);
}
elt = new SVGPolyLineElement(doc);
elt.setPoints(pointsStr);
root.appendChild(elt);
if (shape.hasDbleBord()) {
final SVGPolyLineElement dblBord = new SVGPolyLineElement(doc);
dblBord.setPoints(pointsStr);
setSVGDoubleBordersAttributes(dblBord);
root.appendChild(dblBord);
}
setSVGAttributes(doc, elt, false);
elt.setAttribute(LNamespace.LATEXDRAW_NAMESPACE + ':' + LNamespace.XML_ROTATION, String.valueOf(shape.getRotationAngle()));
parameteriseSVGArrow(shape, elt, 0, false, doc, defs);
parameteriseSVGArrow(shape, elt, shape.getNbArrows() - 1, false, doc, defs);
return root;
}
Aggregations