/** * This routine searches through the specified outline and finds * the points at which the outline changes direction. These * points are then marked as "extremities". This routine is * used as an alternative to FindExtremities(). It forces the * endpoints of the microfeatures to be at the direction * changes rather than at the midpoint between direction * changes. * @param Outline micro-feature outline to analyze * @return none * @note Globals: none * @note Exceptions: none * @note History: 6/29/90, DSJ, Created. */ void MarkDirectionChanges(MFOUTLINE Outline) { MFOUTLINE Current; MFOUTLINE Last; MFOUTLINE First; if (DegenerateOutline (Outline)) return; First = NextDirectionChange (Outline); Last = First; do { Current = NextDirectionChange (Last); MarkPoint (PointAt (Current)); Last = Current; } while (Last != First); } /* MarkDirectionChanges */
/*---------------------------------------------------------------------------*/ void ConvertToPicoFeatures2(MFOUTLINE Outline, FEATURE_SET FeatureSet) { /* ** Parameters: ** Outline outline to extract micro-features from ** FeatureSet set of features to add pico-features to ** Globals: ** classify_pico_feature_length ** length of features to be extracted ** Operation: ** This routine steps thru the specified outline and cuts it ** up into pieces of equal length. These pieces become the ** desired pico-features. Each segment in the outline ** is converted into an integral number of pico-features. ** Return: none (results are returned in FeatureSet) ** Exceptions: none ** History: 4/30/91, DSJ, Adapted from ConvertToPicoFeatures(). */ MFOUTLINE Next; MFOUTLINE First; MFOUTLINE Current; if (DegenerateOutline(Outline)) return; First = Outline; Current = First; Next = NextPointAfter(Current); do { /* note that an edge is hidden if the ending point of the edge is marked as hidden. This situation happens because the order of the outlines is reversed when they are converted from the old format. In the old format, a hidden edge is marked by the starting point for that edge. */ if (!(PointAt(Next)->Hidden)) ConvertSegmentToPicoFeat (&(PointAt(Current)->Point), &(PointAt(Next)->Point), FeatureSet); Current = Next; Next = NextPointAfter(Current); } while (Current != First); } /* ConvertToPicoFeatures2 */
/** * This routine searches through the specified outline, computes * a slope for each vector in the outline, and marks each * vector as having one of the following directions: * N, S, E, W, NE, NW, SE, SW * This information is then stored in the outline and the * outline is returned. * @param Outline micro-feature outline to analyze * @param MinSlope controls "snapping" of segments to horizontal * @param MaxSlope controls "snapping" of segments to vertical * @return none * @note Exceptions: none * @note History: 7/21/89, DSJ, Created. */ void FindDirectionChanges(MFOUTLINE Outline, FLOAT32 MinSlope, FLOAT32 MaxSlope) { MFEDGEPT *Current; MFEDGEPT *Last; MFOUTLINE EdgePoint; if (DegenerateOutline (Outline)) return; Last = PointAt (Outline); Outline = NextPointAfter (Outline); EdgePoint = Outline; do { Current = PointAt (EdgePoint); ComputeDirection(Last, Current, MinSlope, MaxSlope); Last = Current; EdgePoint = NextPointAfter (EdgePoint); } while (EdgePoint != Outline); } /* FindDirectionChanges */