问题
What is the fastest way of converting a quadrilateral (made up of four x,y
points) to a triangle strip? I'm well aware of the general triangulation algorithms that exist, but I need a short, well optimized algorithm that deals with quadrilaterals only.
My current algorithm does this, which works for most quads but still gets the points mixed up for some:
#define fp(f) bounds.p##f
/* Sort four points in ascending order by their Y values */
point_sort4_y(&fp(1), &fp(2), &fp(3), &fp(4));
/* Bottom two */
if (fminf(-fp(1).x, -fp(2).x) == -fp(2).x)
{
out_quad.p1 = fp(2);
out_quad.p2 = fp(1);
}
else
{
out_quad.p1 = fp(1);
out_quad.p2 = fp(2);
}
/* Top two */
if (fminf(-fp(3).x, -fp(4).x) == -fp(3).x)
{
out_quad.p3 = fp(3);
out_quad.p4 = fp(4);
}
else
{
out_quad.p3 = fp(4);
out_quad.p4 = fp(3);
}
Edit: I'm asking about converting a single quad to a single triangle strip that should consist of four points.
回答1:
Given a quad A B C D
we can split it into A B C, A C D
or A B D, D B C
.
Compare the length of A-C
and B-D
and use the shorter for the splitting edge. In other words use A B C, A C D
if A-C
is shorter and A B D, D B C
otherwise.
回答2:
- Locate an extremum point of the quad w.r.t a coordinate. Let it be
p
, wherep
is an iterator on a cyclic container - Check if
p + 2
lies inside of the ear formed by{p - 1, p, p + 1}
. If yes, seek extremum w.r.t. other coordinate (or switch frommin
tomax
or vice versa) and repeat step 1. - Split the quad into two triangles by cutting off the "ear" around the extremum point:
t0 = { p - 1, p, p + 1}
andt1 = { p + 1, p + 2, p - 1 }
No need to sort, just locate the extremum. If your quads are guaranteed to be convex (real quadrilaterals) then skip the extremum search and choose arbitrary p
.
Edit: Modified according to suggestion from the comment. Also the formulation suggested by the commenter is simpler to implement:
- Given a quad
A, B, C, D
form the diagonalsAC
andBD
- If points
B
andD
lie on different sides ofAC
thenAC
can be used to split the quad - Apply the same reasoning to
BD
and pointsA
andC
来源:https://stackoverflow.com/questions/12239876/fastest-way-of-converting-a-quad-to-a-triangle-strip