计算几何——多边形三角化


计算几何——多边形三角化

时间复杂度:nlogn

首先,将多边形分成多个单调多边形。需要对merge点和split点进行处理。单调多边形是不包括merge节点和split节点的多边形

首先用扫描线法,将多边形分成多个梯形(梯形可以退化成三角形);

merge点:一个点的邻居两点都比它;

split点:一个点的邻居两点都比它低;

对于merge点,寻找邻居下梯形的一个点(该点同时也是多边形的一个点),连接merge点和这个点;

对于split点,寻找邻居上梯形的一个点(该点同时也是多边形的一个点),连接merge点和这个点;

这样,多边形的单调划分完成了。

书上用的不是梯形划分法,而且直接通过扫描线找到split和merge节点。

上图:计算几何——多边形三角化_第1张图片


参考其他的教程:http://www.cnblogs.com/dogstar/archive/2011/04/07/2008726.html

这个教材不是用梯形法。比较好实现。

对于每个单调的划分区域,用下面的算法完成该区域的三角分割:

需要使用到stack和扫描线算法。

对于单调划分区域,从上到下扫描点s={s1,s2,...sn}



i = 0
S is the list of si;
while si != NULL:
    if i < 2:
        stack.add(si)
    else:
        if (si on the same side with stack.top):
            while (stack.isEmpty() == false):
                first = stack.pop()
                if (stack.isEmpty() == true)
                    stack.push(first);
                    break;
                second = stack.pop()
                if (si, first, second consist a Triangles, if the T is all  in the graph):
                    add line(si, second)
                    stack.push(second)
                else:
                    stack.push(second)
                    stack.push(first)
                    break;
             }
        else:
        //将si和栈中的所有点都连接起来
            while (stack.isEmpty() == false):
                top = stack.pop()
                add line(si, top)
               
            stack.push(si)
    i += 1;


计算几何——多边形三角化_第2张图片


这已经是一个单调的多边形G了,先将点1,点2加入到stack中,此时top=v2, 到点v3时,与top(v2)不同边,则把v3和stack中的所有点都连接起来(连接v3v2,v3v1),并且清空栈,再把top(v2)和v3加入到stack中;
到点v4,和v3同边,弹出v3,v2,此时v4,v3,v2可以构成一个完全在G中的三角形,连接v4v2,再把v2加入栈中,弹出v2,但是此时栈为空,再把v2压入栈,把v4加入到栈中;
到点v5,v6都和v4同边,且都不能够构成完全在G中的三角形,直接把v5,v6加入到栈中;
到点v7,和stack.top(v6)不同边,则连接v7和栈中的所有点,连接v7v6,v7v,v74,v7v2,清空栈,加入stack.top(v6)和v7;
以此类推;
那就会有几个问题:
1.如何判断是否点在同一边
对于栈,stack.top和stack.bottom, 如果点v是stack.top在同一条边,则是同边,如果点v和bottom在同一条边,则不在同一边;
2.如何判断该三角形是否完全在G中;
同直线的斜率进行判断,v,top,second,三个点,k_v2top, k_v2second, 如果斜率k_v2second 的倾斜程度小于 k_v2top,则满足,即fabs(k_v2second) < fabs(k_v2top);
3.完成了单调多边形的划分,如何获得所有的单调多边形序列


你可能感兴趣的:(计算几何)