Show
Ignore:
Timestamp:
07/17/10 14:03:17 (4 years ago)
Author:
robert
Message:

Added computeIntersectionPoint and computeBisectorNormal functions

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgtext3D/osgtext3D.cpp

    r11678 r11679  
    3232extern int main_test(int, char**); 
    3333 
     34osg::Vec3 computeIntersectionPoint(const osg::Vec3& a, const osg::Vec3& b, const osg::Vec3& c, const osg::Vec3& d) 
     35{ 
     36    float ba_x = b.x()-a.x(); 
     37    float ba_y = b.y()-a.y(); 
     38 
     39    float dc_x = d.x()-c.x(); 
     40    float dc_y = d.y()-c.y(); 
     41 
     42    float denominator = (dc_x * ba_y - dc_y * ba_x); 
     43    if (denominator==0.0) 
     44    { 
     45        // line segments must be parallel. 
     46        return (b+c)*0.5; 
     47    } 
     48 
     49    float t = ((a.x()-c.x())*ba_y + (a.y()-c.y())*ba_x) / denominator; 
     50 
     51    return c + (d-c)*t; 
     52} 
     53 
     54osg::Vec3 computeBisectorNormal(const osg::Vec3& a, const osg::Vec3& b, const osg::Vec3& c, const osg::Vec3& d) 
     55{ 
     56    osg::Vec2 ab(a.x()-b.x(), a.y()-b.y()); 
     57    osg::Vec2 dc(d.x()-c.x(), d.y()-c.y()); 
     58    float length_ab = ab.normalize(); 
     59    float length_dc = dc.normalize(); 
     60    float denominator = (ab.x()-dc.x()); 
     61    if (denominator==0.0) 
     62    { 
     63        // ab and cd parallel 
     64        return osg::Vec3(ab.y(), -ab.x(), 0.0f); 
     65    } 
     66    float r = (dc.x()-ab.y())/ denominator; 
     67    float ny = 1.0f / sqrtf(r*r + 1.0f); 
     68    float nx = r * ny; 
     69 
     70    return osg::Vec3(nx,ny,0.0f); 
     71} 
     72 
     73class Boundary 
     74{ 
     75    typedef std::vector<unsigned int>   Points; 
     76    typedef std::vector<float>          Distances; 
     77    typedef std::vector<osg::Vec3>      Bisectors; 
     78 
     79    struct Segment : public osg::Referenced 
     80    { 
     81        unsigned int            _p1; 
     82        unsigned int            _p2; 
     83        Segment*                _left; 
     84        osg::ref_ptr<Segment>   _right; 
     85        float                   _distance; 
     86    }; 
     87 
     88    osg::ref_ptr<Segment>  _head; 
     89 
     90    osg::ref_ptr<osg::Vec3Array> _vertices; 
     91    Bisectors                   _bisectors; 
     92    Points                      _boundary; 
     93    Distances                   _distances; 
     94}; 
     95 
    3496 
    3597float computeAngle(osg::Vec3& v1, osg::Vec3& v2, osg::Vec3& v3) 
     
    41103    float dot = v12*v32; 
    42104    float angle = acosf(dot); 
    43     OSG_NOTICE<<"    v1="<<v1<<", v2="<<v2<<", v3="<<v3<<", dot_angle="<<osg::RadiansToDegrees(angle)<<std::endl; 
    44105    return angle; 
    45106} 
     
    112173    osg::Vec3 bisector(v32-v21); 
    113174 
     175 
     176    OSG_NOTICE<<"v1="<<v1<<", v2="<<v2<<", v3="<<v3<<", dot_angle="<<osg::RadiansToDegrees(angle)<<std::endl; 
     177    OSG_NOTICE<<"     computeIntersectionPoint() point "<<computeIntersectionPoint(v1,v2,v2,v3)<<std::endl; 
     178    OSG_NOTICE<<"     computeBisectorNormal() normal "<<computeBisectorNormal(v1,v2,v2,v3)<<std::endl; 
     179     
    114180    if (bisector.length()<0.5) 
    115181    { 
     
    124190        bisector.normalize(); 
    125191 
     192        OSG_NOTICE<<"     bisector normal "<<computeBisectorNormal(v1,v2,v2,v3)<<std::endl; 
     193 
    126194        float l = t / sin(angle*0.5); 
    127195 
     
    137205        bisector.normalize(); 
    138206        if (cross.z()>0.0) bisector = -bisector; 
     207 
     208        OSG_NOTICE<<"     bisector normal "<<computeBisectorNormal(v1,v2,v2,v3)<<std::endl; 
    139209 
    140210        osg::Vec3 new_vertex = v2 + bisector * l; 
     
    144214} 
    145215 
    146 osg::PrimitiveSet* computeBevelEdge(osg::Vec3Array& orig_vertices, unsigned int start, unsigned int count, osg::Vec3Array& new_vertices) 
     216osg::DrawArrays* computeBevelEdge(osg::Vec3Array& orig_vertices, unsigned int start, unsigned int count, osg::Vec3Array& new_vertices) 
    147217{ 
    148218    OSG_NOTICE<<"computeBoundaryAngles("<<orig_vertices.size()<<", "<<start<<", "<<count<<")"<<std::endl; 
     
    165235 
    166236    return new osg::DrawArrays(GL_POLYGON, start, count); 
     237} 
     238 
     239void removeLoops(osg::Vec3Array& orig_vertices, unsigned int start, unsigned int count) 
     240{ 
    167241} 
    168242 
     
    189263        if (drawArray && drawArray->getMode()==GL_POLYGON) 
    190264        { 
    191             new_primitives.push_back(computeBevelEdge(*orig_vertices, drawArray->getFirst(), drawArray->getCount(), *new_vertices)); 
     265            osg::DrawArrays* new_drawArray = computeBevelEdge(*orig_vertices, drawArray->getFirst(), drawArray->getCount(), *new_vertices); 
     266            removeLoops(*new_vertices, new_drawArray->getFirst(), new_drawArray->getCount()); 
     267            new_primitives.push_back(new_drawArray); 
    192268        } 
    193269    }