From: beeftink@dutentb.et.tudelft.nl (Frederik Beeftink) Newsgroups: sci.math,sci.math.num-analysis Subject: [Q] subdividing concave polygons into convex Date: 31 Jul 1995 10:08:04 GMT Does anyone know an efficient algorithm to detect concave corners in a polygon that is lying in a 3D-plane, and then (knowing the concave corners) to divide this polygon into several convex polygons (preferably all approximately of the same area). Please reply to: beeftink@cas.et.tudelft.nl -- Frederik Beeftink ============================================================================== From: rusin@washington.math.niu.edu (Dave Rusin) Newsgroups: sci.math,sci.math.num-analysis Subject: Re: [Q] subdividing concave polygons into convex Date: 3 Aug 1995 17:33:22 GMT It's funny how threads overlap. The following dovetails with the discussion of determining interior points of polygons. In article <3via24$lp2@mo6.rc.tudelft.nl>, Frederik Beeftink wrote: >Does anyone know an efficient algorithm to detect concave corners in a polygon >that is lying in a 3D-plane, and then (knowing the concave corners) to divide >this polygon into several convex polygons (preferably all approximately of the >same area). (It's not a 3D plane, it's a 2D-plane lying in 3-space). Sure. First rotate the plane so that it's flat (projection will work too, as long as you don't project into a perpendicular direction). Then you can assume the polygon lies in R^2. Let P1, P2, ..., Pn be the vertices taken in order. To decide if the angle at Pi is concave, consider the triangle formed by Pi and the two adjoining vertices P(i-1) and P(i+1). When you traverse the edges P(i-1) Pi and Pi P(i+1), you will either have the interiors of the polygon and the triangle on the _same_ side (if the angle at Pi is convex) or on _opposite_ sides (if concave). Now, when you integrate x dy around a polygon, keeping the interior on your left, you get the area of the polygon, a positive number. Keeping the interior on your right gives the negative of this. In particular, you will get integrals of the same sign iff you traverse two polygons in the same direction (i.e., both interior-is-on-the-left or both interior-is-on-the-right). So, integrate xdy around the polygon and around the triangle, traversing both so that the points P(i-1), P(i), and P(i+1) are taken in the same order. If you get integrals of the same sign, the angle at P(i) is convex. If you get opposite signs, the angle is concave. The integral turns out just to be the cyclic sum of the terms ( y[i]*x[i-1] - x[i]*y[i-1] )/2, so the computations are quite fast. You could also do the projection to the y-z plane, computing the areas of the projections there as (1/2) Sum ( z[i]*y[i-1] - y[i]*z[i-1] ); and similarly the projections to the x-z plane. At least one of these projections would have to be non-zero; on one which is non-zero you just need to compare signs for the big polygon and the triangle. If the triple computation is too slow, it is possible to determine from three noncollinear (e.g. consecutive?) points a single non-zero projection; write me if you need details on this. There are a number of ways to increase computational speed and improve numerical stability, but you can't get better than O(n) in speed (which this is) and you will always have trouble with nearly straight angles. I don't know offhand how to get roughly equal areas, but here's how to create a convex partition. This procedure introduces no new vertices, which you didn't state as a criterion but I assume you had in mind. List all the vertices with either a "+" or "-" according to whether the angle is convex or concave there. (Since the sum of the supplements of the angles taken according to this sign is 2pi, there must be some "+"'s.) Begin with any "-" vertex adjacent to a "+" vertex, say P(i)="-", P(i+1)="+". Then the triangle P(i), P(i+1), P(i+2), P(i), which is like all triangles convex, has by construction the interior of the original polygon on the convex side of the angle P(i+1). Therefore, all of this triangle is contained in the original polygon. [You should consider the case of two consecutive "-" vertices to see why I insist P(i+1) be a "+".] Removing this convex subset leaves another polygon with one fewer vertex; by induction then we obtain a decomposition of the whole polygon into convex sets. Of course in this construction most of the pieces will be triangles. You can reduce the number of parts which result by modifying the construction as follows. Consider all the polygons of the form P(i), P(i+1), P(i+2), ..., P(i+k), P(i), in which P(i+j) is a "+" vertex for all j=1, 2, ..., k-1 (if P(i+k) is also "+", that's OK.) At least for k=2 we know this is convex. For any k it's convex at most of the vertices. One can simply try increasing k as long as the resulting angles at both P(i) and P(i+k) remain concave. (Or, you can try increasing k until you have enclosed an area equal to (1/N)-th of the total, where N is the total number of components you expect. I am not completely clear on whether N can be estimated in advance, or whether it is independent of the chosen decomposition.) dave ==============================================================================