示例#1
0
void toxi::geom::Polygon2D::offsetCorner( const float & x1, const float & y1, const float & x2, const float & y2, const float & x3, const float & y3, const float & distance, Vec2D * out )
{
	float c1 = x2, d1 = y2, c2 = x2, d2 = y2;
	float dx1, dy1, dist1, dx2, dy2, dist2, insetX, insetY;

	dx1 = x2 - x1;
	dy1 = y2 - y1;
	dist1 = (float) toxi::math::MathUtils::sqrt(dx1 * dx1 + dy1 * dy1);
	dx2 = x3 - x2;
	dy2 = y3 - y2;
	dist2 = (float) toxi::math::MathUtils::sqrt(dx2 * dx2 + dy2 * dy2);

	if (dist1 < toxi::math::MathUtils::EPS || dist2 < toxi::math::MathUtils::EPS) {
		return;
	}
	dist1 = distance / dist1;
	dist2 = distance / dist2;

	insetX = dy1 * dist1;
	insetY = -dx1 * dist1;
	float _x1 = x1 +insetX;
	c1 += insetX;
	float _y1 = y1 + insetY;
	d1 += insetY;
	insetX = dy2 * dist2;
	insetY = -dx2 * dist2;
	float _x3 = x3 + insetX;
	c2 += insetX;
	float _y3 = y3 + insetY;
	d2 += insetY;

	if (c1 == c2 && d1 == d2) {
		out->set(c1, d1);
		return;
	}

	Line2D l1 = toxi::geom::Line2D( Vec2D(_x1, _y1), Vec2D(c1, d1));
	Line2D l2 = toxi::geom::Line2D( Vec2D(c2, d2), Vec2D(_x3, _y3));
	LineIntersection isec = l1.intersectLine( l2);
	Vec2D ipos = isec.getPos();
	if (ipos.isZeroVector()) {
		out->set(ipos);
	}
}