本文整理汇总了C++中Bounds::height方法的典型用法代码示例。如果您正苦于以下问题:C++ Bounds::height方法的具体用法?C++ Bounds::height怎么用?C++ Bounds::height使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Bounds
的用法示例。
在下文中一共展示了Bounds::height方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: scale_iter
FilterContext
ScaleFilter::push( FeatureList& input, FilterContext& cx )
{
for( FeatureList::iterator i = input.begin(); i != input.end(); ++i )
{
Feature* input = i->get();
if ( input && input->getGeometry() )
{
Bounds envelope = input->getGeometry()->getBounds();
// now scale and shift everything
GeometryIterator scale_iter( input->getGeometry() );
while( scale_iter.hasMore() )
{
Geometry* geom = scale_iter.next();
for( osg::Vec3dArray::iterator v = geom->begin(); v != geom->end(); v++ )
{
double xr = (v->x() - envelope.xMin()) / envelope.width();
v->x() += (xr - 0.5) * _scale;
double yr = (v->y() - envelope.yMin()) / envelope.height();
v->y() += (yr - 0.5) * _scale;
}
}
}
}
return cx;
}
示例2: overlaps
// Returns true if these Bounds share any area in common with another.
bool overlaps(const Bounds& other, bool force2d = false) const
{
Point otherMid(other.mid());
return
std::abs(m_mid.x - otherMid.x) <=
width() / 2.0 + other.width() / 2.0 &&
std::abs(m_mid.y - otherMid.y) <=
depth() / 2.0 + other.depth() / 2.0 &&
(force2d || std::abs(m_mid.z - otherMid.z) <=
height() / 2.0 + other.height() / 2.0);
}
示例3: tileGeometry
/**
* Tiles the Geometry into the given number of columns and rows
*/
void tileGeometry(Geometry* geometry, const SpatialReference* featureSRS, unsigned int numCols, unsigned int numRows, GeometryCollection& out)
{
// Clear the output list.
out.clear();
Bounds b = geometry->getBounds();
double tw = b.width() / (double)numCols;
double th = b.height() / (double)numRows;
// Get the average Z, since GEOS will set teh Z of new verts to that of the cropping polygon,
// which is stupid but that's how it is.
double z = 0.0;
for(unsigned i=0; i<geometry->size(); ++i)
z += geometry->at(i).z();
z /= geometry->size();
osg::ref_ptr<Polygon> poly = new Polygon;
poly->resize( 4 );
for(int x=0; x<(int)numCols; ++x)
{
for(int y=0; y<(int)numRows; ++y)
{
(*poly)[0].set( b.xMin() + tw*(double)x, b.yMin() + th*(double)y, z );
(*poly)[1].set( b.xMin() + tw*(double)(x+1), b.yMin() + th*(double)y, z );
(*poly)[2].set( b.xMin() + tw*(double)(x+1), b.yMin() + th*(double)(y+1), z );
(*poly)[3].set( b.xMin() + tw*(double)x, b.yMin() + th*(double)(y+1), z );
osg::ref_ptr<Geometry> ringTile;
if ( geometry->crop(poly.get(), ringTile) )
{
// Use an iterator since crop could return a multi-polygon
GeometryIterator gi( ringTile.get(), false );
while( gi.hasMore() )
{
Geometry* geom = gi.next();
out.push_back( geom );
}
}
}
}
}
示例4: zfinder
bool
ExtrudeGeometryFilter::buildStructure(const Geometry* input,
double height,
double heightOffset,
bool flatten,
const SkinResource* wallSkin,
const SkinResource* roofSkin,
Structure& structure,
FilterContext& cx )
{
bool makeECEF = false;
const SpatialReference* srs = 0L;
const SpatialReference* mapSRS = 0L;
if ( cx.isGeoreferenced() )
{
srs = cx.extent()->getSRS();
makeECEF = cx.getSession()->getMapInfo().isGeocentric();
mapSRS = cx.getSession()->getMapInfo().getProfile()->getSRS();
}
// whether this is a closed polygon structure.
structure.isPolygon = (input->getComponentType() == Geometry::TYPE_POLYGON);
// extrusion working variables
double targetLen = -DBL_MAX;
osg::Vec3d minLoc(DBL_MAX, DBL_MAX, DBL_MAX);
double minLoc_len = DBL_MAX;
osg::Vec3d maxLoc(0,0,0);
double maxLoc_len = 0;
// Initial pass over the geometry does two things:
// 1: Calculate the minimum Z across all parts.
// 2: Establish a "target length" for extrusion
double absHeight = fabs(height);
ConstGeometryIterator zfinder( input );
while( zfinder.hasMore() )
{
const Geometry* geom = zfinder.next();
for( Geometry::const_iterator m = geom->begin(); m != geom->end(); ++m )
{
osg::Vec3d m_point = *m;
if ( m_point.z() + absHeight > targetLen )
targetLen = m_point.z() + absHeight;
if (m_point.z() < minLoc.z())
minLoc = m_point;
if (m_point.z() > maxLoc.z())
maxLoc = m_point;
}
}
// apply the height offsets
height -= heightOffset;
targetLen -= heightOffset;
float roofRotation = 0.0f;
Bounds roofBounds;
float sinR = 0.0f, cosR = 0.0f;
double roofTexSpanX = 0.0, roofTexSpanY = 0.0;
osg::ref_ptr<const SpatialReference> roofProjSRS;
if ( roofSkin )
{
roofBounds = input->getBounds();
// if our data is lat/long, we need to reproject the geometry and the bounds into a projected
// coordinate system in order to properly generate tex coords.
if ( srs && srs->isGeographic() )
{
osg::Vec2d geogCenter = roofBounds.center2d();
roofProjSRS = srs->createUTMFromLonLat( Angle(geogCenter.x()), Angle(geogCenter.y()) );
if ( roofProjSRS.valid() )
{
roofBounds.transform( srs, roofProjSRS.get() );
osg::ref_ptr<Geometry> projectedInput = input->clone();
srs->transform( projectedInput->asVector(), roofProjSRS.get() );
roofRotation = getApparentRotation( projectedInput.get() );
}
}
else
{
roofRotation = getApparentRotation( input );
}
sinR = sin(roofRotation);
cosR = cos(roofRotation);
if ( !roofSkin->isTiled().value() )
{
//note: non-tiled roofs don't really work atm.
roofTexSpanX = cosR*roofBounds.width() - sinR*roofBounds.height();
roofTexSpanY = sinR*roofBounds.width() + cosR*roofBounds.height();
}
else
{
roofTexSpanX = roofSkin->imageWidth().isSet() ? *roofSkin->imageWidth() : roofSkin->imageHeight().isSet() ? *roofSkin->imageHeight() : 10.0;
//.........这里部分代码省略.........
示例5: zfinder
bool
ExtrudeGeometryFilter::extrudeGeometry(const Geometry* input,
double height,
double heightOffset,
bool flatten,
osg::Geometry* walls,
osg::Geometry* roof,
osg::Geometry* base,
osg::Geometry* outline,
const osg::Vec4& wallColor,
const osg::Vec4& wallBaseColor,
const osg::Vec4& roofColor,
const osg::Vec4& outlineColor,
const SkinResource* wallSkin,
const SkinResource* roofSkin,
FilterContext& cx )
{
bool makeECEF = false;
const SpatialReference* srs = 0L;
const SpatialReference* mapSRS = 0L;
if ( cx.isGeoreferenced() )
{
srs = cx.extent()->getSRS();
makeECEF = cx.getSession()->getMapInfo().isGeocentric();
mapSRS = cx.getSession()->getMapInfo().getProfile()->getSRS();
}
bool made_geom = false;
double tex_width_m = wallSkin ? *wallSkin->imageWidth() : 1.0;
double tex_height_m = wallSkin ? *wallSkin->imageHeight() : 1.0;
bool tex_repeats_y = wallSkin ? *wallSkin->isTiled() : false;
bool useColor = (!wallSkin || wallSkin->texEnvMode() != osg::TexEnv::DECAL) && !_makeStencilVolume;
bool isPolygon = input->getComponentType() == Geometry::TYPE_POLYGON;
unsigned pointCount = input->getTotalPointCount();
// If we are extruding a polygon, and applying a wall texture, we need an extra
// point in the geometry in order to close the polygon and generate a unique
// texture coordinate for that final point.
bool isSkinnedPolygon = isPolygon && wallSkin != 0L;
// Total number of verts. Add 2 to close a polygon (necessary so the first and last
// points can have unique texture coordinates)
unsigned numWallVerts = 2 * pointCount + (isSkinnedPolygon? (2 * input->getNumGeometries()) : 0);
// create all the OSG geometry components
osg::Vec3Array* verts = new osg::Vec3Array( numWallVerts );
walls->setVertexArray( verts );
osg::Vec2Array* wallTexcoords = 0L;
if ( wallSkin )
{
wallTexcoords = new osg::Vec2Array( numWallVerts );
walls->setTexCoordArray( 0, wallTexcoords );
}
osg::Vec4Array* colors = 0L;
if ( useColor )
{
// per-vertex colors are necessary if we are going to use the MeshConsolidator -gw
colors = new osg::Vec4Array();
colors->reserve( numWallVerts );
colors->assign( numWallVerts, wallColor );
walls->setColorArray( colors );
walls->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
}
// set up rooftop tessellation and texturing, if necessary:
osg::Vec3Array* roofVerts = 0L;
osg::Vec2Array* roofTexcoords = 0L;
float roofRotation = 0.0f;
Bounds roofBounds;
float sinR = 0.0f, cosR = 0.0f;
double roofTexSpanX = 0.0, roofTexSpanY = 0.0;
osg::ref_ptr<const SpatialReference> roofProjSRS;
if ( roof )
{
roofVerts = new osg::Vec3Array( pointCount );
roof->setVertexArray( roofVerts );
// per-vertex colors are necessary if we are going to use the MeshConsolidator -gw
if ( useColor )
{
osg::Vec4Array* roofColors = new osg::Vec4Array();
roofColors->reserve( pointCount );
roofColors->assign( pointCount, roofColor );
roof->setColorArray( roofColors );
roof->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
}
if ( roofSkin )
{
roofTexcoords = new osg::Vec2Array( pointCount );
roof->setTexCoordArray( 0, roofTexcoords );
// Get the orientation of the geometry. This is a hueristic that will help
//.........这里部分代码省略.........
示例6: iter
void
ScatterFilter::polyScatter(const Geometry* input,
const SpatialReference* inputSRS,
const FilterContext& context,
PointSet* output )
{
Bounds bounds;
double areaSqKm = 0.0;
ConstGeometryIterator iter( input, false );
while( iter.hasMore() )
{
const Polygon* polygon = dynamic_cast<const Polygon*>( iter.next() );
if ( !polygon )
continue;
if ( /*context.isGeocentric() ||*/ context.profile()->getSRS()->isGeographic() )
{
bounds = polygon->getBounds();
double avglat = bounds.yMin() + 0.5*bounds.height();
double h = bounds.height() * 111.32;
double w = bounds.width() * 111.32 * sin( 1.57079633 + osg::DegreesToRadians(avglat) );
areaSqKm = w * h;
}
else if ( context.profile()->getSRS()->isProjected() )
{
bounds = polygon->getBounds();
areaSqKm = (0.001*bounds.width()) * (0.001*bounds.height());
}
double zMin = 0.0;
unsigned numInstancesInBoundingRect = (unsigned)(areaSqKm * (double)osg::clampAbove( 0.1f, _density ));
if ( numInstancesInBoundingRect == 0 )
continue;
if ( _random )
{
// Random scattering. Note, we try to place as many instances as would
// fit in the bounding rectangle; The real placed number will be less since
// we only place models inside the actual polygon. But the density will
// be correct.
for( unsigned j=0; j<numInstancesInBoundingRect; ++j )
{
double x = bounds.xMin() + _prng.next() * bounds.width();
double y = bounds.yMin() + _prng.next() * bounds.height();
bool include = true;
if ( include && polygon->contains2D( x, y ) )
output->push_back( osg::Vec3d(x, y, zMin) );
}
}
else
{
// regular interval scattering:
double numInst1D = sqrt((double)numInstancesInBoundingRect);
double ar = bounds.width() / bounds.height();
unsigned cols = (unsigned)( numInst1D * ar );
unsigned rows = (unsigned)( numInst1D / ar );
double colInterval = bounds.width() / (double)(cols-1);
double rowInterval = bounds.height() / (double)(rows-1);
double interval = 0.5*(colInterval+rowInterval);
for( double cy=bounds.yMin(); cy<=bounds.yMax(); cy += interval )
{
for( double cx = bounds.xMin(); cx <= bounds.xMax(); cx += interval )
{
bool include = true;
if ( include && polygon->contains2D( cx, cy ) )
output->push_back( osg::Vec3d(cx, cy, zMin) );
}
}
}
}
}