📄 offsetpointgenerator.cpp
字号:
/********************************************************************** * $Id: OffsetPointGenerator.cpp 1941 2006-12-13 10:55:55Z strk $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2006 Refractions Research Inc. * * 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. * *********************************************************************** * * Last port: operation/overlay/validate/OffsetPointGenerator.java rev. 1.1 * (we should move in GEOS too, probably) * **********************************************************************/#include <geos/operation/overlay/OffsetPointGenerator.h>#include <geos/geom/Geometry.h>#include <geos/geom/LineString.h> #include <geos/geom/MultiPoint.h> #include <geos/geom/CoordinateSequence.h> #include <geos/geom/GeometryFactory.h>#include <geos/geom/util/LinearComponentExtracter.h> #include <cassert>#include <functional>#include <vector>#include <memory> // for auto_ptr#include <cmath>#include <algorithm> // std::for_each#ifndef GEOS_DEBUG#define GEOS_DEBUG 0#endifusing namespace std;using namespace geos::geom;using namespace geos::algorithm;namespace geos {namespace operation { // geos.operationnamespace overlay { // geos.operation.overlay/*public*/OffsetPointGenerator::OffsetPointGenerator(const geom::Geometry& geom, double offset) : g(geom), offsetDistance(offset){}/*public*/std::auto_ptr< std::vector<geom::Coordinate> >OffsetPointGenerator::getPoints(){ assert (offsetPts.get() == NULL); offsetPts.reset(new vector<Coordinate>()); vector<const LineString*> lines; geos::geom::util::LinearComponentExtracter::getLines(g, lines); for_each(lines.begin(), lines.end(), bind1st(mem_fun(&OffsetPointGenerator::extractPoints), this)); return offsetPts;}/*private*/voidOffsetPointGenerator::extractPoints(const LineString* line){ const CoordinateSequence& pts = *(line->getCoordinatesRO()); assert(pts.size() > 1 ); for (size_t i=0, n=pts.size()-1; i<n; ++i) { computeOffsets(pts[i], pts[i + 1]); }}/*private*/voidOffsetPointGenerator::computeOffsets(const Coordinate& p0, const Coordinate& p1){ double dx = p1.x - p0.x; double dy = p1.y - p0.y; double len = sqrt(dx * dx + dy * dy); // u is the vector that is the length of the offset, // in the direction of the segment double ux = offsetDistance * dx / len; double uy = offsetDistance * dy / len; double midX = (p1.x + p0.x) / 2; double midY = (p1.y + p0.y) / 2; Coordinate offsetLeft(midX - uy, midY + ux); Coordinate offsetRight(midX + uy, midY - ux); offsetPts->push_back(offsetLeft); offsetPts->push_back(offsetRight);}} // namespace geos.operation.overlay} // namespace geos.operation} // namespace geos
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -