2024年2月19日发(作者:)

} pCurrentE->next = pEdge; } } }}void CFill::AddEt(CAET *pNewEdge)//合并ET表{ CAET *pCE=pHeadE; if(pCE==NULL) { pHeadE=pNewEdge; pCE=pHeadE; } else { while(pCE->next!=NULL) { pCE=pCE->next; } pCE->next=pNewEdge; }}void CFill::EtOrder()//边表的冒泡排序算法{ CAET *pT1 = NULL, *pT2 = NULL; int Count = 1; pT1 = pHeadE; if (NULL == pT1) { return; } if (NULL == pT1->next) { return; } while (NULL != pT1->next) { Count++; pT1 = pT1->next; } for (int i = 1; i < Count; i++) { pT1 = pHeadE; if (pT1->x > pT1->next->x) { pT2 = pT1->next; pT1->next = pT1->next->next; pT2->next = pT1; pHeadE = pT2; } else { if (pT1->x == pT1->next->x) { if (pT1->k > pT1->next->k) { pT2 = pT1->next; pT1->next = pT1->next->next; pT2->next = pT1; pHeadE = pT2; } } }

} pT1 = pHeadE; while (pT1->next->next != NULL) { pT2 = pT1; pT1 = pT1->next; if (pT1->x > pT1->next->x) { pT2->next = pT1->next; pT1->next = pT1->next->next; pT2->next->next = pT1; pT1 = pT2->next; } else { if (pT1->x == pT1->next->x) { if (pT1->k > pT1->next->k) { pT2->next = pT1->next; pT1->next = pT1->next->next; pT2->next->next = pT1; pT1 = pT2->next; } } } } }}void CFill::FillPolygon(CDC *pDC)//填充多边形{ CAET *pT1 = NULL, *pT2 = NULL; pHeadE = NULL; for (pCurrentB = pHeadB; pCurrentB != NULL; pCurrentB = pCurrentB->next) { for (pCurrentE = pCurrentB->pET; pCurrentE != NULL; pCurrentE = pCurrentE->next) { pEdge = new CAET; pEdge->x = pCurrentE->x; pEdge->yMax = pCurrentE->yMax; pEdge->k = pCurrentE->k; pEdge->next = NULL; AddEt(pEdge); } EtOrder(); pT1 = pHeadE; if (pT1 == NULL) { return; } while (pCurrentB->ScanLine >= pT1->yMax)//下闭上开 { CAET * pAETTEmp = pT1; pT1 = pT1->next; delete pAETTEmp; pHeadE = pT1; if (pHeadE == NULL) return; } if (pT1->next != NULL) { pT2 = pT1; pT1 = pT2->next; } while (pT1 != NULL)

{ t=P0;P0=P1;P1=t; } for(p=P0;p.ySetPixel(p,clr);

} } else { double k,d; k=(double)(P1.y-P0.y)/(double)(P1.x-P0.x); if(k>1.0)//绘制k>1 { if(P0.y>P1.y) { t=P0;P0=P1;P1=t; } d=1-0.5*k; for(p=P0;p.ySetPixel(p,clr); if(d>=0) { p.x++; d+=1-k; } else

d+=1;

} } if(0.0<=k && k<=1.0)//绘制0<=k<=1 { if(P0.x>P1.x) { t=P0;P0=P1;P1=t; } d=0.5-k;

for(p=P0;p.xSetPixel(p,clr); if(d<0) { p.y++; d+=1-k; } else

d-=k;

} }

if(k>=-1.0 && k<0.0)//绘制-1<=k<0 { if(P0.x>P1.x) { t=P0;P0=P1;P1=t; } d=-0.5-k; for(p=P0;p.xSetPixel(p,clr); if(d>0) { p.y--; d-=1+k; } else