Ejemplo n.º 1
0
void ElasticPolyline::EnforceRightAngles()
{
	int npoints = m_Line.GetSize();
	if (npoints < 3)
		return;

	DPoint2 p2 = m_Line[npoints-1];
	DPoint2 p1 = m_Line[npoints-2];
	DPoint2 p0 = m_Line[npoints-3];
	DPoint2 vec = p1 - p0;	// Vector along previous edge

	// Normalize carefully; if we're in dange of dividing by zero, it's better
	//  to quietly return
	if (vec.Length() == 0.0)
		return;

	vec.Normalize();
	DPoint2 vec2 = p2 - p1;	// Vector to new point

	double a = vec2.Dot(vec);	// Distance along edge
	DPoint2 result = p1 + (vec * a);
	m_Line[npoints-2] = result;

	vec.Rotate(PID2d);
	double b = vec2.Dot(vec);	// Distance perpendicular to edge
	result += (vec * b);
	m_Line[npoints-1] = result;
}