static float sol_test_edge(float dt, float T[3], const struct v_ball *up, const struct s_base *base, const struct b_edge *ep, const float o[3], const float w[3]) { float q[3]; float u[3]; v_cpy(q, base->vv[ep->vi].p); v_sub(u, base->vv[ep->vj].p, base->vv[ep->vi].p); return v_edge(T, o, q, u, w, up->p, up->v, up->r); }
void line_edges(inT16 x, // coord of line start inT16 y, // coord of line inT16 xext, // width of line uinT8 uppercolour, // start of prev line uinT8 * bwpos, // thresholded line CRACKEDGE ** prevline, // edges in progress CRACKEDGE **free_cracks, C_OUTLINE_IT* outline_it) { CrackPos pos = {free_cracks, x, y }; int xmax; // max x coord int colour; // of current pixel int prevcolour; // of previous pixel CRACKEDGE *current; // current h edge CRACKEDGE *newcurrent; // new h edge xmax = x + xext; // max allowable coord prevcolour = uppercolour; // forced plain margin current = NULL; // nothing yet // do each pixel for (; pos.x < xmax; pos.x++, prevline++) { colour = *bwpos++; // current pixel if (*prevline != NULL) { // changed above // change colour uppercolour = FLIP_COLOUR(uppercolour); if (colour == prevcolour) { if (colour == uppercolour) { // finish a line join_edges(current, *prevline, free_cracks, outline_it); current = NULL; // no edge now } else { // new horiz edge current = h_edge(uppercolour - colour, *prevline, &pos); } *prevline = NULL; // no change this time } else { if (colour == uppercolour) *prevline = v_edge(colour - prevcolour, *prevline, &pos); // 8 vs 4 connection else if (colour == WHITE_PIX) { join_edges(current, *prevline, free_cracks, outline_it); current = h_edge(uppercolour - colour, NULL, &pos); *prevline = v_edge(colour - prevcolour, current, &pos); } else { newcurrent = h_edge(uppercolour - colour, *prevline, &pos); *prevline = v_edge(colour - prevcolour, current, &pos); current = newcurrent; // right going h edge } prevcolour = colour; // remember new colour } } else { if (colour != prevcolour) { *prevline = current = v_edge(colour - prevcolour, current, &pos); prevcolour = colour; } if (colour != uppercolour) current = h_edge(uppercolour - colour, current, &pos); else current = NULL; // no edge now } } if (current != NULL) { // out of block if (*prevline != NULL) { // got one to join to? join_edges(current, *prevline, free_cracks, outline_it); *prevline = NULL; // tidy now } else { // fake vertical *prevline = v_edge(FLIP_COLOUR(prevcolour)-prevcolour, current, &pos); } } else if (*prevline != NULL) { //continue fake *prevline = v_edge(FLIP_COLOUR(prevcolour)-prevcolour, *prevline, &pos); } }