本文整理汇总了C++中Geometry类的典型用法代码示例。如果您正苦于以下问题:C++ Geometry类的具体用法?C++ Geometry怎么用?C++ Geometry使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Geometry类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: daisy_assert
void
MovementSolute::divide_top_outgoing (const Geometry& geo,
const Chemical& chemical,
const double J_above,
std::map<size_t, double>& J_primary,
std::map<size_t, double>& J_secondary,
std::map<size_t, double>& J_tertiary)
{
daisy_assert (J_above > 0.0); // Positive upward flux.
const std::vector<size_t>& edge_above
= geo.cell_edges (Geometry::cell_above);
const size_t edge_above_size = edge_above.size ();
double total_amount = 0.0; // [g/cm]
double total_area = 0.0; // [cm^2]
// Find total content in primary domain in cells connected to border.
for (size_t i = 0; i < edge_above_size; i++)
{
const size_t edge = edge_above[i];
const int cell = geo.edge_other (edge, Geometry::cell_above);
daisy_assert (geo.cell_is_internal (cell));
const double area = geo.edge_area (edge);
// No flux out of tertiary or secondary domains.
J_tertiary[edge] = 0.0;
J_secondary[edge] = 0.0;
// Find content
const double M = chemical.M_primary (cell); // [g/cm^3]
const double amount = M * area; // [g/cm]
total_amount += amount; // [g/cm]
total_area += area;
J_primary[edge] = M; // [g/cm^3]
}
// Scale with content
if (total_amount > 0.0)
{
// [cm/h] = [g/cm^2/h] * [cm^2] / [g/cm]
const double scale = -J_above * total_area / total_amount;
for (size_t i = 0; i < edge_above_size; i++)
{
const size_t edge = edge_above[i];
const double in_sign
= geo.cell_is_internal (geo.edge_to (edge)) ? 1.0 : -1.0;
// [g/cm^2/h] = [g/cm^3] * [cm/h]
J_tertiary[edge] = 0.0;
J_secondary[edge] = 0.0;
J_primary[edge] *= in_sign * scale;
}
}
else
{
daisy_assert (iszero (total_amount));
for (size_t i = 0; i < edge_above_size; i++)
{
const size_t edge = edge_above[i];
const double in_sign
= geo.cell_is_internal (geo.edge_to (edge)) ? 1.0 : -1.0;
J_tertiary[edge] = 0.0;
J_secondary[edge] = 0.0;
J_primary[edge] = -J_above * in_sign;
}
}
}
示例2: Read
Geometry * PolyParser::Parse ( cvct::VCTGeometry & geo )
{
typedef std::vector<std::string> Ring;//存线
typedef std::vector<Ring> RingList;//存环
Ring pt;
RingList ringlist;
char * pTemp = NULL;
Read ( &pTemp, geo.start_pos, geo.end_pos );
char ** poLine = CSLTokenizeString2 ( pTemp, " \n\r\t,", 0 );
Geometry * pGeo = new Geometry();
//由线转面
//线变成一个环
//变成一个环
//先判断是否反转
//查找对象
//变成一个环
poLine = CSLAddString(poLine, "0");
for ( int i = 0; i != CSLCount ( poLine ); ++i )
{
if ( EQUAL ( poLine[i], "0" ) )
{
ringlist.push_back ( pt );
pt.clear();
}
else
{
pt.push_back ( std::string ( poLine[i] ) );
}
}
for ( auto iRing = ringlist.begin(); iRing != ringlist.end(); ++iRing )
{
GeometryPart * ring = new GeometryPart();
for ( auto iLine = iRing->begin(); iLine != iRing->end(); ++iLine )
{
bool bset;//true,表示反方向,false,正方向
int objid = atoi(iLine->c_str());
//查找是否有“-”号,是否反转
if ( objid > 0 )
{
bset = false;
}
else
{
objid = -objid;
bset = true;
}
//在所有的要素中,查找线,或面对像
auto it = vctindex->GetFeatureById(objid);
Geometry * geoline = NULL;
//解析线对象
if (it->geotype == cvct::GT_LINE)
{
LineParser iline(vctfile, vctindex);
geoline = iline.Parse ( it->geometry );
}
//解析面对象
else if (it->geotype == cvct::GT_POLYGON)
{
PolyParser ipoly(vctfile, vctindex);
geoline = ipoly.Parse ( it->geometry );
}
/// 增加结点个数
geo.nVertices += it->geometry.nVertices;
//将线对象放到环中
if ( bset )
{
ring->insert ( ring->end(), geoline->operator[](0)->rbegin(), geoline->operator[](0)->rend() );
}
else
{
ring->insert ( ring->end(), geoline->operator[](0)->begin(), geoline->operator[](0)->end() );
}
}
if (ring->empty())
{
continue;
}
else
{
pGeo->push_back ( ring );
//.........这里部分代码省略.........
示例3: lock
void
ImageOverlay::init()
{
OpenThreads::ScopedLock< OpenThreads::Mutex > lock(_mutex);
_geode->removeDrawables(0, _geode->getNumDrawables() );
if ( getMapNode() )
{
double height = 0;
osg::Geometry* geometry = new osg::Geometry();
geometry->setUseVertexBufferObjects(true);
const osg::EllipsoidModel* ellipsoid = getMapNode()->getMapSRS()->getEllipsoid();
const SpatialReference* mapSRS = getMapNode()->getMapSRS();
// calculate a bounding polytope in world space (for mesh clamping):
osg::ref_ptr<Feature> f = new Feature( new Polygon(), mapSRS->getGeodeticSRS() );
Geometry* g = f->getGeometry();
g->push_back( osg::Vec3d(_lowerLeft.x(), _lowerLeft.y(), 0) );
g->push_back( osg::Vec3d(_lowerRight.x(), _lowerRight.y(), 0) );
g->push_back( osg::Vec3d(_upperRight.x(), _upperRight.y(), 0) );
g->push_back( osg::Vec3d(_upperLeft.x(), _upperLeft.y(), 0) );
//_boundingPolytope = f->getWorldBoundingPolytope();
f->getWorldBoundingPolytope( getMapNode()->getMapSRS(), _boundingPolytope );
// next, convert to world coords and create the geometry:
osg::Vec3Array* verts = new osg::Vec3Array();
verts->reserve(4);
osg::Vec3d anchor;
for( Geometry::iterator i = g->begin(); i != g->end(); ++i )
{
osg::Vec3d map, world;
f->getSRS()->transform( *i, mapSRS, map);
mapSRS->transformToWorld( map, world );
if (i == g->begin())
{
anchor = world;
}
verts->push_back( world - anchor );
}
_transform->setMatrix( osg::Matrixd::translate( anchor ) );
geometry->setVertexArray( verts );
if ( verts->getVertexBufferObject() )
verts->getVertexBufferObject()->setUsage(GL_STATIC_DRAW_ARB);
osg::Vec4Array* colors = new osg::Vec4Array(1);
(*colors)[0] = osg::Vec4(1,1,1,*_alpha);
geometry->setColorArray( colors );
geometry->setColorBinding( osg::Geometry::BIND_OVERALL );
GLushort tris[6] = { 0, 1, 2,
0, 2, 3
};
geometry->addPrimitiveSet(new osg::DrawElementsUShort( GL_TRIANGLES, 6, tris ) );
bool flip = false;
if (_image.valid())
{
//Create the texture
_texture = new osg::Texture2D(_image.get());
_texture->setResizeNonPowerOfTwoHint(false);
updateFilters();
_geode->getOrCreateStateSet()->setTextureAttributeAndModes(0, _texture, osg::StateAttribute::ON);
flip = _image->getOrigin()==osg::Image::TOP_LEFT;
}
osg::Vec2Array* texcoords = new osg::Vec2Array(4);
(*texcoords)[0].set(0.0f,flip ? 1.0 : 0.0f);
(*texcoords)[1].set(1.0f,flip ? 1.0 : 0.0f);
(*texcoords)[2].set(1.0f,flip ? 0.0 : 1.0f);
(*texcoords)[3].set(0.0f,flip ? 0.0 : 1.0f);
geometry->setTexCoordArray(0, texcoords);
//Only run the MeshSubdivider on geocentric maps
if (getMapNode()->getMap()->isGeocentric())
{
MeshSubdivider ms(osg::Matrixd::inverse(_transform->getMatrix()), _transform->getMatrix());
ms.run(*geometry, osg::DegreesToRadians(5.0), GEOINTERP_RHUMB_LINE);
}
_geode->addDrawable( geometry );
_geometry = geometry;
_dirty = false;
// Set the annotation up for auto-clamping. We always need to auto-clamp a draped image
// so that the mesh roughly conforms with the surface, otherwise the draping routine
// might clip it.
Style style;
style.getOrCreate<AltitudeSymbol>()->clamping() = AltitudeSymbol::CLAMP_RELATIVE_TO_TERRAIN;
applyStyle( style );
//.........这里部分代码省略.........
示例4: parts
osg::Geode*
BuildGeometryFilter::processPoints(FeatureList& features, FilterContext& context)
{
osg::Geode* geode = new osg::Geode();
bool makeECEF = false;
const SpatialReference* featureSRS = 0L;
const SpatialReference* mapSRS = 0L;
// set up referencing information:
if ( context.isGeoreferenced() )
{
makeECEF = context.getSession()->getMapInfo().isGeocentric();
featureSRS = context.extent()->getSRS();
mapSRS = context.getSession()->getMapInfo().getProfile()->getSRS();
}
for( FeatureList::iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
GeometryIterator parts( input->getGeometry(), true );
while( parts.hasMore() )
{
Geometry* part = parts.next();
// extract the required point symbol; bail out if not found.
const PointSymbol* point =
input->style().isSet() && input->style()->has<PointSymbol>() ? input->style()->get<PointSymbol>() :
_style.get<PointSymbol>();
if ( !point )
continue;
// resolve the color:
osg::Vec4f primaryColor = point->fill()->color();
osg::ref_ptr<osg::Geometry> osgGeom = new osg::Geometry();
//osgGeom->setUseVertexBufferObjects( true );
//osgGeom->setUseDisplayList( false );
// embed the feature name if requested. Warning: blocks geometry merge optimization!
if ( _featureNameExpr.isSet() )
{
const std::string& name = input->eval( _featureNameExpr.mutable_value(), &context );
osgGeom->setName( name );
}
// build the geometry:
osg::Vec3Array* allPoints = new osg::Vec3Array();
transformAndLocalize( part->asVector(), featureSRS, allPoints, mapSRS, _world2local, makeECEF );
osgGeom->addPrimitiveSet( new osg::DrawArrays(GL_POINTS, 0, allPoints->getNumElements()) );
osgGeom->setVertexArray( allPoints );
if ( input->style().isSet() )
{
//TODO: re-evaluate this. does it hinder geometry merging?
applyPointSymbology( osgGeom->getOrCreateStateSet(), point );
}
// assign the primary color (PER_VERTEX required for later optimization)
osg::Vec4Array* colors = new osg::Vec4Array;
colors->assign( osgGeom->getVertexArray()->getNumElements(), primaryColor );
osgGeom->setColorArray( colors );
osgGeom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
geode->addDrawable( osgGeom );
// record the geometry's primitive set(s) in the index:
if ( context.featureIndex() )
context.featureIndex()->tagDrawable( osgGeom, input );
// install clamping attributes if necessary
if (_style.has<AltitudeSymbol>() &&
_style.get<AltitudeSymbol>()->technique() == AltitudeSymbol::TECHNIQUE_GPU)
{
Clamping::applyDefaultClampingAttrs( osgGeom, input->getDouble("__oe_verticalOffset", 0.0) );
}
}
}
return geode;
}
示例5: assemble_cortical
void assemble_cortical(const Geometry& geo, Matrix& mat, const Head2EEGMat& M, const std::string& domain_name, const unsigned gauss_order, double alpha, double beta, const std::string &filename)
{
// Following the article: M. Clerc, J. Kybic "Cortical mapping by Laplace–Cauchy transmission using a boundary element method".
// Assumptions:
// - domain_name: the domain containing the sources is an innermost domain (defined as the interior of only one interface (called Cortex)
// - Cortex interface is composed of one mesh only (no shared vertices)
// TODO check orders of MxM products for efficiency ... delete intermediate matrices
const Domain& SourceDomain = geo.domain(domain_name);
const Interface& Cortex = SourceDomain.begin()->interface();
const Mesh& cortex = Cortex.begin()->mesh();
// test the assumption
assert(SourceDomain.size() == 1);
assert(Cortex.size() == 1);
// shape of the new matrix:
unsigned Nl = geo.size()-geo.outermost_interface().nb_triangles()-Cortex.nb_vertices()-Cortex.nb_triangles();
unsigned Nc = geo.size()-geo.outermost_interface().nb_triangles();
std::fstream f(filename.c_str());
Matrix P;
if ( !f ) {
// build the HeadMat:
// The following is the same as assemble_HM except N_11, D_11 and S_11 are not computed.
SymMatrix mat_temp(Nc);
mat_temp.set(0.0);
double K = 1.0 / (4.0 * M_PI);
// We iterate over the meshes (or pair of domains) to fill the lower half of the HeadMat (since its symmetry)
for ( Geometry::const_iterator mit1 = geo.begin(); mit1 != geo.end(); ++mit1) {
for ( Geometry::const_iterator mit2 = geo.begin(); (mit2 != (mit1+1)); ++mit2) {
// if mit1 and mit2 communicate, i.e they are used for the definition of a common domain
const int orientation = geo.oriented(*mit1, *mit2); // equals 0, if they don't have any domains in common
// equals 1, if they are both oriented toward the same domain
// equals -1, if they are not
if ( orientation != 0) {
double Scoeff = orientation * geo.sigma_inv(*mit1, *mit2) * K;
double Dcoeff = - orientation * geo.indicator(*mit1, *mit2) * K;
double Ncoeff;
if ( !(mit1->outermost() || mit2->outermost()) && ( (*mit1 != *mit2)||( *mit1 != cortex) ) ) {
// Computing S block first because it's needed for the corresponding N block
operatorS(*mit1, *mit2, mat_temp, Scoeff, gauss_order);
Ncoeff = geo.sigma(*mit1, *mit2)/geo.sigma_inv(*mit1, *mit2);
} else {
Ncoeff = orientation * geo.sigma(*mit1, *mit2) * K;
}
if ( !mit1->outermost() && (( (*mit1 != *mit2)||( *mit1 != cortex) )) ) {
// Computing D block
operatorD(*mit1, *mit2, mat_temp, Dcoeff, gauss_order);
}
if ( ( *mit1 != *mit2 ) && ( !mit2->outermost() ) ) {
// Computing D* block
operatorD(*mit1, *mit2, mat_temp, Dcoeff, gauss_order, true);
}
// Computing N block
if ( (*mit1 != *mit2)||( *mit1 != cortex) ) {
operatorN(*mit1, *mit2, mat_temp, Ncoeff, gauss_order);
}
}
}
}
// Deflate the diagonal block (N33) of 'mat' : (in order to have a zero-mean potential for the outermost interface)
const Interface i = geo.outermost_interface();
unsigned i_first = (*i.begin()->mesh().vertex_begin())->index();
deflat(mat_temp, i, mat_temp(i_first, i_first) / (geo.outermost_interface().nb_vertices()));
mat = Matrix(Nl, Nc);
mat.set(0.0);
// copy mat_temp into mat except the lines for cortex vertices [i_vb_c, i_ve_c] and cortex triangles [i_tb_c, i_te_c].
unsigned iNl = 0;
unsigned i_vb_c = (*cortex.vertex_begin())->index();
unsigned i_ve_c = (*cortex.vertex_rbegin())->index();
unsigned i_tb_c = cortex.begin()->index();
unsigned i_te_c = cortex.rbegin()->index();
for ( unsigned i = 0; i < Nc; ++i) {
if ( !(i_vb_c<=i && i<=i_ve_c) && !(i_tb_c<=i && i<=i_te_c) ) {
mat.setlin(iNl, mat_temp.getlin(i));
++iNl;
}
}
// ** Construct P: the null-space projector **
Matrix W;
{
Matrix U, s;
mat.svd(U, s, W);
}
SparseMatrix S(Nc,Nc);
// we set S to 0 everywhere, except in the last part of the diag:
for ( unsigned i = Nl; i < Nc; ++i) {
S(i, i) = 1.0;
}
P = (W * S) * W.transpose(); // P is a projector: P^2 = P and mat*P*X = 0
if ( filename.length() != 0 ) {
std::cout << "Saving projector P (" << filename << ")." << std::endl;
P.save(filename);
}
} else {
std::cout << "Loading projector P (" << filename << ")." << std::endl;
P.load(filename);
}
// ** Get the gradient of P1&P0 elements on the meshes **
Matrix MM(M.transpose() * M);
//.........这里部分代码省略.........
示例6: GetFaces
void DecalSet::GetFaces(Vector<PODVector<DecalVertex> >& faces, Drawable* target, unsigned batchIndex, const Frustum& frustum,
const Vector3& decalNormal, float normalCutoff)
{
// Try to use the most accurate LOD level if possible
Geometry* geometry = target->GetLodGeometry(batchIndex, 0);
if (!geometry || geometry->GetPrimitiveType() != TRIANGLE_LIST)
return;
const unsigned char* positionData = 0;
const unsigned char* normalData = 0;
const unsigned char* skinningData = 0;
const unsigned char* indexData = 0;
unsigned positionStride = 0;
unsigned normalStride = 0;
unsigned skinningStride = 0;
unsigned indexStride = 0;
IndexBuffer* ib = geometry->GetIndexBuffer();
if (ib)
{
indexData = ib->GetShadowData();
indexStride = ib->GetIndexSize();
}
// For morphed models positions, normals and skinning may be in different buffers
for (unsigned i = 0; i < geometry->GetNumVertexBuffers(); ++i)
{
VertexBuffer* vb = geometry->GetVertexBuffer(i);
if (!vb)
continue;
unsigned elementMask = geometry->GetVertexElementMask(i);
unsigned char* data = vb->GetShadowData();
if (!data)
continue;
if (elementMask & MASK_POSITION)
{
positionData = data;
positionStride = vb->GetVertexSize();
}
if (elementMask & MASK_NORMAL)
{
normalData = data + vb->GetElementOffset(ELEMENT_NORMAL);
normalStride = vb->GetVertexSize();
}
if (elementMask & MASK_BLENDWEIGHTS)
{
skinningData = data + vb->GetElementOffset(ELEMENT_BLENDWEIGHTS);
skinningStride = vb->GetVertexSize();
}
}
// Positions and indices are needed
if (!positionData)
{
// As a fallback, try to get the geometry's raw vertex/index data
unsigned elementMask;
geometry->GetRawData(positionData, positionStride, indexData, indexStride, elementMask);
if (!positionData)
{
LOGWARNING("Can not add decal, target drawable has no CPU-side geometry data");
return;
}
}
if (indexData)
{
unsigned indexStart = geometry->GetIndexStart();
unsigned indexCount = geometry->GetIndexCount();
// 16-bit indices
if (indexStride == sizeof(unsigned short))
{
const unsigned short* indices = ((const unsigned short*)indexData) + indexStart;
const unsigned short* indicesEnd = indices + indexCount;
while (indices < indicesEnd)
{
GetFace(faces, target, batchIndex, indices[0], indices[1], indices[2], positionData, normalData, skinningData,
positionStride, normalStride, skinningStride, frustum, decalNormal, normalCutoff);
indices += 3;
}
}
else
// 32-bit indices
{
const unsigned* indices = ((const unsigned*)indexData) + indexStart;
const unsigned* indicesEnd = indices + indexCount;
while (indices < indicesEnd)
{
GetFace(faces, target, batchIndex, indices[0], indices[1], indices[2], positionData, normalData, skinningData,
positionStride, normalStride, skinningStride, frustum, decalNormal, normalCutoff);
indices += 3;
}
}
}
else
{
//.........这里部分代码省略.........
示例7: temp
osg::Geode*
BuildGeometryFilter::processPolygonizedLines(FeatureList& features,
bool twosided,
FilterContext& context)
{
osg::Geode* geode = new osg::Geode();
// establish some referencing
bool makeECEF = false;
const SpatialReference* featureSRS = 0L;
const SpatialReference* mapSRS = 0L;
if ( context.isGeoreferenced() )
{
makeECEF = context.getSession()->getMapInfo().isGeocentric();
featureSRS = context.extent()->getSRS();
mapSRS = context.getSession()->getMapInfo().getProfile()->getSRS();
}
// iterate over all features.
for( FeatureList::iterator i = features.begin(); i != features.end(); ++i )
{
Feature* input = i->get();
// extract the required line symbol; bail out if not found.
const LineSymbol* line =
input->style().isSet() && input->style()->has<LineSymbol>() ? input->style()->get<LineSymbol>() :
_style.get<LineSymbol>();
if ( !line )
continue;
// run a symbol script if present.
if ( line->script().isSet() )
{
StringExpression temp( line->script().get() );
input->eval( temp, &context );
}
// The operator we'll use to make lines into polygons.
PolygonizeLinesOperator polygonizer( *line->stroke() );
// iterate over all the feature's geometry parts. We will treat
// them as lines strings.
GeometryIterator parts( input->getGeometry(), true );
while( parts.hasMore() )
{
Geometry* part = parts.next();
// if the underlying geometry is a ring (or a polygon), close it so the
// polygonizer will generate a closed loop.
Ring* ring = dynamic_cast<Ring*>(part);
if ( ring )
ring->close();
// skip invalid geometry
if ( part->size() < 2 )
continue;
// transform the geometry into the target SRS and localize it about
// a local reference point.
osg::ref_ptr<osg::Vec3Array> verts = new osg::Vec3Array();
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array();
transformAndLocalize( part->asVector(), featureSRS, verts.get(), normals.get(), mapSRS, _world2local, makeECEF );
// turn the lines into polygons.
osg::Geometry* geom = polygonizer( verts.get(), normals.get(), twosided );
if ( geom )
{
geode->addDrawable( geom );
}
// record the geometry's primitive set(s) in the index:
if ( context.featureIndex() )
context.featureIndex()->tagDrawable( geom, input );
// install clamping attributes if necessary
if (_style.has<AltitudeSymbol>() &&
_style.get<AltitudeSymbol>()->technique() == AltitudeSymbol::TECHNIQUE_GPU)
{
Clamping::applyDefaultClampingAttrs( geom, input->getDouble("__oe_verticalOffset", 0.0) );
}
}
polygonizer.installShaders( geode );
}
return geode;
}
示例8: GetBoundingBox
void Implicit::Render()
{
// Draw bounding box for debugging
Bbox b = GetBoundingBox();
Vector3<float> & v0 = b.pMin;
Vector3<float> & v1 = b.pMax;
if(mSelected) {
glLineWidth(2.0f);
glColor3f(0.8f,0.8f,0.8f);
}
else glColor3f(0.1f,0.1f,0.1f);
glBegin(GL_LINE_STRIP);
glVertex3f(v0[0], v0[1], v0[2]);
glVertex3f(v1[0], v0[1], v0[2]);
glVertex3f(v1[0], v1[1], v0[2]);
glVertex3f(v0[0], v1[1], v0[2]);
glVertex3f(v0[0], v0[1], v0[2]);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3f(v0[0], v0[1], v1[2]);
glVertex3f(v1[0], v0[1], v1[2]);
glVertex3f(v1[0], v1[1], v1[2]);
glVertex3f(v0[0], v1[1], v1[2]);
glVertex3f(v0[0], v0[1], v1[2]);
glEnd();
glBegin(GL_LINES);
glVertex3f(v0[0], v0[1], v0[2]);
glVertex3f(v0[0], v0[1], v1[2]);
glVertex3f(v1[0], v0[1], v0[2]);
glVertex3f(v1[0], v0[1], v1[2]);
glVertex3f(v0[0], v1[1], v0[2]);
glVertex3f(v0[0], v1[1], v1[2]);
glVertex3f(v1[0], v1[1], v0[2]);
glVertex3f(v1[0], v1[1], v1[2]);
glEnd();
glLineWidth(1.0f);
glPushMatrix();
glMultMatrixf(mTransform.ToGLMatrix().GetArrayPtr());
Geometry * mesh = dynamic_cast<Geometry *>(mMesh);
if (mesh == NULL)
std::cerr << "Error: implicit geometry not triangulated, add call to triangulate()" << std::endl;
else {
mesh->SetShowNormals(mShowNormals);
mesh->SetWireframe(mWireframe);
mesh->SetOpacity(mOpacity);
mesh->Render();
}
if (mVisualizationMode == Gradients) {
if(typeid(*mMesh) == typeid(SimpleMesh)){
SimpleMesh * ptr = static_cast<SimpleMesh*>(mMesh);
const std::vector<SimpleMesh::Vertex>& verts = ptr->GetVerts();
glDisable(GL_LIGHTING);
Matrix4x4<float> M = GetTransform().Transpose();
glColor3f(0, 0, 1);
glBegin(GL_LINES);
for(unsigned int i=0; i < verts.size(); i++){
const Vector3<float> vObject = verts.at(i).pos;
// Transform vertex position to world space
Vector4<float> vWorld = GetTransform() * Vector4<float>(vObject[0],vObject[1],vObject[2],1);
// Get gradient in world space
Vector3<float> nWorld = GetGradient(vWorld[0], vWorld[1], vWorld[2]);
// Transform gradient to object space
Vector4<float> nObject = M * Vector4<float>(nWorld[0],nWorld[1],nWorld[2],0);
Vector3<float> n = Vector3<float>(nObject[0], nObject[1], nObject[2]);
glVertex3fv(vObject.GetArrayPtr());
glVertex3fv((vObject + n*0.1).GetArrayPtr());
}
glEnd();
}
else {
std::cerr << "No Gradient visualization mode implemented for mesh type: " << typeid(*mMesh).name() << std::endl;
}
}
glPopMatrix();
GLObject::Render();
}
示例9: prepareForTesselation
void
BuildGeometryFilter::tileAndBuildPolygon(Geometry* ring,
const SpatialReference* featureSRS,
const SpatialReference* outputSRS,
bool makeECEF,
bool tessellate,
osg::Geometry* osgGeom,
const osg::Matrixd &world2local)
{
#define MAX_POINTS_PER_CROP_TILE 1024
//#define TARGET_TILE_SIZE_EXTENT_DEGREES 5
if ( ring == 0L )
{
OE_WARN << LC << "Ring is NULL.\n";
return;
}
// Tile the incoming polygon if necessary
// NB: this breaks down at higher latitudes; see https://github.com/gwaldron/osgearth/issues/746
GeometryCollection tiles;
if (_maxPolyTilingAngle_deg.isSet())
prepareForTesselation( ring, featureSRS, _maxPolyTilingAngle_deg.get(), MAX_POINTS_PER_CROP_TILE, tiles);
else
tiles.push_back( ring );
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
//OE_NOTICE << LC << "TABP: tiles = " << tiles.size() << "\n";
// Process each ring independently
for (int ringIndex = 0; ringIndex < tiles.size(); ringIndex++)
{
Geometry* geom = tiles[ringIndex].get();
if (geom)
{
// temporary target geometry for this cell:
osg::ref_ptr<osg::Geometry> temp = new osg::Geometry();
temp->setVertexArray( new osg::Vec3Array() );
// establish a local plane for this cell based on its centroid:
GeoPoint cellCenter(featureSRS, geom->getBounds().center());
cellCenter.transform(outputSRS, cellCenter);
osg::Matrix world2cell;
cellCenter.createWorldToLocal( world2cell );
// build the localized polygon:
buildPolygon(geom, featureSRS, outputSRS, makeECEF, temp.get(), world2cell);
// if successful, transform the verts back into our master LTP:
if ( temp->getNumPrimitiveSets() > 0 )
{
// Tesselate the polygon while the coordinates are still in the LTP
if (tesselateGeometry( temp.get() ))
{
osg::Vec3Array* verts = static_cast<osg::Vec3Array*>(temp->getVertexArray());
if ( verts->getNumElements() > 0 )
{
// Convert the coordinates back to the master LTP.
// This is ok, but you will probably run into precision errors if the tile size is very large.
osg::Matrix cell2world;
cell2world.invert( world2cell );
osg::Matrix cell2local = cell2world * world2local; // pre-multiply to avoid precision loss
for(int i=0; i<verts->size(); ++i)
{
(*verts)[i] = (*verts)[i] * cell2local;
}
geode->addDrawable(temp.get());
}
}
}
}
else
{
OE_TEST << LC << "TABP: Uh oh. found a non-Ring geometry: " << geom->toString(geom->getComponentType()) << "\n";
}
}
// The geode is going to contain all of our polygons now, so merge them into one.
osgUtil::Optimizer optimizer;
osgUtil::Optimizer::MergeGeometryVisitor mgv;
// We only want one Geometry, so don't limit the number of vertices.
mgv.setTargetMaximumNumberOfVertices(UINT_MAX);
mgv.apply( *geode.get() );
// and copy them into the output geometry.
if ( geode->getNumDrawables() > 0 )
{
// If we have more than one drawable after the MergeGeometryVisitor ran, we have a problem so
// dump out some info to help debug.
if (geode->getNumDrawables() != 1)
{
OE_WARN << LC << "MergeGeometryVisitor failed to merge geometries into a single one. Num drawables " << geode->getNumDrawables() << std::endl;
for (unsigned int i = 0; i < geode->getNumDrawables(); i++)
{
osg::Geometry* g = geode->getDrawable(i)->asGeometry();
if (g)
{
//.........这里部分代码省略.........
示例10: Vec2Array
ref_ptr<osg::Geode>
arengine::Image::createGeodeForImage(osg::Image* image,int posx, int posy, int width, int height)
{
if (image)
{
if (width>0 && height>0)
{
float y = 1.0;
float x = y*((float)width/float(height));
// set up the texture.
Config *config = Singleton<Config>::getInstance();
osg::Texture *texture;
float texcoord_x;
float texcoord_y;
if (config->useTexture2D())
{
osg::Texture2D *texture2D = new osg::Texture2D;
texture2D->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR);
texture2D->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR);
texture2D->setResizeNonPowerOfTwoHint(false);
texture2D->setImage(image);
texcoord_x = 1.0f;
texcoord_y = 1.0f;
texture = texture2D;
}
else
{
osg::TextureRectangle *textureRect = new osg::TextureRectangle;
textureRect->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR);
textureRect->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR);
//texture->setResizeNonPowerOfTwoHint(false);
textureRect->setImage(image);
texcoord_x = image->s();
texcoord_y = image->t();
texture = textureRect;
}
// set up the drawstate.
osg::StateSet* dstate = new osg::StateSet;
dstate->setMode(GL_CULL_FACE,osg::StateAttribute::OFF);
dstate->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
dstate->setTextureAttributeAndModes(0, texture,osg::StateAttribute::ON);
// set up the geoset.
Geometry* geom = new Geometry;
geom->setStateSet(dstate);
Vec2Array* coords = new Vec2Array(4);
(*coords)[0].set(posx, posy + height);
(*coords)[1].set(posx, posy);
(*coords)[2].set(posx + width, posy);
(*coords)[3].set(posx + width, posy + height);
geom->setVertexArray(coords);
Vec2Array* tcoords = new Vec2Array(4);
(*tcoords)[0].set(0.0f*texcoord_x,1.0f*texcoord_y);
(*tcoords)[1].set(0.0f*texcoord_x,0.0f*texcoord_y);
(*tcoords)[2].set(1.0f*texcoord_x,0.0f*texcoord_y);
(*tcoords)[3].set(1.0f*texcoord_x,1.0f*texcoord_y);
geom->setTexCoordArray(0,tcoords);
osg::Vec4Array* colours = new osg::Vec4Array(1);
(*colours)[0].set(1.0f,1.0f,1.0,1.0f);
geom->setColorArray(colours);
geom->setColorBinding(Geometry::BIND_OVERALL);
geom->addPrimitiveSet(new DrawArrays(PrimitiveSet::QUADS,0,4));
// set up the geode.
osg::Geode* geode = new osg::Geode;
geode->addDrawable(geom);
return geode;
}
else
{
return NULL;
}
}
else
{
return NULL;
}
}
示例11: wallSkinPRNG
bool
ExtrudeGeometryFilter::process( FeatureList& features, FilterContext& context )
{
// seed our random number generators
Random wallSkinPRNG( _wallSkinSymbol.valid()? *_wallSkinSymbol->randomSeed() : 0, Random::METHOD_FAST );
Random roofSkinPRNG( _roofSkinSymbol.valid()? *_roofSkinSymbol->randomSeed() : 0, Random::METHOD_FAST );
for( FeatureList::iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
GeometryIterator iter( input->getGeometry(), false );
while( iter.hasMore() )
{
Geometry* part = iter.next();
osg::ref_ptr<osg::Geometry> walls = new osg::Geometry();
walls->setUseVertexBufferObjects( _useVertexBufferObjects.get() );
osg::ref_ptr<osg::Geometry> rooflines = 0L;
osg::ref_ptr<osg::Geometry> baselines = 0L;
osg::ref_ptr<osg::Geometry> outlines = 0L;
if ( part->getType() == Geometry::TYPE_POLYGON )
{
rooflines = new osg::Geometry();
rooflines->setUseVertexBufferObjects( _useVertexBufferObjects.get() );
// prep the shapes by making sure all polys are open:
static_cast<Polygon*>(part)->open();
}
// fire up the outline geometry if we have a line symbol.
if ( _outlineSymbol != 0L )
{
outlines = new osg::Geometry();
outlines->setUseVertexBufferObjects( _useVertexBufferObjects.get() );
}
// make a base cap if we're doing stencil volumes.
if ( _makeStencilVolume )
{
baselines = new osg::Geometry();
baselines->setUseVertexBufferObjects( _useVertexBufferObjects.get() );
}
// calculate the extrusion height:
float height;
if ( _heightCallback.valid() )
{
height = _heightCallback->operator()(input, context);
}
else if ( _heightExpr.isSet() )
{
height = input->eval( _heightExpr.mutable_value(), &context );
}
else
{
height = *_extrusionSymbol->height();
}
// calculate the height offset from the base:
float offset = 0.0;
if ( _heightOffsetExpr.isSet() )
{
offset = input->eval( _heightOffsetExpr.mutable_value(), &context );
}
osg::ref_ptr<osg::StateSet> wallStateSet;
osg::ref_ptr<osg::StateSet> roofStateSet;
// calculate the wall texturing:
SkinResource* wallSkin = 0L;
if ( _wallSkinSymbol.valid() )
{
if ( _wallResLib.valid() )
{
SkinSymbol querySymbol( *_wallSkinSymbol.get() );
querySymbol.objectHeight() = fabs(height) - offset;
wallSkin = _wallResLib->getSkin( &querySymbol, wallSkinPRNG, context.getDBOptions() );
}
else
{
//TODO: simple single texture?
}
}
// calculate the rooftop texture:
SkinResource* roofSkin = 0L;
if ( _roofSkinSymbol.valid() )
{
if ( _roofResLib.valid() )
{
SkinSymbol querySymbol( *_roofSkinSymbol.get() );
roofSkin = _roofResLib->getSkin( &querySymbol, roofSkinPRNG, context.getDBOptions() );
}
else
//.........这里部分代码省略.........
示例12: nodes
Action::ResultE GeometryMergeGraphOp::traverseLeave(
Node * const node, Action::ResultE res)
{
if(isInExcludeList(node))
return Action::Skip;
NodeCore *core = node->getCore();
// skip cores with a dependency on the children number/order
// TODO: find a way to make this extendable
if(core == NULL ||
core->getType().isDerivedFrom(DistanceLOD::getClassType()) ||
core->getType().isDerivedFrom(ScreenLOD ::getClassType()) ||
core->getType().isDerivedFrom(Switch ::getClassType()) ||
core->getType().isDerivedFrom(MultiCore ::getClassType()) )
{
return Action::Continue;
}
typedef std::vector<NodeUnrecPtr> NodeStore;
NodeStore addStore; // nodes to add as children to current one
NodeStore subStore; // nodes (children) to remove from current one
typedef std::vector<Node * > MergeGroup; // geometries that can be merged
typedef std::vector<MergeGroup> MergeList; // list of merge groups
MergeList ml;
Node::MFChildrenType::const_iterator childIt =
node->getMFChildren()->begin();
Node::MFChildrenType::const_iterator childEnd =
node->getMFChildren()->end ();
// group geometry children that are mergeable
for(; childIt != childEnd; ++childIt)
{
if((*childIt)->getCore()->getType() != Geometry::getClassType())
continue;
if(isInExcludeList(*childIt) || isInPreserveList(*childIt))
continue;
Geometry *geo = dynamic_cast<Geometry *>((*childIt)->getCore());
Material *mat = geo->getMaterial();
MergeList::iterator mlIt = ml.begin();
MergeList::iterator mlEnd = ml.end ();
bool done = false;
for(; mlIt != mlEnd && !done; ++mlIt)
{
Geometry *mlGeo =
dynamic_cast<Geometry *>(mlIt->front()->getCore());
Material *mlMat = mlGeo->getMaterial();
if(compareContainerEqual(mlMat, mat) &&
mergeableGeo (mlGeo, geo) )
{
mlIt->push_back(*childIt);
done = true;
}
}
if(!done)
{
ml .push_back(MergeGroup());
ml.back().push_back(*childIt );
}
}
// merge geometry in the same group and replace obsolete children with
// new geometry
MergeList::iterator mlIt = ml.begin();
MergeList::iterator mlEnd = ml.end ();
for(; mlIt != mlEnd; ++mlIt)
{
// only one geometry in merge group -> nothing to do
if(mlIt->size() <= 1)
continue;
FINFO(("GeometryMergeGraphOp::traverseLeave: Merging [%" PRISize "] "
"Geometries.\n", mlIt->size()));
GeometryUnrecPtr geo1;
GeometryUnrecPtr geo2;
NodeUnrecPtr newNode = Node::create();
MergeGroup::iterator mgIt = mlIt->begin();
MergeGroup::iterator mgEnd = mlIt->end ();
geo1 = dynamic_cast<Geometry *>((*mgIt)->getCore());
// remove the first geo as well
subStore.push_back(*mgIt);
++mgIt;
for(UInt32 i = 0; mgIt != mgEnd; ++mgIt, ++i)
{
geo2 = dynamic_cast<Geometry *>((*mgIt)->getCore());
//.........这里部分代码省略.........
示例13: main_main
void main_main ()
{
// What time is it now? We'll use this to compute total run time.
Real strt_time = ParallelDescriptor::second();
// AMREX_SPACEDIM: number of dimensions
int n_cell, max_grid_size;
Vector<int> bc_lo(AMREX_SPACEDIM,0);
Vector<int> bc_hi(AMREX_SPACEDIM,0);
// inputs parameters
{
// ParmParse is way of reading inputs from the inputs file
ParmParse pp;
// We need to get n_cell from the inputs file - this is the
// number of cells on each side of a square (or cubic) domain.
pp.get("n_cell", n_cell);
// The domain is broken into boxes of size max_grid_size
max_grid_size = 32;
pp.query("max_grid_size", max_grid_size);
}
Vector<int> is_periodic(AMREX_SPACEDIM,0);
for (int idim=0; idim < AMREX_SPACEDIM; ++idim) {
is_periodic[idim] = 1;
}
// make BoxArray and Geometry
BoxArray ba;
Geometry geom;
{
IntVect dom_lo(AMREX_D_DECL( 0, 0, 0));
IntVect dom_hi(AMREX_D_DECL(n_cell-1, n_cell-1, n_cell-1));
Box domain(dom_lo, dom_hi);
// Initialize the boxarray "ba" from the single box "bx"
ba.define(domain);
// Break up boxarray "ba" into chunks no larger than
// "max_grid_size" along a direction
ba.maxSize(max_grid_size);
// This defines the physical box, [0, 1] in each direction.
RealBox real_box({AMREX_D_DECL(0.0, 0.0, 0.0)},
{AMREX_D_DECL(1.0, 1.0, 1.0)});
// This defines a Geometry object
geom.define(domain, &real_box,
CoordSys::cartesian, is_periodic.data());
}
// Nghost = number of ghost cells for each array
int Nghost = 0;
// do the runtime parameter initializations and microphysics inits
if (ParallelDescriptor::IOProcessor()) {
std::cout << "reading extern runtime parameters ..." << std::endl;
}
ParmParse ppa("amr");
std::string probin_file = "probin";
ppa.query("probin_file", probin_file);
const int probin_file_length = probin_file.length();
Vector<int> probin_file_name(probin_file_length);
for (int i = 0; i < probin_file_length; i++)
probin_file_name[i] = probin_file[i];
init_unit_test(probin_file_name.dataPtr(), &probin_file_length);
// Ncomp = number of components for each array
int Ncomp = -1;
init_variables();
get_ncomp(&Ncomp);
int name_len = -1;
get_name_len(&name_len);
// get the variable names
Vector<std::string> varnames;
for (int i=0; i<Ncomp; i++) {
char* cstring[name_len+1];
get_var_name(cstring, &i);
std::string name(*cstring);
varnames.push_back(name);
}
// time = starting time in the simulation
Real time = 0.0;
// How Boxes are distrubuted among MPI processes
DistributionMapping dm(ba);
//.........这里部分代码省略.........
示例14: LineString
Geometry*
GeometryFactory::createArc(const osg::Vec3d& center,
const Distance& radius,
const Angle& start,
const Angle& end,
unsigned numSegments,
Geometry* geomToUse) const
{
Geometry* geom = geomToUse? geomToUse : new LineString();
if ( numSegments == 0 )
{
// automatically calculate
double segLen = radius.as(Units::METERS) / 8.0;
double circumference = 2*osg::PI*radius.as(Units::METERS);
numSegments = (unsigned)::ceil(circumference / segLen);
}
double startRad = std::min( start.as(Units::RADIANS), end.as(Units::RADIANS) );
double endRad = std::max( start.as(Units::RADIANS), end.as(Units::RADIANS) );
if ( endRad == startRad )
endRad += 2*osg::PI;
double span = endRad - startRad;
double step = span/(double)numSegments;
if ( _srs.valid() && _srs->isGeographic() )
{
double earthRadius = _srs->getEllipsoid()->getRadiusEquator();
double lat = osg::DegreesToRadians(center.y());
double lon = osg::DegreesToRadians(center.x());
double rM = radius.as(Units::METERS);
for( int i=numSegments-1; i >= 0; --i )
{
double angle = startRad + step*(double)i;
double clat, clon;
GeoMath::destination( lat, lon, angle, rM, clat, clon, earthRadius );
geom->push_back( osg::Vec3d(osg::RadiansToDegrees(clon), osg::RadiansToDegrees(clat), center.z()) );
}
}
else
{
double rM = radius.as(Units::METERS);
for( int i=numSegments-1; i >= 0; --i )
{
double angle = startRad + step*(double)i;
double x, y;
x = center.x() + sin(angle)*rM;
y = center.y() + cos(angle)*rM;
geom->push_back( osg::Vec3d(x, y, center.z()) );
}
}
geom->rewind(Geometry::ORIENTATION_CCW);
return geom;
}
示例15: OSG_OSB_LOG
void
OSBGeometryElement::postReadV100(void)
{
OSG_OSB_LOG(("OSBGeometryElement::postReadV100\n"));
OSBRootElement *root = editRoot();
Geometry *geo =
dynamic_cast<Geometry*>(getContainer());
UInt32 indexMappingSize = UInt32(_indexMapping.size());
if(indexMappingSize <= 1)
{
OSG_OSB_LOG(("OSBGeometryElement::postReadV100: "
"Converting single index.\n" ));
if(_indicesPacked)
{
OSG_OSB_LOG(("OSBGeometryElement::postReadV100: "
"Converting packed indices.\n" ));
geo->setIndices(_indices);
}
else
{
OSG_OSB_LOG(("OSBGeometryElement::postReadV100: "
"Converting non-packed indices.\n" ));
// indices stored in container with id _indicesId
// create PtrFieldInfo structure to set all entries of field
// "propIndices" to the container with id _indicesId
FieldDescriptionBase *indFieldDesc =
geo->getFieldDescription("propIndices");
UInt32 indFieldId = indFieldDesc->getFieldId();
root->editPtrFieldList().push_back(PtrFieldInfo(geo, indFieldId));
PtrFieldInfo &indFieldPFI = root->editPtrFieldList().back();
for(UInt32 i = 0; i < Geometry::MaxAttribs; ++i)
{
indFieldPFI.editIdStore().push_back(_indicesId);
}
}
}
else
{
OSG_OSB_LOG(("OSBGeometryElement::postReadV100: "
"Converting multi index.\n" ));
OSBGeometryHelper gh;
if(_indicesPacked)
{
OSG_OSB_LOG(("OSBGeometryElement::postReadV100: "
"Converting packed indices.\n" ));
// create 16 bit or 32 bit indices
if(_indices16Bit)
{
GeoUInt16Property *ui16Indices =
dynamic_pointer_cast<GeoUInt16Property>(_indices);
gh.splitMultiIndex<GeoUInt16Property *>(
_indexMapping, ui16Indices, geo);
}
else
{
GeoUInt32Property *ui32Indices =
dynamic_pointer_cast<GeoUInt32Property>(_indices);
gh.splitMultiIndex<GeoUInt32Property *>(
_indexMapping, ui32Indices, geo);
}
}
else
{
OSG_OSB_LOG(("OSBGeometryElement::postReadV100: "
"Converting non-packed indices.\n" ));
FieldContainerIdMapConstIt mapIt =
root->getIdMap().find(_indicesId);
if(mapIt != root->getIdMap().end())
{
_indices = dynamic_cast<GeoIntegralProperty *>(
FieldContainerFactory::the()->getContainer(mapIt->second));
}
else
{
FWARNING(("OSBGeometryElement::postReadV100: "
"Could not find indices property.\n"));
return;
}
if(_indices->getFormatSize() == sizeof(UInt16))
{
GeoUInt16Property *ui16Indices =
dynamic_pointer_cast<GeoUInt16Property>(_indices);
gh.splitMultiIndex<GeoUInt16Property *>(
_indexMapping, ui16Indices, geo);
//.........这里部分代码省略.........