int ClipToPlane(polygon_t *pin, plane_t *pplane, polygon_t *pout) { int i, j, nextvert, curin, nextin; double curdot, nextdot, scale; point_t *pinvert, *poutvert; pinvert = pin->verts; poutvert = pout->verts; curdot = DotProduct(pinvert, &pplane->normal); curin = (curdot >= pplane->distance); for (i=0 ; inumverts ; i++) { nextvert = (i + 1) % pin->numverts; // Conserve le point courant s'il est à l'intérieur du plan if (curin) *poutvert++ = *pinvert; nextdot = DotProduct(&pin->verts[nextvert], &pplane->normal); nextin = (nextdot >= pplane->distance); // Ajoute un point clippé si l'un des cotés courants est // à l'intérieur du plan et l'autre à l'extérieur if (curin != nextin) { scale = (pplane->distance - curdot) / (nextdot - curdot); for (j=0 ; j<3 ; j++) { poutvert->v[j] = pinvert->v[j] + ((pin->verts[nextvert].v[j] - pinvert->v[j]) * scale); } poutvert++; } curdot = nextdot; curin = nextin; pinvert++; } pout->numverts = poutvert - pout->verts; if (pout->numverts < 3) return 0; pout->color = pin->color; return 1; }