/// \brief Exp: se3 -> SE3. /// /// Return the integral of the input spatial velocity during time 1. template <typename _Scalar, int _Options> SE3Tpl<_Scalar, _Options> exp6(const MotionTpl<_Scalar,_Options> & nu) { typedef _Scalar Scalar; typedef typename MotionTpl<Scalar,_Options>::Vector3 Vector3; typedef typename MotionTpl<Scalar,_Options>::Matrix3 Matrix3; const Vector3 & w = nu.angular(); const Vector3 & v = nu.linear(); Scalar t = w.norm(); if (t > 1e-15) { Matrix3 R(exp3(w)); Matrix3 S(skew(w)); double ct,st; SINCOS (t,&st,&ct); Matrix3 V( Matrix3::Identity() + (1 - ct) / (t * t) * S + (t - st) / (t * t * t) * S * S); Vector3 p(V * v); return SE3Tpl<_Scalar, _Options>(R, p); } else { return SE3Tpl<_Scalar, _Options>(Matrix3::Identity(), v); } }
void eval_special_columns() { QTest::addColumn<QString>( "string" ); QTest::addColumn<QVariant>( "result" ); QgsExpression::setSpecialColumn( "$var1", QVariant(( int )42 ) ); QgsExpression exp( "$var1 + 1" ); QVariant v1 = exp.evaluate(); QCOMPARE( v1.toInt(), 43 ); QgsExpression::setSpecialColumn( "$var1", QVariant(( int )100 ) ); QVariant v2 = exp.evaluate(); QCOMPARE( v2.toInt(), 101 ); QgsExpression exp2( "_specialcol_('$var1')+1" ); QVariant v3 = exp2.evaluate(); QCOMPARE( v3.toInt(), 101 ); QgsExpression exp3( "_specialcol_('undefined')" ); QVariant v4 = exp3.evaluate(); QCOMPARE( v4, QVariant() ); QgsExpression::unsetSpecialColumn( "$var1" ); }
static bool longValidator(const QString str, double & val) { QStringList myList; QRegExp exp1("^[oOwWeElL][ ]\\d\\d?\\d?[ ]?\\d\\d?[ ]?\\d?\\d?\\.?[0-9]?" ); QRegExp exp2("^[oOwWeElL][;]\\d\\d?\\d?[;]?\\d\\d?[;]?\\d?\\d?\\.?[0-9]?" ); QRegExp exp3("^[oOwWeElL][:]\\d\\d?\\d?[:]?\\d\\d?[:]?\\d?\\d?\\.?[0-9]?" ); QRegExp exp4("^[+-]?\\d\\d?\\d?\\.?[0-9]*" ); double grauDec; if ( exp1.exactMatch( str ) ) { myList = str.split(" "); } else if ( exp2.exactMatch( str ) ) { myList = str.split(";"); } else if ( exp3.exactMatch( str ) ) { myList = str.split(":"); } else if ( exp4.exactMatch( str ) ) { grauDec = str.toDouble(); if ((grauDec >= -180.0 && grauDec <=180.0)) { val = grauDec * TeCDR; return true; } else return false; } else return false; int nelementos = myList.count(); short graus, minutos = 0; float segundos = 0.0; graus = myList[1].toShort(); if (nelementos > 2) minutos = myList[2].toShort(); if (nelementos > 3) segundos = myList[3].toFloat(); if (TeLongDMS2DD(myList[0].at(0).toAscii(),graus, minutos, segundos, grauDec)) { val = grauDec * TeCDR; return true; } else return false; }
void eval_randf() { QgsExpression exp1( "randf(1.5,9.5)" ); QVariant v1 = exp1.evaluate(); QCOMPARE( v1.toDouble() <= 9.5, true ); QCOMPARE( v1.toDouble() >= 1.5, true ); QgsExpression exp2( "randf(-0.0005,-0.0005)" ); QVariant v2 = exp2.evaluate(); QCOMPARE( v2.toDouble(), -0.0005 ); // Invalid expression since max<min QgsExpression exp3( "randf(9.3333,1.784)" ); QVariant v3 = exp3.evaluate(); QCOMPARE( v3.type(), QVariant::Invalid ); }
void eval_rand() { QgsExpression exp1( "rand(1,10)" ); QVariant v1 = exp1.evaluate(); QCOMPARE( v1.toInt() <= 10, true ); QCOMPARE( v1.toInt() >= 1, true ); QgsExpression exp2( "rand(-5,-5)" ); QVariant v2 = exp2.evaluate(); QCOMPARE( v2.toInt(), -5 ); // Invalid expression since max<min QgsExpression exp3( "rand(10,1)" ); QVariant v3 = exp3.evaluate(); QCOMPARE( v3.type(), QVariant::Invalid ); }
void eval_geometry_calc() { QgsPolyline polyline, polygon_ring; polyline << QgsPoint( 0, 0 ) << QgsPoint( 10, 0 ); polygon_ring << QgsPoint( 2, 1 ) << QgsPoint( 10, 1 ) << QgsPoint( 10, 6 ) << QgsPoint( 2, 6 ) << QgsPoint( 2, 1 ); QgsPolygon polygon; polygon << polygon_ring; QgsFeature fPolygon, fPolyline; fPolyline.setGeometry( QgsGeometry::fromPolyline( polyline ) ); fPolygon.setGeometry( QgsGeometry::fromPolygon( polygon ) ); QgsExpression exp1( "$area" ); QVariant vArea = exp1.evaluate( &fPolygon ); QCOMPARE( vArea.toDouble(), 40. ); QgsExpression exp2( "$length" ); QVariant vLength = exp2.evaluate( &fPolyline ); QCOMPARE( vLength.toDouble(), 10. ); QgsExpression exp3( "$perimeter" ); QVariant vPerimeter = exp3.evaluate( &fPolygon ); QCOMPARE( vPerimeter.toDouble(), 26. ); QgsExpression exp4( "bounds_width($geometry)" ); QVariant vBoundsWidth = exp4.evaluate( &fPolygon ); QCOMPARE( vBoundsWidth.toDouble(), 8.0 ); QgsExpression exp5( "bounds_height($geometry)" ); QVariant vBoundsHeight = exp5.evaluate( &fPolygon ); QCOMPARE( vBoundsHeight.toDouble(), 5.0 ); QgsExpression exp6( "xmin($geometry)" ); QVariant vXMin = exp6.evaluate( &fPolygon ); QCOMPARE( vXMin.toDouble(), 2.0 ); QgsExpression exp7( "xmax($geometry)" ); QVariant vXMax = exp7.evaluate( &fPolygon ); QCOMPARE( vXMax.toDouble(), 10.0 ); QgsExpression exp8( "ymin($geometry)" ); QVariant vYMin = exp8.evaluate( &fPolygon ); QCOMPARE( vYMin.toDouble(), 1.0 ); QgsExpression exp9( "ymax($geometry)" ); QVariant vYMax = exp9.evaluate( &fPolygon ); QCOMPARE( vYMax.toDouble(), 6.0 ); }
bool IfcGeom::is_convex(const TopoDS_Wire& wire) { for ( TopExp_Explorer exp1(wire,TopAbs_VERTEX); exp1.More(); exp1.Next() ) { TopoDS_Vertex V1 = TopoDS::Vertex(exp1.Current()); gp_Pnt P1 = BRep_Tool::Pnt(V1); // Store the neighboring points std::vector<gp_Pnt> neighbors; for ( TopExp_Explorer exp3(wire,TopAbs_EDGE); exp3.More(); exp3.Next() ) { TopoDS_Edge edge = TopoDS::Edge(exp3.Current()); std::vector<gp_Pnt> edge_points; for ( TopExp_Explorer exp2(edge,TopAbs_VERTEX); exp2.More(); exp2.Next() ) { TopoDS_Vertex V2 = TopoDS::Vertex(exp2.Current()); gp_Pnt P2 = BRep_Tool::Pnt(V2); edge_points.push_back(P2); } if ( edge_points.size() != 2 ) continue; if ( edge_points[0].IsEqual(P1,GetValue(GV_POINT_EQUALITY_TOLERANCE))) neighbors.push_back(edge_points[1]); else if ( edge_points[1].IsEqual(P1, GetValue(GV_POINT_EQUALITY_TOLERANCE))) neighbors.push_back(edge_points[0]); } // There should be two of these if ( neighbors.size() != 2 ) return false; // Now find the non neighboring points std::vector<gp_Pnt> non_neighbors; for ( TopExp_Explorer exp2(wire,TopAbs_VERTEX); exp2.More(); exp2.Next() ) { TopoDS_Vertex V2 = TopoDS::Vertex(exp2.Current()); gp_Pnt P2 = BRep_Tool::Pnt(V2); if ( P1.IsEqual(P2,GetValue(GV_POINT_EQUALITY_TOLERANCE)) ) continue; bool found = false; for( std::vector<gp_Pnt>::const_iterator it = neighbors.begin(); it != neighbors.end(); ++ it ) { if ( (*it).IsEqual(P2,GetValue(GV_POINT_EQUALITY_TOLERANCE)) ) { found = true; break; } } if ( ! found ) non_neighbors.push_back(P2); } // Calculate the angle between the two edges of the vertex gp_Dir dir1(neighbors[0].XYZ() - P1.XYZ()); gp_Dir dir2(neighbors[1].XYZ() - P1.XYZ()); const double angle = acos(dir1.Dot(dir2)) + 0.0001; // Now for the non-neighbors see whether a greater angle can be found with one of the edges for ( std::vector<gp_Pnt>::const_iterator it = non_neighbors.begin(); it != non_neighbors.end(); ++ it ) { gp_Dir dir3((*it).XYZ() - P1.XYZ()); const double angle2 = acos(dir3.Dot(dir1)); const double angle3 = acos(dir3.Dot(dir2)); if ( angle2 > angle || angle3 > angle ) return false; } } return true; }
void eval_geometry_calc() { QgsPolyline polyline, polygon_ring; polyline << QgsPoint( 0, 0 ) << QgsPoint( 10, 0 ); polygon_ring << QgsPoint( 1, 1 ) << QgsPoint( 6, 1 ) << QgsPoint( 6, 6 ) << QgsPoint( 1, 6 ) << QgsPoint( 1, 1 ); QgsPolygon polygon; polygon << polygon_ring; QgsFeature fPolygon, fPolyline; fPolyline.setGeometry( QgsGeometry::fromPolyline( polyline ) ); fPolygon.setGeometry( QgsGeometry::fromPolygon( polygon ) ); QgsExpression exp1( "$area" ); QVariant vArea = exp1.evaluate( &fPolygon ); QCOMPARE( vArea.toDouble(), 25. ); QgsExpression exp2( "$length" ); QVariant vLength = exp2.evaluate( &fPolyline ); QCOMPARE( vLength.toDouble(), 10. ); QgsExpression exp3( "$perimeter" ); QVariant vPerimeter = exp3.evaluate( &fPolygon ); QCOMPARE( vPerimeter.toDouble(), 20. ); }
Eigen::Matrix<typename Vector3Like::Scalar,3,3,PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options> exp3_proxy(const Vector3Like & v) { return exp3(v); }