osgEarth 2.1.1
Public Types | Public Member Functions

osgEarth::Symbology::Ring Class Reference

Inheritance diagram for osgEarth::Symbology::Ring:
Collaboration diagram for osgEarth::Symbology::Ring:

List of all members.

Public Types

enum  Orientation { ORIENTATION_CCW, ORIENTATION_CW, ORIENTATION_DEGENERATE }

Public Member Functions

 Ring (int capacity=0)
 Ring (const Ring &ring)
 Ring (const Vec3dVector *toCopy)
virtual GeometrycloneAs (const Geometry::Type &newType) const
Orientation getOrientation () const
virtual bool contains2D (double x, double y) const
virtual double getSignedArea2D () const
virtual void open ()
void rewind (Orientation ori)
virtual Type getType () const
virtual bool isValid () const

Detailed Description

A Ring is a closed region. It is open (the first and last points are not the same). It has an orientation, i.e. it is either wound clockwise or counter-clockwise.

Definition at line 218 of file Geometry.


Member Enumeration Documentation

Enumerator:
ORIENTATION_CCW 
ORIENTATION_CW 
ORIENTATION_DEGENERATE 

Definition at line 221 of file Geometry.


Constructor & Destructor Documentation

osgEarth::Symbology::Ring::Ring ( int  capacity = 0) [inline]

Definition at line 228 of file Geometry.

: Geometry( capacity ) { }
Ring::Ring ( const Ring ring)

Definition at line 405 of file Geometry.cpp.

                            :
Geometry( rhs )
{
    //nop
}
Ring::Ring ( const Vec3dVector toCopy)

Definition at line 411 of file Geometry.cpp.

                                    :
Geometry( data )
{
    open();
}

Here is the call graph for this function:


Member Function Documentation

Geometry * Ring::cloneAs ( const Geometry::Type newType) const [virtual]

Converts this geometry to another type. This function will return "this" if the type is the same, and will return NULL if the conversion is impossible.

Reimplemented from osgEarth::Symbology::Geometry.

Definition at line 418 of file Geometry.cpp.

{
    if ( newType == TYPE_LINESTRING )
    {
        LineString* line = new LineString( &this->asVector() );
        if ( line->size() > 1 && line->front() != line->back() )
            line->push_back( front() );
        return line;
    }
    else return Geometry::cloneAs( newType );
}

Here is the call graph for this function:

bool Ring::contains2D ( double  x,
double  y 
) const [virtual]

Reimplemented in osgEarth::Symbology::Polygon.

Definition at line 517 of file Geometry.cpp.

{
    bool result = false;
    const Ring& poly = *this;
    for( unsigned i=0, j=size()-1; i<size(); j = i++ )
    {
        if ((((poly[i].y() <= y) && (y < poly[j].y())) ||
            ((poly[j].y() <= y) && (y < poly[i].y()))) &&
            (x < (poly[j].x()-poly[i].x()) * (y-poly[i].y())/(poly[j].y()-poly[i].y())+poly[i].x()))
        {
            result = !result;
        }
    }
    return result;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Ring::Orientation Ring::getOrientation ( ) const

Definition at line 431 of file Geometry.cpp.

{
    // adjust for a non-open ring:
    int n = size();
    while( n > 0 && front() == back() )
        n--;

    if ( n < 3 )
        return Ring::ORIENTATION_DEGENERATE;

    // copy the open vec:
    std::vector<osg::Vec3d> v;
    v.reserve( n );
    std::copy( begin(), begin()+n, std::back_inserter(v) );

    int rmin = 0;
    double xmin = v[0].x();
    double ymin = v[0].y();
    v[0].z() = 0;
    for( int i=1; i<n; ++i ) {
        double x = v[i].x();
        double y = v[i].y();
        v[i].z() = 0;
        if ( y > ymin )
            continue;
        if ( y == ymin ) {
            if (x  < xmin )
                continue;
        }
        rmin = i;
        xmin = x;
        ymin = y;
    }

    int rmin_less_1 = rmin-1 >= 0 ? rmin-1 : n-1;
    int rmin_plus_1 = rmin+1 < n ? rmin+1 : 0;

    osg::Vec3 in = v[rmin] - v[rmin_less_1]; in.normalize();
    osg::Vec3 out = v[rmin_plus_1] - v[rmin]; out.normalize();
    osg::Vec3 cross = in ^ out;

    return
        cross.z() < 0.0 ? Ring::ORIENTATION_CW :
        cross.z() > 0.0 ? Ring::ORIENTATION_CCW :
        Ring::ORIENTATION_DEGENERATE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

double Ring::getSignedArea2D ( ) const [virtual]

Definition at line 488 of file Geometry.cpp.

{
    const_cast<Ring*>(this)->open();

    double sum = 0.0;

    for( unsigned i=0; i<size(); ++i )
    {
        const osg::Vec3d& p0 = (*this)[0];
        const osg::Vec3d& p1 = i+1 < size() ? (*this)[i+1] : (*this)[0];
        sum += p0.x()*p1.y() - p1.x()*p0.y();
    }
    return .5*sum;
}

Here is the call graph for this function:

virtual Type osgEarth::Symbology::Ring::getType ( ) const [inline, virtual]

Implements osgEarth::Symbology::Geometry.

Reimplemented in osgEarth::Symbology::Polygon.

Definition at line 251 of file Geometry.

{ return Geometry::TYPE_RING; }
virtual bool osgEarth::Symbology::Ring::isValid ( ) const [inline, virtual]

Reimplemented from osgEarth::Symbology::Geometry.

Definition at line 252 of file Geometry.

{ return size() >= 3; }
void Ring::open ( ) [virtual]

Reimplemented in osgEarth::Symbology::Polygon.

Definition at line 480 of file Geometry.cpp.

{            
    while( size() > 2 && front() == back() )
        erase( end()-1 );
}

Here is the call graph for this function:

Here is the caller graph for this function:

void Ring::rewind ( Orientation  ori)

Definition at line 505 of file Geometry.cpp.

{
    open();
    Orientation current = getOrientation();
    if ( current != orientation && current != ORIENTATION_DEGENERATE && orientation != ORIENTATION_DEGENERATE )
    {
        std::reverse( begin(), end() );
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines