本人菜鸟,刚学习计算机图形学,现在要实现其中的扫描线算法,现在已知边的结构
现在要转化成扫描线边结构
我的想法是先建立一个边分类表数组,每个成员包含两个指针,一个不动,一个游动,插入新元素时使用游动的指针,通过不动的指针找到数组的头一个元素,当然现在未排序,我想在第一次插入边时会赋值给head(不动指针),但调试结果说明直接跳过了这个步骤,导致出现访问冲突,所以想求教前辈
void PolygonScanning::ScanningPolygon(){
// 多边形的边保存在数组edges中
// 像素的颜色可以使用函数cv->MySetPixel(int x, int y, int color)设置
// 使用扫描线算法扫描转换多边形
struct ET
{
Edge * head,*move; //设定两个指针,一个可活动一个不活动,注意连续创建指针时指针前加*
};
ET ETtable[300]; //建立et表
Edge* q; //这个指针用来存放临时数据
//接下来将edges中的边保存到ETtable中去,取出edges中所有边,直到取完为止
for (MyEdge* p = &edges[0]; p != NULL; p++)
{
q = new Edge; //暂不考虑斜率为0或无穷
q->deltax = (p->x1 - p->x2) / (p->y1 - p->y2); //计算斜率倒数
//将较大的y值赋予ymax,把y值较小的点的x值赋予x,并插入到较小的y值的那一类中
if (p->y1 > p->y2) //y1比y2大
{
q->ymax = p->y1;
q->x = p->x2;
int temp1 = (int)(p->y2); //先把y2转化成整形,再放入下标为y2的类
if (ETtable[temp1].head==NULL) //如果这是第一次对第i类赋值
{
ETtable[temp1].head = q;
ETtable[temp1].move = q;
}
else
{
ETtable[temp1].move->nxt = q;//每一类中有一个move指针,它是运动的,将新来的插入move后,再改变move
ETtable[temp1].move = q;
}
}
else //y2比y1大
{
q->ymax = p->y2;
q->x = p->x1;
int temp2 = (int)(p->y1); //先把y1转化成整形,再放入下标为y的类
if (ETtable[temp2].head==NULL) //如果这是第一次对第i类赋值
{
ETtable[temp2].head = q;
ETtable[temp2].move = q;
}
else
{
ETtable[temp2].move->nxt = q;//每一类中有一个move指针,它是运动的,将新来的插入move后,再改变move
ETtable[temp2].move = q;
}
}
}