EVOLUTION-MANAGER
Edit File: Intersection.cpp
/********************************************************************** * * GEOS - Geometry Engine Open Source * http://geos.osgeo.org * * Copyright (C) 2019 Paul Ramsey <pramsey@cleverlephant.ca> * * This is free software; you can redistribute and/or modify it under * the terms of the GNU Lesser General Public Licence as published * by the Free Software Foundation. * See the COPYING file for more information. * **********************************************************************/ #include <cmath> #include <vector> #include <geos/algorithm/Intersection.h> namespace geos { namespace algorithm { // geos.algorithm /* public static */ geom::Coordinate Intersection::intersection(const geom::Coordinate& p1, const geom::Coordinate& p2, const geom::Coordinate& q1, const geom::Coordinate& q2) { double minX0 = p1.x < p2.x ? p1.x : p2.x; double minY0 = p1.y < p2.y ? p1.y : p2.y; double maxX0 = p1.x > p2.x ? p1.x : p2.x; double maxY0 = p1.y > p2.y ? p1.y : p2.y; double minX1 = q1.x < q2.x ? q1.x : q2.x; double minY1 = q1.y < q2.y ? q1.y : q2.y; double maxX1 = q1.x > q2.x ? q1.x : q2.x; double maxY1 = q1.y > q2.y ? q1.y : q2.y; double intMinX = minX0 > minX1 ? minX0 : minX1; double intMaxX = maxX0 < maxX1 ? maxX0 : maxX1; double intMinY = minY0 > minY1 ? minY0 : minY1; double intMaxY = maxY0 < maxY1 ? maxY0 : maxY1; double midx = (intMinX + intMaxX) / 2.0; double midy = (intMinY + intMaxY) / 2.0; // condition ordinate values by subtracting midpoint double p1x = p1.x - midx; double p1y = p1.y - midy; double p2x = p2.x - midx; double p2y = p2.y - midy; double q1x = q1.x - midx; double q1y = q1.y - midy; double q2x = q2.x - midx; double q2y = q2.y - midy; // unrolled computation using homogeneous coordinates eqn double px = p1y - p2y; double py = p2x - p1x; double pw = p1x * p2y - p2x * p1y; double qx = q1y - q2y; double qy = q2x - q1x; double qw = q1x * q2y - q2x * q1y; double x = py * qw - qy * pw; double y = qx * pw - px * qw; double w = px * qy - qx * py; double xInt = x/w; double yInt = y/w; geom::Coordinate rv; // check for parallel lines if (std::isnan(xInt) || std::isnan(yInt) || std::isinf(xInt) || std::isinf(yInt)) { rv.setNull(); return rv; } // de-condition intersection point rv.x = xInt + midx; rv.y = yInt + midy; return rv; } } // namespace geos.algorithm } // namespace geos