Триангуляция с минимальной суммой проведённых хорд



Дано многоугольник в порядке обхода против часовой стрелки и количество точек
Разбить данный многоугольник на треугольники

Используем динамическое програмирование. Нам нужно будет слегка изменить нашу функцию IsCrossS.
Функция имеет вид MinChordTriangulate(p,T).
T - массив результат - размер матрицы count x 3, содержит вершины триангуляции.
Функция разбивает многоугольник на треугольники, но в этом разбиении сумма проведённых хорд минимальна.


Листинг C++

bool IsCrossS(point p1,point p2,point p3,point p4)
{
        return     SignAreaTriang(p1,p2,p3)*SignAreaTriang(p1,p2,p4) < 0 &&
                    SignAreaTriang(p3,p4,p1)*SignAreaTriang(p3,p4,p2) < 0;
}
int count_triangle=0;
void path_triangle(polygon p,int K[][100],int i,int j,point T[][3])
{
        if(i == j || i == (j-1)%p.n || i == -1 || j == -1)return;
        T[count_triangle][0]=p.p[i];
        T[count_triangle][1]=p.p[K[i][j]];
        T[count_triangle][2]=p.p[j];
        ++count_triangle;
        path_triangle(p,K,i,K[i][j],T);
        path_triangle(p,K,K[i][j],j,T);
}
int MinChordTriangulate(polygon p,point T[][3])
{
        double D[100][100]={0},M[100][100]={0};
        int i,j,k,s,K[100][100]={0};
        for(i=0;i<p.n;++i)
                for(j=0;j<p.n;++j)
                {
                        D[i][j]=(DiagInPolygon(p.p,p.n,i,j) || i == (j+1)%p.n || i == (j-1)%p.n ? dist(p.p[i],p.p[j]) : 1e9);
                        K[i][j]=-1;
                }
        for(i=0;i<p.n-1;++i)
        {
                M[i][i]=0; M[i][i+1]=D[i][i+1];
        }
        M[i][i]=0;
        for(s=2;s<p.n;++s)
                for(i=0;i<p.n-s;++i)
                {
                        j=(i+s)%p.n;
                        M[i][j]=1e7;
                        for(k=i+1;k<j;++k)
                        {
                                double t=M[i][k]+M[k][j]+D[i][k]+D[k][j]+D[i][j];
                                if(t<M[i][j])
                                {
                                        M[i][j]=t;
                                        K[i][j]=k;
                                }
                        }
                }
        path_triangle(p,K,0,p.n-1,T);
        return count_triangle;
}

25.06.2007, 18:24

По всем вопросам обращаться: rumterg@gmail.com