// // RecomputeSeg // // Fill in the fields 'angle', 'len', 'pdx', 'pdy', etc... // void RecomputeSeg(seg_t *seg) { seg->psx = seg->start->x; seg->psy = seg->start->y; seg->pex = seg->end->x; seg->pey = seg->end->y; seg->pdx = seg->pex - seg->psx; seg->pdy = seg->pey - seg->psy; seg->p_length = UtilComputeDist(seg->pdx, seg->pdy); seg->p_angle = UtilComputeAngle(seg->pdx, seg->pdy); if (seg->p_length <= 0) InternalError("Seg %p has zero p_length.", seg); seg->p_perp = seg->psy * seg->pdx - seg->psx * seg->pdy; seg->p_para = -seg->psx * seg->pdx - seg->psy * seg->pdy; }
// // VertexCheckOpen // sector_t * VertexCheckOpen(vertex_t *vert, float_g dx, float_g dy) { wall_tip_t *tip; angle_g angle = UtilComputeAngle(dx, dy); // first check whether there's a wall_tip that lies in the exact // direction of the given direction (which is relative to the // vertex). for (tip=vert->tip_set; tip; tip=tip->next) { if (fabs(tip->angle - angle) < ANG_EPSILON || fabs(tip->angle - angle) > (360.0 - ANG_EPSILON)) { // yes, found one return NULL; } } // OK, now just find the first wall_tip whose angle is greater than // the angle we're interested in. Therefore we'll be on the RIGHT // side of that wall_tip. for (tip=vert->tip_set; tip; tip=tip->next) { if (angle + ANG_EPSILON < tip->angle) { // found it return tip->right; } if (! tip->next) { // no more tips, thus we must be on the LEFT side of the tip // with the largest angle. return tip->left; } } InternalError("Vertex %d has no tips !", vert->index); return FALSE; }
static void VertexAddWallTip(vertex_t *vert, float_g dx, float_g dy, sector_t *left, sector_t *right) { wall_tip_t *tip = NewWallTip(); wall_tip_t *after; tip->angle = UtilComputeAngle(dx, dy); tip->left = left; tip->right = right; // find the correct place (order is increasing angle) for (after=vert->tip_set; after && after->next; after=after->next) { } while (after && tip->angle + ANG_EPSILON < after->angle) after = after->prev; // link it in tip->next = after ? after->next : vert->tip_set; tip->prev = after; if (after) { if (after->next) after->next->prev = tip; after->next = tip; } else { if (vert->tip_set) vert->tip_set->prev = tip; vert->tip_set = tip; } }