// ------------------------------------------------------------------------- void Curve::calculateLength(float resolution) { float positionA[3]; float positionB[3]; float stepLength = 1.0f / resolution; for(unsigned int i = 0; i < mAmount-1; ++i) { float segmentLength = 0; for(float j = 0; j < 1.0f; j += stepLength) { if(j > (1.0f - stepLength)) j = 1.0f - stepLength; getPositionOnSegment(positionA, j + stepLength, i); getPositionOnSegment(positionB, j, i); positionA[0] -= positionB[0]; positionA[1] -= positionB[1]; positionA[2] -= positionB[2]; segmentLength += Math::getLength(positionA); } mSegments[i]->setLength(segmentLength); mSegments[i]->setLengthFromBeginning(mLength); mLength += segmentLength; } }
// ------------------------------------------------------------------------- void Hermite::getWorldPosition(osg::Vec3& position, double distance, unsigned int& segment) { unsigned int max = _segments->size() - 1; do { if(segment > max) { getPositionOnSegment(position, (*_segments)[max].getLengthFromBeginning() / (*_segments)[max].getLength(), max); return; } if(((*_segments)[segment].getLengthFromBeginning() + (*_segments)[segment].getLength()) >= distance) break; }while(++segment); getPositionOnSegment(position, (distance - (*_segments)[segment].getLengthFromBeginning()) / (*_segments)[segment].getLength(), segment); }
// ------------------------------------------------------------------------- void Hermite::getWorldPosition(float* position, float distance) { unsigned int segment = 0; unsigned int amount = mAmount - 2; do { if(segment > amount) { getPositionOnSegment(position, mSegments[amount]->getLengthFromBeginning() / mSegments[amount]->getLength(), amount); return; } if((mSegments[segment]->getLengthFromBeginning() + mSegments[segment]->getLength()) >= distance) break; }while(++segment); getPositionOnSegment(position, (distance - mSegments[segment]->getLengthFromBeginning()) / mSegments[segment]->getLength(), segment); }