• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -*-C-*-
2  ********************************************************************************
3  *
4  * File:        outlines.h  (Formerly outlines.h)
5  * Description:  Combinatorial Splitter
6  * Author:       Mark Seaman, OCR Technology
7  * Created:      Thu Jul 27 11:27:55 1989
8  * Modified:     Wed May 15 17:28:47 1991 (Mark Seaman) marks@hpgrlt
9  * Language:     C
10  * Package:      N/A
11  * Status:       Experimental (Do Not Distribute)
12  *
13  * (c) Copyright 1989, Hewlett-Packard Company.
14  ** Licensed under the Apache License, Version 2.0 (the "License");
15  ** you may not use this file except in compliance with the License.
16  ** You may obtain a copy of the License at
17  ** http://www.apache.org/licenses/LICENSE-2.0
18  ** Unless required by applicable law or agreed to in writing, software
19  ** distributed under the License is distributed on an "AS IS" BASIS,
20  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  ** See the License for the specific language governing permissions and
22  ** limitations under the License.
23  *
24  *********************************************************************************/
25 #ifndef OUTLINES_H
26 #define OUTLINES_H
27 
28 #include "blobs.h"
29 #include "chop.h"
30 
31 #include <math.h>
32 
33 /*----------------------------------------------------------------------
34               C o n s t a n t s
35 ----------------------------------------------------------------------*/
36 #define LARGE_DISTANCE   100000  /* Used for closest dist */
37 #define MIN_BLOB_SIZE    10      /* Big units */
38 #define MAX_ASPECT_RATIO 2.5     /* Widest character */
39 
40 /*----------------------------------------------------------------------
41               M a c r o s
42 ----------------------------------------------------------------------*/
43 /**********************************************************************
44  * same_point
45  *
46  * Return TRUE if the point values are the same. The parameters must
47  * be of type POINT.
48  **********************************************************************/
49 #define same_point(p1,p2)                    \
50 	((abs (p1.x - p2.x) < chop_same_distance) && \
51 	(abs (p1.y - p2.y) < chop_same_distance))
52 
53 /**********************************************************************
54  * dist_square
55  *
56  * Return the square of the distance between these two points.  The
57  * parameters must be of type POINT.
58  **********************************************************************/
59 
60 #define dist_square(p1,p2)                     \
61 	((p2.x - p1.x) * (p2.x - p1.x) +            \
62 	(p2.y - p1.y) * (p2.y - p1.y))
63 
64 /**********************************************************************
65  * closest
66  *
67  * The expression provides the EDGEPT that is closest to the point in
68  * question.  All three parameters must be of type EDGEPT.
69  **********************************************************************/
70 
71 #define closest(test_p,p1,p2)                   \
72 (p1 ?                                         \
73 	(p2 ?                                        \
74 	((dist_square (test_p->pos, p1->pos) <      \
75 		dist_square (test_p->pos, p2->pos)) ?     \
76 	p1  :                                      \
77 	p2) :                                      \
78 	p1)  :                                      \
79 	p2)
80 
81 /**********************************************************************
82  * edgept_dist
83  *
84  * Return the distance (squared) between the two edge points.
85  **********************************************************************/
86 
87 #define edgept_dist(p1,p2)  \
88 (dist_square ((p1)->pos, (p2)->pos))
89 
90 /**********************************************************************
91  * is_exterior_point
92  *
93  * Return TRUE if the point supplied is an exterior projection from the
94  * outline.
95  **********************************************************************/
96 
97 #define is_exterior_point(edge,point)                    \
98 (same_point (edge->prev->pos, point->pos)  ||          \
99 	same_point (edge->next->pos, point->pos)  ||          \
100 	(angle_change (edge->prev, edge, edge->next) -   \
101 	angle_change (edge->prev, edge, point) > 20))
102 
103 /**********************************************************************
104  * is_equal
105  *
106  * Return TRUE if the POINTs are equal.
107  **********************************************************************/
108 
109 #define is_equal(p1,p2)  \
110 (((p1).x == (p2).x) && ((p1).y == (p2).y))
111 
112 /**********************************************************************
113  * is_on_line
114  *
115  * Return TRUE if the point is on the line segment between the two end
116  * points.  The two end points are included as part of the  line.  The
117  * parameters must be of type POINT.
118  **********************************************************************/
119 
120 #define is_on_line(p,p0,p1)                  \
121 	(within_range ((p).x, (p0).x, (p1).x) &&  \
122 	within_range ((p).y, (p0).y, (p1).y))
123 
124 /**********************************************************************
125  * within_range
126  *
127  * Return TRUE if the first number is in between the second two numbers.
128  * Return FALSE otherwise.
129  **********************************************************************/
130 
131 #define within_range(x,x0,x1) \
132 	(((x0 <= x) && (x <= x1)) || ((x1 <= x) && (x <= x0)))
133 
134 /*----------------------------------------------------------------------
135               F u n c t i o n s
136 ----------------------------------------------------------------------*/
137 int crosses_outline(EDGEPT *p0,  /* Start of line */
138                     EDGEPT *p1,  /* End of line */
139                     EDGEPT *outline);
140 
141 int is_crossed(TPOINT a0, TPOINT a1, TPOINT b0, TPOINT b1);
142 
143 int is_same_edgept(EDGEPT *p1, EDGEPT *p2);
144 
145 EDGEPT *near_point(EDGEPT *point, EDGEPT *line_pt_0, EDGEPT *line_pt_1);
146 
147 void reverse_outline(EDGEPT *outline);
148 #endif
149