Fastest way of converting a quad to a triangle strip?

穿精又带淫゛_ 提交于 2019-12-11 09:43:33

问题


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:


  1. Locate an extremum point of the quad w.r.t a coordinate. Let it be p, where p is an iterator on a cyclic container
  2. 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 from min to max or vice versa) and repeat step 1.
  3. Split the quad into two triangles by cutting off the "ear" around the extremum point: t0 = { p - 1, p, p + 1} and t1 = { 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:

  1. Given a quad A, B, C, D form the diagonals AC and BD
  2. If points B and D lie on different sides of AC then AC can be used to split the quad
  3. Apply the same reasoning to BD and points A and C


来源:https://stackoverflow.com/questions/12239876/fastest-way-of-converting-a-quad-to-a-triangle-strip

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!