int main(int argc, char** argv) { // Notice the negative image Y coords. geomPt p[3] = {{50,-50}, {100,-100}, {0,-100}}; // Image verts in pixels. geomPt t[3] = {{0,0}, {1,-1}, {-1,-1}}; // Target verts in meters. geomVec e[3] = {{.02,.04}, {.12,.16}, {.20,.24}}; // Vertex error vecs in meters. blendTriObj to, *tri = &to; geomPt bpt = {50,-75}; double b[3]; geomVec eb; geomCopy(p, tri->verts); geomCopy(t, tri->target); geomCopy(e, tri->error); initBlendTri(tri); printf("tri is "); prBlendTri(tri); baryCoords(tri, bpt, b); printf("b = baryCoords(tri, (50,-75)) is [%g,%g,%g],\n%s\n", b[0], b[1], b[2], " should be [.5, .25, .25]"); errorBlend(tri, b, eb); printf("eb = errorBlend(tri, b) is [%g,%g],\n%s\n", eb[0], eb[1], " should be [-.09, -.12] = [.01+.03+.05, .02+.04+.06]"); return 0; }
// Construct a line through two points. void initGeomLine(geomPt pt1, geomPt pt2, geomLine self) { geomVec perp; geomCopy(pt1, self->pt1); geomCopy(pt2, self->pt2); // (A,B) is the vector perpendicular to right side of line, (deltaY, -deltaX). perp[0] = pt2[1]-pt1[1]; perp[1] = pt1[0]-pt2[0]; vecNormalize(perp, perp); self->A = perp[0]; self->B = perp[1]; // C is the negative of the distance of the line from the origin. self->C = 0.0; // Small chicken-and-egg problem... self->C = -signedDist(self,pt1); }
void QgsMapToolOffsetCurve::setOffsetForRubberBand( double offset, bool leftSide ) { // need at least geos 3.3 for OffsetCurve tool #if defined(GEOS_VERSION_MAJOR) && defined(GEOS_VERSION_MINOR) && \ ((GEOS_VERSION_MAJOR>3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR>=3))) if ( !mRubberBand || !mOriginalGeometry ) { return; } QgsVectorLayer* sourceLayer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( mSourceLayerId ) ); if ( !sourceLayer ) { return; } QgsGeometry geomCopy( *mOriginalGeometry ); const GEOSGeometry* geosGeom = geomCopy.asGeos(); if ( geosGeom ) { QSettings s; int joinStyle = s.value( "/Qgis/digitizing/offset_join_style", 0 ).toInt(); int quadSegments = s.value( "/Qgis/digitizing/offset_quad_seg", 8 ).toInt(); double mitreLimit = s.value( "/Qgis/digitizing/offset_miter_limit", 5.0 ).toDouble(); GEOSGeometry* offsetGeom = GEOSOffsetCurve_r( QgsGeometry::getGEOSHandler(), geosGeom, leftSide ? offset : -offset, quadSegments, joinStyle, mitreLimit ); if ( !offsetGeom ) { deleteRubberBandAndGeometry(); deleteDistanceItem(); delete mSnapVertexMarker; mSnapVertexMarker = 0; mForceCopy = false; mGeometryModified = false; deleteDistanceItem(); emit messageEmitted( tr( "Creating offset geometry failed" ), QgsMessageBar::CRITICAL ); return; } if ( offsetGeom ) { mModifiedGeometry.fromGeos( offsetGeom ); mRubberBand->setToGeometry( &mModifiedGeometry, sourceLayer ); } } #else //GEOS_VERSION>=3.3 Q_UNUSED( offset ); Q_UNUSED( leftSide ); #endif //GEOS_VERSION>=3.3 }