/*private*/
void
OffsetCurveBuilder::computeLineBufferCurve(const CoordinateSequence& inputPts)
{
	double distTol = simplifyTolerance(distance);

	//--------- compute points for left side of line
#ifndef SKIP_INPUT_SIMPLIFICATION
	// Simplify the appropriate side of the line before generating
	std::auto_ptr<CoordinateSequence> simp1_ = 
		BufferInputLineSimplifier::simplify(inputPts, distTol);
	const CoordinateSequence& simp1 = *simp1_;
#else
	// MD - used for testing only (to eliminate simplification)
	const CoordinateSequence& simp1 = inputPts;
#endif


	int n1 = simp1.size() - 1;
	initSideSegments(simp1[0], simp1[1], Position::LEFT);
	for (int i = 2; i <= n1; ++i) {
		addNextSegment(simp1[i], true);
	}
	addLastSegment();
	// add line cap for end of line
	addLineEndCap(simp1[n1-1], simp1[n1]);

	// Record the index of the end of line cap.
	endCapIndex = vertexList->size() - 2 ;


	//---------- compute points for right side of line
#ifndef SKIP_INPUT_SIMPLIFICATION
	// Simplify the appropriate side of the line before generating
	std::auto_ptr<CoordinateSequence> simp2_ = 
		BufferInputLineSimplifier::simplify(inputPts, -distTol);
	const CoordinateSequence& simp2 = *simp2_;
#else
	// MD - used for testing only (to eliminate simplification)
	const CoordinateSequence& simp2 = inputPts;
#endif

	int n2 = simp2.size() - 1;
	initSideSegments(simp2[n2], simp2[n2-1], Position::LEFT);
	for (int i = n2-2; i >= 0; --i) {
		addNextSegment(simp2[i], true);
	}
	addLastSegment();
	// add line cap for start of line
	addLineEndCap(simp2[1], simp2[0]);

	vertexList->closeRing();
}
/*private*/
void
OffsetCurveBuilder::computeRingBufferCurve(const CoordinateSequence& inputPts,
	int side)
{

#ifndef SKIP_INPUT_SIMPLIFICATION
	double distTol = simplifyTolerance(distance);
	// ensure that correct side is simplified
	if (side == Position::RIGHT)
		distTol = -distTol;      
	std::auto_ptr<CoordinateSequence> simp_ = 
		BufferInputLineSimplifier::simplify(inputPts, distTol);
	const CoordinateSequence& simp = *simp_;
#else
	const CoordinateSequence& simp = inputPts;
#endif

	int n = simp.size()-1;
	initSideSegments(simp[n-1], simp[0], side);
	for (int i = 1; i <= n; i++) {
		bool addStartPoint = i != 1;
		addNextSegment(simp[i], addStartPoint);
	}
	vertexList->closeRing();
}
/*private*/
void
OffsetCurveBuilder::computeRingBufferCurve(const CoordinateSequence& inputPts,
	int side)
{
	int n=inputPts.size()-1;
	initSideSegments(inputPts[n-1], inputPts[0], side);
	for (int i=1; i<=n; i++) {
		bool addStartPoint=i != 1;
		addNextSegment(inputPts[i], addStartPoint);
	}
	vertexList->closeRing();
}
/*private*/
void
OffsetCurveBuilder::computeLineBufferCurve(const CoordinateSequence& inputPts)
{
	int n=inputPts.size()-1;
	// compute points for left side of line
	initSideSegments(inputPts[0], inputPts[1], Position::LEFT);
	for (int i=2;i<= n;i++) {
		addNextSegment(inputPts[i], true);
	}
	addLastSegment();
	// add line cap for end of line
	addLineEndCap(inputPts[n-1], inputPts[n]);
	// compute points for right side of line
	initSideSegments(inputPts[n], inputPts[n-1], Position::LEFT);
	for (int i=n-2; i>=0; i--) {
		addNextSegment(inputPts[i], true);
	}
	addLastSegment();
	// add line cap for start of line
	addLineEndCap(inputPts[1], inputPts[0]);
	vertexList->closeRing();
}