算法步骤:
(1)得到第一条弧段A,并设置为当前弧段;
(2)判断PL (A)和PR (A)是否为空。如果都非空,转到第一步,当所有 弧段处理完毕后,算法结束;
(3)如果左多边形为空,则创建一个新的多边形P,多边形的第一条 弧段为当前弧段,并设置PL (A)=P,设置搜寻起始节点为N0=Ns (A),搜 寻当前节点为NC=NE (A)。如果右多边形为空,则创建一个新的多边形 P,多边形的第一条弧段为当前弧段,并设置PR (A)=P,设置搜寻起始 节点N0=NE (A),搜寻当前节点NC=NS (A)。
(4)判断N0和NC是否相等,如果是,则多边形所有弧段都已经找到, 转到第一步。
(5)检查与当前节点相连接的、已经排列好的弧段序列,将当前弧段 的下一条弧段A'作为多边形的第二条弧段。
(6)如果NC=NS (A '),设置PL (A ')=P,令NC=NE (A');如果NC= NE (A'), 设置PR (A ')=P,令NC=NS (A'),转到第四步。
实例:
程序说明:
1:定义了弧线类Arc:弧线编号 name,弧线起始点NS,弧线结束点NE,左多边形Pl,右多边形Pr;用构造函数:Arc(int s, int t, int m)来赋值;
class Arc//定义弧线类
{
public:
Arc(int s, int t, int m)//定义构造函数
{
name = s;
NS = t;
NE = m;
Pl = 0;
Pr = 0;
}
int Pl;//弧线左多边形编号
int Pr;//弧线右多边形编号
int name;//弧线编号
int NS;//弧线起始点编号
int NE;//弧线终点编号
};
2:定义了点类Point:点编号 name,点连接弧线数n,数组a[3] 顺时针存贮弧线编号
构造函数:Point(int s, int t, const int b[3])用来赋值;
class Point//定义点类
{
public:
Point(int s, int t, const int b[3]) //定义构造函数
{
name = s;
n = t;
for (int i = 0; i < 3; i++) a[i] = b[i];
}
int name;//点编号
int n;//连接弧线数目
int a[3];//顺时针弧线点号
};
3:首先通过构造函数完成点类数组和弧线类数组的生成。将所有弧线的左右多边形设置为0,多边形序号从1开始计,每完成一个多边形,则多边形序号加一。然后按照多边形拓扑生成算法进行编程实现。
结果:
缺陷:本程序只应对实例给出,并非通用程序,运用时需要修改数组长度。
代码:
#include<iostream>
using namespace std;
class Arc//定义弧线类
{
public:
Arc(int s, int t, int m)//定义构造函数
{
name = s;
NS = t;
NE = m;
Pl = 0;
Pr = 0;
}
int Pl;//弧线左多边形编号
int Pr;//弧线右多边形编号
int name;//弧线编号
int NS;//弧线起始点编号
int NE;//弧线终点编号
};
class Point//定义点类
{
public:
Point(int s, int t, const int b[3]) //定义构造函数
{
name = s;
n = t;
for (int i = 0; i < 3; i++) a[i] = b[i];
}
int name;//点编号
int n;//连接弧线数目
int a[3];//顺时针弧线点号
};
int main()//解决问题
{
//点录入
int b1[3] = { 3,2,1 };
int b2[3] = { 4,6,1 };
int b3[3] = { 2,5,4 };
int b4[3] = { 3,6,5 };
Point point[4] = { Point(1,3,b1),
Point(2,3,b2),
Point(3,3,b3),
Point(4,3,b4),
};
//弧线录入
Arc arc[6] = {Arc (1,1,2),
Arc(2,3,1),
Arc(3,4,1),
Arc(4,2,3),
Arc(5,3,4),
Arc(6,2,4),
};
int DBX = 1;//面的编号从1开始
int B;//标记的边的名称
int N0,Nc;
//算法第一步
for (int i = 0; i < 6; i++)//依次录入每条边
{
if (arc[i].Pl == 0)//左多边形为空
{
arc[i].Pl = DBX;
N0 = arc[i].NS;
Nc = arc[i].NE;
B = i+1;
while (N0 != Nc)
{
if (point[Nc - 1].a[0] == B)
{
if (arc[point[Nc - 1].a[1] - 1].NS == Nc)
{
arc[point[Nc - 1].a[1] - 1].Pl = DBX;
B = point[Nc - 1].a[1];
Nc = arc[point[Nc - 1].a[1] - 1].NE;
}
else if (arc[point[Nc - 1].a[1] - 1].NE == Nc)
{
arc[point[Nc - 1].a[1] - 1].Pr = DBX;
B = point[Nc - 1].a[1];
Nc = arc[point[Nc - 1].a[1] - 1].NS;
}
}
else
if (point[Nc - 1].a[1] == B)
{
if (arc[point[Nc - 1].a[2] - 1].NS == Nc)
{
arc[point[Nc - 1].a[2] - 1].Pl = DBX;
B = point[Nc - 1].a[2];
Nc = arc[point[Nc - 1].a[2] - 1].NE;
}
else if (arc[point[Nc - 1].a[2]-1].NE == Nc)
{
arc[point[Nc - 1].a[2] - 1].Pr = DBX;
B = point[Nc - 1].a[2];
Nc = arc[point[Nc - 1].a[2]-1].NS;
}
}
else if (point[Nc - 1].a[2] == B)
{
if (arc[point[Nc - 1].a[0]-1].NS == Nc)
{
arc[point[Nc - 1].a[0]-1].Pl = DBX;
B = point[Nc - 1].a[0];
Nc = arc[point[Nc - 1].a[0]-1].NE;
}
else if (arc[point[Nc - 1].a[0]-1].NE == Nc)
{
arc[point[Nc - 1].a[0]-1].Pr = DBX;
B = point[Nc - 1].a[0];
Nc = arc[point[Nc - 1].a[0]-1].NS;
}
}
}
DBX = DBX + 1;
}
else if (arc[i].Pr == 0)
{
arc[i].Pr = DBX;
N0 = arc[i].NE;
Nc = arc[i].NS;
B = i + 1;
while (N0 != Nc)
{
if (point[Nc - 1].a[0] == B)
{
if (arc[point[Nc - 1].a[1] - 1].NS == Nc)
{
arc[point[Nc - 1].a[1] - 1].Pl = DBX;
B = point[Nc - 1].a[1];
Nc = arc[point[Nc - 1].a[1] - 1].NE;
}
else if (arc[point[Nc - 1].a[1] - 1].NE == Nc)
{
arc[point[Nc - 1].a[1] - 1].Pr = DBX;
B = point[Nc - 1].a[1];
Nc = arc[point[Nc - 1].a[1] - 1].NS;
}
}
else
if (point[Nc - 1].a[1] == B)
{
if (arc[point[Nc - 1].a[2] - 1].NS == Nc)
{
arc[point[Nc - 1].a[2] - 1].Pl = DBX;
B = point[Nc - 1].a[2];
Nc = arc[point[Nc - 1].a[2] - 1].NE;
}
else if (arc[point[Nc - 1].a[2] - 1].NE == Nc)
{
arc[point[Nc - 1].a[2] - 1].Pr = DBX;
B = point[Nc - 1].a[2];
Nc = arc[point[Nc - 1].a[2] - 1].NS;
}
}
else if (point[Nc - 1].a[2] == B)
{
if (arc[point[Nc - 1].a[0] - 1].NS == Nc)
{
arc[point[Nc - 1].a[0] - 1].Pl = DBX;
B = point[Nc - 1].a[0];
Nc = arc[point[Nc - 1].a[0] - 1].NE;
}
else if (arc[point[Nc - 1].a[0] - 1].NE == Nc)
{
arc[point[Nc - 1].a[0] - 1].Pr = DBX;
B = point[Nc - 1].a[0];
Nc = arc[point[Nc - 1].a[0] - 1].NS;
}
}
}
DBX = DBX + 1;
}
}
cout << "点号" << " " << "左多边形号" << " " << "右多边形号" << endl;
for (int i = 0; i < 6; i++)
{
cout<<" " << i + 1 << " " << arc[i].Pl << " " << arc[i].Pr << endl;
}
return 0;
}