double calc_root(double *coeff, int deg, double l, double r) { t_dicho d; double tmp; d.l = l; d.r = r; tmp = calc_poly(coeff, deg, l); d.sl = SIGNOF(tmp); tmp = calc_poly(coeff, deg, r); d.sr = SIGNOF(tmp); if (d.sl * d.sr > 0) return (MAX_ROOT + 1); return (loop_dicho(coeff, deg, &d)); }
static double loop_dicho(double *coeff, int deg, t_dicho *d) { int i; double tmp; i = -1; while (++i < 1000000) { if (d->sl == 0 || d->sr == 0) return ((d->sl == 0) ? d->l : d->r); d->mid = d->l / 2.0 + d->r / 2.0; tmp = calc_poly(coeff, deg, d->mid); d->smid = SIGNOF(tmp); if (fabs(d->l - d->r) < 0.0001 || !d->smid) return (d->mid); else if (d->sl * d->smid > 0) { d->l = d->mid; d->sl = d->smid; } else { d->r = d->mid; d->sr = d->smid; } } return ((d->l + d->r) / 2.0); }
float inter_cylindre(t_obj *object, t_ray *ray, t_inter *inter) { t_cylindre *cylindre; float tmp; t_vect pos; cylindre = (t_cylindre*)object->obj; tmp = calc_poly(cylindre, ray); if (tmp != -1) { pos = add_vect(ray->o, mult_float(ray->dir, tmp)); tmp = magnitude(sub_vect(pos, ray->o)); if (inter->dist == -1 || tmp < inter->dist) { inter->pos = pos; inter->normal = calc_normal(cylindre, pos); inter->dist = tmp; inter->obj = object; } } return (tmp); }