关于扫描线算法的异常

本人菜鸟,刚学习计算机图形学,现在要实现其中的扫描线算法,现在已知边的结构图片说明
现在要转化成扫描线边结构图片说明
我的想法是先建立一个边分类表数组,每个成员包含两个指针,一个不动,一个游动,插入新元素时使用游动的指针,通过不动的指针找到数组的头一个元素,当然现在未排序,我想在第一次插入边时会赋值给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;
        }
    }
}

结果如图图片说明

2个回答

解决了,是因为edges数组即使结束,最后指针++也会转到内存不为空的地方

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐