Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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
}