/** * Forces underlying curve to a valid state * @param points */ public void validateCurve(List<mxPoint> points, double scale, Map<String, Object> style) { if (curve == null) { curve = new mxCurve(points); } else { curve.updateCurve(points); } curve.setLabelBuffer(scale * mxConstants.DEFAULT_LABEL_BUFFER); }
/** * Method must be called before any attempt to access curve information * @return whether or not the curve may be used */ protected boolean validateCurve() { if (!valid) { createCoreCurve(); } return valid; }
public double getCurveLength(String index) { if (validateCurve()) { if (intervals.get(index) == null) { createLabelCurve(); } return curveLengths.get(index); } return 0; }
/** * Returns the point at which this curve intersects the boundary of * the given rectangle, if it does so. If it does not intersect, * null is returned. If it intersects multiple times, the first * intersection from the start end of the curve is returned. * * @param index the curve index specifying the curve to analyse * @param rect the whose boundary is to be tested for intersection * with this curve * @return the point at which this curve intersects the boundary of * the given rectangle, if it does so. If it does not intersect, * null is returned. */ public mxPoint intersectsRectPerimeter(String index, mxRectangle rect) { mxPoint result = null; mxPoint[] pointsCurve = getCurvePoints(index); if (pointsCurve != null && pointsCurve.length > 1) { int crossingSeg = intersectRectPerimeterSeg(index, rect); if (crossingSeg != -1) { result = intersectRectPerimeterPoint(index, rect, crossingSeg); } } return result; }
mxPoint[] pointsCurve = getCurvePoints(index); double[] curveIntervals = getIntervals(index); int segIndex = intersectRectPerimeterSeg(index, rect); mxPoint intersectPoint = null; intersectPoint = intersectRectPerimeterPoint(index, rect, segIndex); double startSegY = pointsCurve[segIndex - 1].getY(); double distToStartSeg = curveIntervals[segIndex - 1] * getCurveLength(index); double intersectOffsetX = intersectPoint.getX() - startSegX; double intersectOffsetY = intersectPoint.getY() - startSegY;
mxPoint[] pointsCurve = getCurvePoints(index); double[] curveIntervals = getIntervals(index); int lowerLimit = getLowerIndexOfSegment(index, start); mxPoint firstPointOfSeg = pointsCurve[lowerLimit]; double segVectorX = pointsCurve[lowerLimit + 1].getX()
mxPoint[] currentCurve = getBaseLabelCurve(); boolean labelReversed = isLabelReversed(); + (normSegVectorX * labelBuffer)); labelCurvePoints.add(startPoint); updateBounds(startPoint.getX(), startPoint.getY()); double pointY = centerSegY + (normSegVectorX * labelBuffer); mxPoint labelCurvePoint = new mxPoint(pointX, pointY); updateBounds(pointX, pointY); labelCurvePoints.add(labelCurvePoint); + (normSegVectorX * labelBuffer)); labelCurvePoints.add(endPoint); updateBounds(endPoint.getX(), endPoint.getY()); populateIntervals(LABEL_CURVE);
lastPoints = curve.getGuidePoints(); this.labelGlyphs = glyphList.toArray(new LabelGlyphCache[glyphList.size()]); if (curve.isLabelReversed()) double curveLength = curve.getCurveLength(mxCurve.LABEL_CURVE); double currentPos = labelPosition.startBuffer / curveLength; double endPos = 1.0 - (labelPosition.endBuffer / curveLength); || nextParallel == null) parallel = curve.getCurveParallel(mxCurve.LABEL_CURVE, currentPos); / curveLength; nextParallel = curve.getCurveParallel(mxCurve.LABEL_CURVE, currentPosCandidate); mxLine labelCenter = curve.getCurveParallel(mxCurve.LABEL_CURVE, 0.5); overallLabelBounds = new mxRectangle(labelCenter.getX(),
/** * Returns the curve the label curve is too be based on */ protected mxPoint[] getBaseLabelCurve() { return getCurvePoints(CORE_CURVE); }
double markerSize) double curveLength = curve.getCurveLength(mxCurve.CORE_CURVE); double markerRatio = markerSize / curveLength; if (markerRatio >= 1.0) mxLine sourceVector = curve.getCurveParallel(mxCurve.CORE_CURVE, markerRatio); return new mxLine(sourceVector.getX(), sourceVector.getY(), mxLine targetVector = curve.getCurveParallel(mxCurve.CORE_CURVE, 1.0 - markerRatio); int pointCount = points.size();
if (!getBounds().getRectangle().intersects(rect)) mxPoint[] pointsCurve = getCurvePoints(mxCurve.CORE_CURVE);
int hitSeg = intersectRectPerimeterSeg(index, rect); mxPoint[] pointsCurve = getCurvePoints(index);
mxPoint[] currentCurve = getCurvePoints(index); double[] currentIntervals = getIntervals(index); int closestSegment = 0; double closestSegDistSq = 10000000;
/** * */ public mxCurveShape() { this(new mxCurve()); }
/** * Hook method to override how the label is positioned on the curve * @param style the style of the curve * @param label the string label to be displayed on the curve */ protected void calculationLabelPosition(Map<String, Object> style, String label) { double curveLength = curve.getCurveLength(mxCurve.LABEL_CURVE); double availableLabelSpace = curveLength - labelPosition.startBuffer - labelPosition.endBuffer; labelPosition.startBuffer = Math.max(labelPosition.startBuffer, labelPosition.startBuffer + availableLabelSpace / 2 - labelSize / 2); labelPosition.endBuffer = Math.max(labelPosition.endBuffer, labelPosition.endBuffer + availableLabelSpace / 2 - labelSize / 2); }
double[] curveIntervals = getIntervals(index);
mxPoint[] pointsCurve = getCurvePoints(index); double[] curveIntervals = getIntervals(index); int segIndex = intersectRectPerimeterSeg(index, rect); mxPoint intersectPoint = null; intersectPoint = intersectRectPerimeterPoint(index, rect, segIndex); double startSegY = pointsCurve[segIndex - 1].getY(); double distToStartSeg = curveIntervals[segIndex - 1] * getCurveLength(index); double intersectOffsetX = intersectPoint.getX() - startSegX; double intersectOffsetY = intersectPoint.getY() - startSegY;
mxPoint[] pointsCurve = getCurvePoints(index); double[] curveIntervals = getIntervals(index); int lowerLimit = getLowerIndexOfSegment(index, start); mxPoint firstPointOfSeg = pointsCurve[lowerLimit]; double segVectorX = pointsCurve[lowerLimit + 1].getX()
mxPoint[] currentCurve = getBaseLabelCurve(); boolean labelReversed = isLabelReversed(); + (normSegVectorX * labelBuffer)); labelCurvePoints.add(startPoint); updateBounds(startPoint.getX(), startPoint.getY()); double pointY = centerSegY + (normSegVectorX * labelBuffer); mxPoint labelCurvePoint = new mxPoint(pointX, pointY); updateBounds(pointX, pointY); labelCurvePoints.add(labelCurvePoint); + (normSegVectorX * labelBuffer)); labelCurvePoints.add(endPoint); updateBounds(endPoint.getX(), endPoint.getY()); populateIntervals(LABEL_CURVE);
lastPoints = curve.getGuidePoints(); this.labelGlyphs = glyphList.toArray(new LabelGlyphCache[glyphList.size()]); if (curve.isLabelReversed()) double curveLength = curve.getCurveLength(mxCurve.LABEL_CURVE); double currentPos = labelPosition.startBuffer / curveLength; double endPos = 1.0 - (labelPosition.endBuffer / curveLength); || nextParallel == null) parallel = curve.getCurveParallel(mxCurve.LABEL_CURVE, currentPos); / curveLength; nextParallel = curve.getCurveParallel(mxCurve.LABEL_CURVE, currentPosCandidate); mxLine labelCenter = curve.getCurveParallel(mxCurve.LABEL_CURVE, 0.5); overallLabelBounds = new mxRectangle(labelCenter.getX(),