Exemplo n.º 1
0
	// -------------------------------------------------------------------------
	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;
		}
	}
Exemplo n.º 2
0
// -------------------------------------------------------------------------
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);
}
Exemplo n.º 3
0
	// -------------------------------------------------------------------------
	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);
	}