int intersectionWithEnvelope2D(Envelope2D clipEnv2D, boolean includeEnvBoundary, double[] segParams, double[] envelopeDistances) { Point2D p1 = getStartXY(); Point2D p2 = getEndXY(); // includeEnvBoundary xxx ??? int modified = clipEnv2D.clipLine(p1, p2, 0, segParams, envelopeDistances); return modified != 0 ? 2 : 0; }
int intersectionWithEnvelope2D(Envelope2D clipEnv2D, boolean includeEnvBoundary, double[] segParams, double[] envelopeDistances) { Point2D p1 = getStartXY(); Point2D p2 = getEndXY(); // includeEnvBoundary xxx ??? int modified = clipEnv2D.clipLine(p1, p2, 0, segParams, envelopeDistances); return modified != 0 ? 2 : 0; }
@Override Point2D _getTangent(double t) { Point2D pt = new Point2D(); pt.sub(getEndXY(), getStartXY()); return pt; }
@Override Point2D _getTangent(double t) { Point2D pt = new Point2D(); pt.sub(getEndXY(), getStartXY()); return pt; }
int _side(double ptX, double ptY) { Point2D v1 = new Point2D(ptX, ptY); v1.sub(getStartXY()); Point2D v2 = new Point2D(); v2.sub(getEndXY(), getStartXY()); double cross = v2.crossProduct(v1); double crossError = 4 * NumberUtils.doubleEps() * (Math.abs(v2.x * v1.y) + Math.abs(v2.y * v1.x)); return cross > crossError ? -1 : cross < -crossError ? 1 : 0; }
int _side(double ptX, double ptY) { Point2D v1 = new Point2D(ptX, ptY); v1.sub(getStartXY()); Point2D v2 = new Point2D(); v2.sub(getEndXY(), getStartXY()); double cross = v2.crossProduct(v1); double crossError = 4 * NumberUtils.doubleEps() * (Math.abs(v2.x * v1.y) + Math.abs(v2.y * v1.x)); return cross > crossError ? -1 : cross < -crossError ? 1 : 0; }
int compareHorizontal1Case3_(Line line_1, Line line_2) { Point2D v0 = new Point2D(); v0.sub(line_2.getEndXY(), line_2.getStartXY()); v0.rightPerpendicular(); v0.normalize(); Point2D v_1 = new Point2D(); v_1.sub(line_1.getStartXY(), line_2.getStartXY()); Point2D v_2 = new Point2D(); v_2.sub(line_1.getEndXY(), line_2.getStartXY()); double d_1 = v_1.dotProduct(v0); double d_2 = v_2.dotProduct(v0); double ad1 = Math.abs(d_1); double ad2 = Math.abs(d_2); if (ad1 < ad2) { if (ad1 < m_tolerance_10 && line_2._isIntersectingPoint(line_1.getStartXY(), m_tolerance, true)) return errorCracking(); } else { if (ad2 < m_tolerance_10 && line_2._isIntersectingPoint(line_1.getEndXY(), m_tolerance, true)) return errorCracking(); } if (d_1 < 0 && d_2 < 0) return -1; if (d_1 > 0 && d_2 > 0) return 1; return errorCracking(); }
int compareHorizontal1Case3_(Line line_1, Line line_2) { Point2D v0 = new Point2D(); v0.sub(line_2.getEndXY(), line_2.getStartXY()); v0.rightPerpendicular(); v0.normalize(); Point2D v_1 = new Point2D(); v_1.sub(line_1.getStartXY(), line_2.getStartXY()); Point2D v_2 = new Point2D(); v_2.sub(line_1.getEndXY(), line_2.getStartXY()); double d_1 = v_1.dotProduct(v0); double d_2 = v_2.dotProduct(v0); double ad1 = Math.abs(d_1); double ad2 = Math.abs(d_2); if (ad1 < ad2) { if (ad1 < m_tolerance_10 && line_2._isIntersectingPoint(line_1.getStartXY(), m_tolerance, true)) return errorCracking(); } else { if (ad2 < m_tolerance_10 && line_2._isIntersectingPoint(line_1.getEndXY(), m_tolerance, true)) return errorCracking(); } if (d_1 < 0 && d_2 < 0) return -1; if (d_1 > 0 && d_2 > 0) return 1; return errorCracking(); }
int compareNonHorizontalUpperEnd_(SimpleEdge line_1, SimpleEdge line_2) { int sign = 1; if (line_2.m_line.getEndY() < line_1.m_line.getEndY()) { sign = -1; SimpleEdge tmp = line_1; line_1 = line_2; line_2 = tmp; } Line l1 = line_1.m_line; Line l2 = line_2.m_line; // Now line_1 has End point lower than line_2 endpoint. double x_1 = l1.getEndX() - l2.getStartX(); double x2 = line_2.m_dxdy * (l1.getEndY() - l2.getStartY()); double tol = m_tolerance_10; if (x_1 < x2 - tol) return -sign; else if (x_1 > x2 + tol) return sign; else // Possible problem { if (l2._isIntersectingPoint(l1.getEndXY(), m_tolerance, true)) return errorCracking(); return x_1 < x2 ? -sign : sign; } }
int compareNonHorizontalUpperEnd_(SimpleEdge line_1, SimpleEdge line_2) { int sign = 1; if (line_2.m_line.getEndY() < line_1.m_line.getEndY()) { sign = -1; SimpleEdge tmp = line_1; line_1 = line_2; line_2 = tmp; } Line l1 = line_1.m_line; Line l2 = line_2.m_line; // Now line_1 has End point lower than line_2 endpoint. double x_1 = l1.getEndX() - l2.getStartX(); double x2 = line_2.m_dxdy * (l1.getEndY() - l2.getStartY()); double tol = m_tolerance_10; if (x_1 < x2 - tol) return -sign; else if (x_1 > x2 + tol) return sign; else // Possible problem { if (l2._isIntersectingPoint(l1.getEndXY(), m_tolerance, true)) return errorCracking(); return x_1 < x2 ? -sign : sign; } }
Geometry _OffsetLine() { Line line = (Line) m_inputGeometry; Point2D start = line.getStartXY(); Point2D end = line.getEndXY(); Point2D v = new Point2D(); v.sub(end, start); v.normalize(); v.leftPerpendicular(); v.scale(m_distance); start.add(v); end.add(v); Line resLine = (Line) line.createInstance(); line.setStartXY(start); line.setEndXY(end); return resLine; }
Geometry _OffsetLine() { Line line = (Line) m_inputGeometry; Point2D start = line.getStartXY(); Point2D end = line.getEndXY(); Point2D v = new Point2D(); v.sub(end, start); v.normalize(); v.leftPerpendicular(); v.scale(m_distance); start.add(v); end.add(v); Line resLine = (Line) line.createInstance(); line.setStartXY(start); line.setEndXY(end); return resLine; }
int compareHorizontal1Case1_(Line line_1, Line line_2) { // line_2 goes up and line_1 is horizontal connected at the start going // to the right. if (line_1.getEndX() > line_2.getEndX()) { // / // / // +------------------ if (line_2.getEndX() > line_2.getStartX() && line_2.getEndY() - line_2.getStartY() < 2 * m_tolerance && line_1._isIntersectingPoint(line_2.getEndXY(), m_tolerance, true)) return errorCracking(); } else { // / // / // / // +-- assert (line_2.getEndX() - line_2.getStartX() != 0); // Note: line_2 cannot be vertical here // Avoid expensive is_intersecting_ by providing a simple estimate. double dydx = (line_2.getEndY() - line_2.getStartY()) / (line_2.getEndX() - line_2.getStartX()); double d = dydx * (line_1.getEndX() - line_1.getStartX()); if (d < m_tolerance_10 && line_2._isIntersectingPoint(line_1.getEndXY(), m_tolerance, true)) return errorCracking(); } return 1; }
int compareHorizontal1Case1_(Line line_1, Line line_2) { // line_2 goes up and line_1 is horizontal connected at the start going // to the right. if (line_1.getEndX() > line_2.getEndX()) { // / // / // +------------------ if (line_2.getEndX() > line_2.getStartX() && line_2.getEndY() - line_2.getStartY() < 2 * m_tolerance && line_1._isIntersectingPoint(line_2.getEndXY(), m_tolerance, true)) return errorCracking(); } else { // / // / // / // +-- assert (line_2.getEndX() - line_2.getStartX() != 0); // Note: line_2 cannot be vertical here // Avoid expensive is_intersecting_ by providing a simple estimate. double dydx = (line_2.getEndY() - line_2.getStartY()) / (line_2.getEndX() - line_2.getStartX()); double d = dydx * (line_1.getEndX() - line_1.getStartX()); if (d < m_tolerance_10 && line_2._isIntersectingPoint(line_1.getEndXY(), m_tolerance, true)) return errorCracking(); } return 1; }
Point2D start = m_line_1.getStartXY(); Point2D vector = new Point2D(); vector.sub(m_line_1.getEndXY(), start); vector.rightPerpendicular(); Point2D v_2 = new Point2D();
Point2D start = m_line_1.getStartXY(); Point2D vector = new Point2D(); vector.sub(m_line_1.getEndXY(), start); vector.rightPerpendicular(); Point2D v_2 = new Point2D();
int compareHorizontal1Case2_(Line line_1, Line line_2) { // -----------------+ // / // / // / // line_2 goes up and below line_1. line_1 is horizontal connected at // the end to the line_2 end. if (line_1.getStartX() < line_2.getStartX()) { if (line_2.getEndX() > line_2.getStartX() && line_2.getEndY() - line_2.getStartY() < 2 * m_tolerance && line_1._isIntersectingPoint(line_2.getEndXY(), m_tolerance, true)) return errorCracking(); } else { // --+ // / // / // / // Avoid expensive is_intersecting_ by providing a simple estimate. double dydx = (line_2.getEndY() - line_2.getStartY()) / (line_2.getEndX() - line_2.getStartX()); double d = dydx * (line_1.getStartX() - line_1.getEndX()); if (d < m_tolerance_10 && line_2._isIntersectingPoint(line_1.getStartXY(), m_tolerance, true)) return errorCracking(); } return -1; }
int compareHorizontal1Case2_(Line line_1, Line line_2) { // -----------------+ // / // / // / // line_2 goes up and below line_1. line_1 is horizontal connected at // the end to the line_2 end. if (line_1.getStartX() < line_2.getStartX()) { if (line_2.getEndX() > line_2.getStartX() && line_2.getEndY() - line_2.getStartY() < 2 * m_tolerance && line_1._isIntersectingPoint(line_2.getEndXY(), m_tolerance, true)) return errorCracking(); } else { // --+ // / // / // / // Avoid expensive is_intersecting_ by providing a simple estimate. double dydx = (line_2.getEndY() - line_2.getStartY()) / (line_2.getEndX() - line_2.getStartX()); double d = dydx * (line_1.getStartX() - line_1.getEndX()); if (d < m_tolerance_10 && line_2._isIntersectingPoint(line_1.getStartXY(), m_tolerance, true)) return errorCracking(); } return -1; }