Hi guys
I have run into a bit of a problem with my 2D rendering library when filling polygons.
If I draw the polygon as an outline, I have no problems since that is a simple line primitive based triangle generator as can be seen below:
However, if I put it through my ear clipping routine and try to full the triangle list, I get this:
I can sort of understand and see why it is happening based on how the ear clipping formula works. What I am not sure on is how to fix. Ear clipping code below. Based on this:
std::vector<DXTriIndex> tris;
while (true)
{
int tricount = 0;
for (int i = clockwise ? int(ptlist.size()) - 1 : 0; (clockwise ? i > -1 : i < int(ptlist.size())); i = (i + (clockwise ? -1 : 1)))
{
int _pn = clockwise ? -1 : 1;
int prev = i - _pn;
if (prev == ptlist.size())
prev = 0;
if (prev < 0)
prev = ptlist.size() - 1;
int next = i + _pn;
if (next == ptlist.size())
next = 0;
if (next == -1)
next = ptlist.size() - 1;
DXPointF pPrev = ptlist[prev];
DXPointF pCur = ptlist[i];
DXPointF pNext = ptlist[next];
DXPointF pu = DXPointF(pCur.xy[0] - pPrev.xy[0], pCur.xy[1] - pPrev.xy[1]);
DXPointF pv = DXPointF(pNext.xy[0] - pCur.xy[0], pNext.xy[1] - pCur.xy[1]);
float lu = sqrt((pu.xy[0] * pu.xy[0]) + (pu.xy[1] * pu.xy[1]));
float lv = sqrt((pv.xy[0] * pv.xy[0]) + (pv.xy[1] * pv.xy[1]));
pu.xy[0] /= lu;
pu.xy[1] /= lu;
pv.xy[0] /= lv;
pv.xy[1] /= lv;
float u = (pu.xy[0] * pv.xy[1]) - (pu.xy[1] * pv.xy[0]);
if (u <= 0)
continue;
else
{
DXTriIndex tri = { next, prev, i };
tris.push_back(tri);
ptlist.erase(ptlist.begin() + i);
tricount++;
}
}
if (tricount == 0)
break;
}