int setup(void) { test1=newpoly(coeff1); test2=newpoly(coeff2); test3=newpoly(coeff3); test4=newpoly(coeff4); return 0; }
void Infill::addInfillPoly(Poly p) { // Poly *zigzagpoly = NULL; switch (type) { // case ZigzagInfill: // take parallel lines and connect ends // zigzagpoly = new Poly(p.getZ(),extrusionfactor); case BridgeInfill: case ParallelInfill: { // make lines instead of closed polygons Vector2d l,rotl; double sina = sin(-angle); double cosa = cos(-angle); // use the lines that have the angle of this Infill for (uint i=0; i < p.size() ; i+=1 ) { l = (p.getVertexCircular(i+1) - p.getVertexCircular(i)); // rotate with neg. infill angle and see whether it's 90° as infill lines rotl = Vector2d(l.x*cosa-l.y*sina, l.y*cosa+l.x*sina); if (abs(rotl.x) < 0.1 && abs(rotl.y) > 0.1) { // if (zigzagpoly) { // zigzagpoly->addVertex(p.getVertexCircular(i+i%2)); // zigzagpoly->addVertex(p.getVertexCircular(i+1+i%2)); // } else { Poly newpoly(p.getZ(), extrusionfactor); newpoly.vertices.push_back(p.getVertexCircular(i)); newpoly.vertices.push_back(p.getVertexCircular(i+1)); infillpolys.push_back(newpoly); } } // else // if (zigzagpoly) { // zigzagpoly->addVertex(p.getVertexCircular(i)); // } } // if (zigzagpoly) { // cerr << zigzagpoly->size()<< endl; // if (zigzagpoly->size()>0) // infillpolys.push_back(*zigzagpoly); // else delete zigzagpoly; // cerr << infillpolys.size()<< endl; // } } break; default: { p.setExtrusionFactor(extrusionfactor); infillpolys.push_back(p); } } }
poly poly::add(poly p) { term *ptermarray=p.getArray(); int n=p.getTerms()+term_num; poly newpoly(n,0); list polyMerge(term_num,p.getTerms(),0,0); polyMerge.merge(termarray,ptermarray,poly_func,newpoly); if(newpoly.getCapacity()>newpoly.getTerms())//clean the space { term *newArray=newpoly.getArray(); term *temp=new term[newpoly.getTerms()]; int ptr=newpoly.getTerms()-1; for(;ptr>=0;ptr--) { temp[ptr]=newArray[ptr]; } newpoly.setArray(temp,newpoly.getTerms()); delete []temp; delete []newArray; newArray=NULL; } return newpoly; }
QgsFeatureIds QgsMapToolSelectUtils::getMatchingFeatures( QgsMapCanvas *canvas, const QgsGeometry &selectGeometry, bool doContains, bool singleSelect ) { QgsFeatureIds newSelectedFeatures; if ( selectGeometry.type() != QgsWkbTypes::PolygonGeometry ) return newSelectedFeatures; QgsVectorLayer *vlayer = QgsMapToolSelectUtils::getCurrentVectorLayer( canvas ); if ( !vlayer ) return newSelectedFeatures; // toLayerCoordinates will throw an exception for any 'invalid' points in // the rubber band. // For example, if you project a world map onto a globe using EPSG 2163 // and then click somewhere off the globe, an exception will be thrown. QgsGeometry selectGeomTrans = selectGeometry; try { QgsCoordinateTransform ct( canvas->mapSettings().destinationCrs(), vlayer->crs(), QgsProject::instance() ); if ( !ct.isShortCircuited() && selectGeomTrans.type() == QgsWkbTypes::PolygonGeometry ) { // convert add more points to the edges of the rectangle // improve transformation result QgsPolygonXY poly( selectGeomTrans.asPolygon() ); if ( poly.size() == 1 && poly.at( 0 ).size() == 5 ) { const QgsPolylineXY &ringIn = poly.at( 0 ); QgsPolygonXY newpoly( 1 ); newpoly[0].resize( 41 ); QgsPolylineXY &ringOut = newpoly[0]; ringOut[ 0 ] = ringIn.at( 0 ); int i = 1; for ( int j = 1; j < 5; j++ ) { QgsVector v( ( ringIn.at( j ) - ringIn.at( j - 1 ) ) / 10.0 ); for ( int k = 0; k < 9; k++ ) { ringOut[ i ] = ringOut[ i - 1 ] + v; i++; } ringOut[ i++ ] = ringIn.at( j ); } selectGeomTrans = QgsGeometry::fromPolygonXY( newpoly ); } } selectGeomTrans.transform( ct ); } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); // catch exception for 'invalid' point and leave existing selection unchanged QgsDebugMsg( QStringLiteral( "Caught CRS exception " ) ); QgisApp::instance()->messageBar()->pushMessage( QObject::tr( "CRS Exception" ), QObject::tr( "Selection extends beyond layer's coordinate system" ), Qgis::Warning, QgisApp::instance()->messageTimeout() ); return newSelectedFeatures; } QgsDebugMsgLevel( "Selection layer: " + vlayer->name(), 3 ); QgsDebugMsgLevel( "Selection polygon: " + selectGeomTrans.asWkt(), 3 ); QgsDebugMsgLevel( "doContains: " + QString( doContains ? "T" : "F" ), 3 ); QgsRenderContext context = QgsRenderContext::fromMapSettings( canvas->mapSettings() ); context.expressionContext() << QgsExpressionContextUtils::layerScope( vlayer ); std::unique_ptr< QgsFeatureRenderer > r; if ( vlayer->renderer() ) { r.reset( vlayer->renderer()->clone() ); r->startRender( context, vlayer->fields() ); } QgsFeatureRequest request; request.setFilterRect( selectGeomTrans.boundingBox() ); request.setFlags( QgsFeatureRequest::ExactIntersect ); if ( r ) request.setSubsetOfAttributes( r->usedAttributes( context ), vlayer->fields() ); else request.setNoAttributes(); QgsFeatureIterator fit = vlayer->getFeatures( request ); QgsFeature f; QgsFeatureId closestFeatureId = 0; bool foundSingleFeature = false; double closestFeatureDist = std::numeric_limits<double>::max(); while ( fit.nextFeature( f ) ) { context.expressionContext().setFeature( f ); // make sure to only use features that are visible if ( r && !r->willRenderFeature( f, context ) ) continue; QgsGeometry g = f.geometry(); if ( doContains ) { if ( !selectGeomTrans.contains( g ) ) continue; } else { if ( !selectGeomTrans.intersects( g ) ) continue; } if ( singleSelect ) { foundSingleFeature = true; double distance = g.distance( selectGeomTrans ); if ( distance <= closestFeatureDist ) { closestFeatureDist = distance; closestFeatureId = f.id(); } } else { newSelectedFeatures.insert( f.id() ); } } if ( singleSelect && foundSingleFeature ) { newSelectedFeatures.insert( closestFeatureId ); } if ( r ) r->stopRender( context ); QgsDebugMsg( "Number of new selected features: " + QString::number( newSelectedFeatures.size() ) ); return newSelectedFeatures; }