MXPA99009196A - Distortion resistant double-data correcting color transition barcode and method of generating and using same - Google Patents

Distortion resistant double-data correcting color transition barcode and method of generating and using same

Info

Publication number
MXPA99009196A
MXPA99009196A MXPA/A/1999/009196A MX9909196A MXPA99009196A MX PA99009196 A MXPA99009196 A MX PA99009196A MX 9909196 A MX9909196 A MX 9909196A MX PA99009196 A MXPA99009196 A MX PA99009196A
Authority
MX
Mexico
Prior art keywords
cell
column
color
scanned
value
Prior art date
Application number
MXPA/A/1999/009196A
Other languages
Spanish (es)
Inventor
R Kaufman Jeffrey
P Hohberger Clive
Original Assignee
Zebra Technologies Corporation
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Zebra Technologies Corporation filed Critical Zebra Technologies Corporation
Publication of MXPA99009196A publication Critical patent/MXPA99009196A/en

Links

Abstract

A color barcode symbol (8) that can be accurately decoded despite severe distortions, misreads or altered symbols. The barcode (8) is a color transition barcode (8) having linear growth properties designed to resist the single or combined effects of:scaling distortions, perspective distortions, shear distortions, and wave distortions of both the uniform and non-uniform type distributed across the barcode's vertical (12) or horizontal axis (10). The barcode (8) is also resistant to missing symbols and altered symbols while offering high security, error checking, and double error correcting capability.

Description

;? DOUBLE DATA RESISTANT TO DISTORTION CORRECTING THE 'TRANSITION OF COLOR OF THE BARCODE AND METHOD FOR GENERATING AND USING THEM - DESCRIPTION OF THE INVENTION _ The invention relates to a color bar code symbology which can be decoded in a manner accurate in spite of various distortions, erroneous readings or altered symbols. More particularly, the present invention relates to a color pull bar code having linear growth properties designed to withstand the individual or combined effects of: enlargement distortions, perspective distortions, cut distortions and wave distortions both of uniform type as non-uniform type, distributed through the vertical or horizontal axis of the bar code. The color bar code symbology of the present invention is also resistant to missing symbols and altered symbols as it offers high security, error checking and double error correction capability. ^ _ There are three main classifications of oarras code: uni-dimensional, _bi-d mensional, and transition codes. Uni-dimensional bar codes are typically a linear arrangement of elements that are printed either directly "on an object or on labels which are fixed to the object. A unidimensional bar code is typically comprised of bars and parallel spaces with bars of different widths representing binary strings of ones and spaces of different widths representing strings of binary zeros. The element-specific layout that defines the encoded data according to a set of rules and definitions specified by the specific type of encoding used. The height of a uni-dimensional bar code is the height of each of the bars and parallel spaces. As more information is encoded within the barcode, the barcode width changes and the height of the barcode remains constant. A bar code that recognizes these growth characteristics is referred to as having linear growth properties. As noted above, the bars and parallel spaces of a one-dimensional bar code having varying widths. Generally, the bars and spaces may not be smaller than a specified minimum width called the "x-dimension" of the bar code. While the size of the theoretical minimum "dimension x" is the wavelength of the light that is used to read the bar code, there are other practical limitations. Among those limitations are the desired depth of field of the reading equipment, the limitations of a process of certain print and the strength of the printed image so that ^ is read correctly despite dust, dirt and minor physical damage. The relative size of the bars and spaces is determined by the type of use of the encoder. The number of characters per unit length represented by "the symbol of the bar code is referred to as the density of the symbol." To encode a desired sequence of characters, a "^ collection of element arrangements are concatenated together to form the symbol of Complete barcode, with each message character that is represented by its own corresponding group of elements. In some symbologies, a "start" and "stop" character are used to indicate when the bar code starts and ends. A limitation of the bar codes that use the start and stop patterns is that those patterns occupy wasted space because they are not used to encode any data. "Because most uni-dimensional codes can be unusually long as long data strings are encoded, most one-dimensional bar codes contain only five or six letters or digits. relatively small amount of data contained in a typical one-dimensional bar code, most applications A traditional one-dimensional bar code is to use the encoded data only as an index for a file or a database associated with the computer system where it is available in more comprehensive training. A number of different one-dimensional bar code symbologies exist including UP / EAN, Coder39, Code 93, Code 128, ~ and Interleaved 2 of 5. ~~ Je: ,,,. i There are multiple variations of two-dimensional bar codes that currently exist. As for single-dimensional bar codes, two-dimensional bar codes can be printed directly on an object or on labels that are affixed to the object. A variation of the two-dimensional bar code is an extension of a one-dimensional bar code in which the uni-dimensional bar codes are stacked with horizontal protection bars between them to increase the density. An example of such a bar code is shown in U.S. Patent No. 4,7 * 94,239. Other two-dimensional codes do not require a protection bar. . An example of a bar code that does not require one. Protection bar can be seen in US Pat. No. 5,304,786 to Pavlidis et al and is referred to as PDF417. The '786 Patent eliminates the use of protection bars by having data values (code words) in alternating rows that are selected from of mutually exclusive subsets of bar patterns and spaces. The subsets are defined in terms of particular values of discriminant function which is a function of the "bar pattern" and space in a given code word.The alternating rows of bar and space patterns selected from mutually exclusive subsets of bar and space patterns allow the browser to recognize if a scan line "has a row traversed in the middle part of a code word, because if the row has been traversed, the code words scanned will not produce the same discriminator value I wanted a previous row A limitation of two-dimensional bar codes that are comprised of a plurality of stacked one-dimensional codes is that they are sensitive to printing variations This limitation occurs due to the relative widths of the bars and spaces that determine the "data encoded in the bar code and any variation thereof will cause data errors that are incurred during the scan. The '786 patent also describes the broad concept of using code words of different colors in alternative rows. That is, all rows of a multi-row label could use the same subset of bar and space patterns as words and code, although ^ in different colors; the determination of a single row that has been traversed, would be made based on whether a color change has occurred. Another type of two-dimensional bar code that exists is one that contains an array of cells. The matrix has a respective width and height. THE DATA CODE is an example of this type of bar code. This type of code is currently formed under an invisible square grid. The cells under the grid are selectively obscured to be read by an optical scanning device. The decoding of two-dimensional bar codes composed of a matrix of cells is executed by placing an imaginary grid on the cell matrix and sampling on each grid center to detect if each cell is obscured or not. Depending on Xa specification for the code, certain combinations of cells that are obscured and other cells that are not obscured can be translated by the optical scanning device into numeric or character data depending on the specification for the barcode. .I Most two-dimensional bar codes are capable of "storing as much information as a one-dimensional bar code as described in the 'patent' 786. The size "" of two-dimensional bar codes that contain a cell nuance is proportional to the amount of data that is stored in the barcode. Most two-dimensional bar codes that contain a cell matrix have the same width and height although this is not always a requirement. Other two-dimensional bar codes that are comprised of stacked one-dimensional bar codes do not generally maintain their width and height constant. In the case of PDF417, the height of each stacked linear bar code is allowed to change in a variable way across the linear row. The transition bar codes encode the information by inserting transition indexes between adjacent bar code elements. This transitional bar code is a one-dimensional bar code symbology in which solid bars and wide spaces are specified by being replaced by cell columns of a width not required. The bar code contains a plurality of cell column combinations that are concatenated to form the complete bar code symbol with each character of the message that is represented by its own corresponding group of cell columns. The bar code uses the "start" and "stop" characters to indicate where the bar code starts and ends. Only certain combinations of cell column are selected to form the complete bar code symbol. The selected cell column pattern for Representing a data value depends on the cell column pattern of the previous cell column to ensure that sufficient change between the adjacent cell columns is present. The change _ between the cell columns Adjacent is a form of transition rates. Because the bar code is guaranteed to have a certain amount of change between each adjacent cell column, this type of bar code can be scanned by a bar code scanner that has a variable scan range without using a scan of additional clock over the bar code or a position encoder over the barcode scanner. This can be achieved due to the change between each adjacent cell column that is used to indicate that the cell column has been traversed. Because of this, the bar code symbology is almost uniform against the distortions due to the low quality printing process, the direct marking prices and the manual scanning with linear CCD bar code scanners as will be described then. The bar code transition symbology can also be seen as a bi-dimensional symbology formed as "a cell matrix." As additional data is encoded in the bar_code, the bar code grows in a linear direction and the height of the code from bars does not change unless it is subject to printing or scanning abnormally. This symbology of transition bar codes can be further observed as a dispersed matrix symbology where there is a guaranteed absence of cells in the symbology depending on the data that is encoded. This absence of cells coupled with the data coding specification for the bar code is a form of transition rates and aids in resistance to distortion. - Another type of transition code can be found in US Patent No. 3,637, 993 by Cristie et al. The '993 patent describes a linear bar code comprised of a plurality of contiguous color bars, wherein each color bar is a color different from the color of its neighboring color bars. The color change between adjacent color bars is a form of transition rates. Like the transition barcode, this type of barcode can be scanned by a barcode scanner that has a variable scan range without using an additional clock scan over the bar code or a position encoder about the barcode scanner. This bar code has the advantage of being resistant to distortion and is about half the size of a similar color bar code that has a clock trace the integrated. However, because the bar code is linear, the data coding capacity of the bar code is limited and the bar code does not contain any means for error stop and correction, as described below. To resist damage, the one-dimensional, two-dimensional, and transition codes may contain error detection and error correction verification digits. A well-known method for executing error detection and correction is to use Reed-Soloman coding and decoding and is described in U.S. Patent No. 5,479,515 to Longacre Jr. Some linear bar codes and most two-dimensional bar codes and transition bar codes use Reed- ^ Soloman coding. I Reed-Soloman coding requires the use of verification digits to be appended to the data portion of the bar code symbology. If a group of barcode elements (cells or bar and space patterns), in any type of bar code symbology that "forms an individual data_s_ value is corrupted, the 'Error detection and correction verification digits will detect and correct the error. This is referred to as an individual or level error correction. The number of errors that can be corrected is proportional to the number of verification digits in the symbology. Many neighbors, the digits of additional checks are used to decrease the possibility of false decoding. These additional verification digits can be additional Reed-Soloman verification digits or Cyclic Redundancy Verification digits. - Since there are three-dimensional matrix type bar codes and transition bar codes, a grouping of cells is generally used to represent a data value. Traditionally, if a cell outside that group of cells is corrupted, the data value assigned to that group of cells can not be determined. However, as previously described, the data value associated with that group of cells can be detected and corrected by the error detection and correction verification digits. It is a continuous goal to improve the error correction capability of any bar code symbology. As far as the inventors know, only the error correction of the individual level has been made. The present invention improves the ability to correct data detection by creating cell groups that are self-correcting or produce a restricted set of possible solutions in the absence of any error detection and correction digits. This type of correction system The errdr of the present invention is defined to be double-level error correction. Common distortions between manual printing and scanning devices include wave, cut, enlarge, and perspective and combinations thereof. Any of these distortions may be oriented in the horizontal or vertical direction and may be uniform or not uniform by nature. A designation system of three consistent words is used to classify the types of distortion. The first term explains the consistency of the code and is always uniform or non-uniform. The second term describes the main axis or the distortion and is always horizontal or vertical. The final term describes the type of distortion and is wave, cut, enlarge, or perspective For example, the codes can be designated as uniform vertical wave, or horizontal non-uniform cut.This allows a consistent language to describe the distortions and almost any imaginable mutation of a bar code can be described by composing one or more of the distortion types.The non-uniform distortions simply indicate that a distortion is not consistent across the principal axis listed in the description of designation. of distortion A first type of distortion is a perspective distortion or sometimes referred to as a distortion of projection. Perspective distortion is usually caused by an artifact in the scanning system where the scanner image formation plane is not placed parallel to the image plane of the barcode being "scanned." Perspective distortion may be uniform The existing one-dimensional bar code symbologies may be difficult to decode under uniform perspective distortions due to the relative spacing of the bars and spaces that are not conserved The exception to this is when the two-dimensional CCD scanners are Use when the magnitude of perspective distortion can be calculated and the scanned image distorted in perspective can be corrected.When the bi-dimensional matrix symbology is decoded, a grid is built over the symbology as previously described except that the grid is uniformly enlarged to adjust over the image ^ dist Orsionated in perspective. Unfortunately this process requires a lot of computation, and also extensive computational processing energy and takes a long time - for its execution. Transitional symbologies can generally be easily decoded under even perspective shifts, although, they require some processing to determine the extent and parameters of perspective distortion. The barcodes of Transition as described in the '993 patent are not affected by perspective distortions. A second type of distortion is the expansion distortion. Expansion distortions can be caused by errors in the printing system or caused by artifacts in the scanning system. Expansion distortions can occur uniformly on the vertical and horizontal axis and can be distributed unevenly over the vertical or horizontal. The more linear bar code symbologies are not affected by uniform enlargement distortions due to the relative size of the bars and spaces that remain constant. However, some symbologies of linear bar codes, such as UPC, require that the barcode be of a specific length. Uniform horizontal scaling distortions would cause the length of the general linear bar code to shrink or expand by converting the barcode, such as the UPC symbology, that was outside the tolerance, and likewise, could not The two-dimensional bar code symbologies are not affected by uniform horizontal or vertical enlargement distortions to menses that the distortions ^ cause the element sizes or code aspect ratio to exceed the maximum specified for that specific barcode symbology. Because all transitional bar codes in the '993 no' patent have aspect ratio restrictions or element size restrictions, they do not become "exploitable" due to uniform horizontal or vertical enlargement distortions. The linear bar code is not affected by the vertical enlargement distortions not uniformed since the appearance of the bars and spaces would not change, however, the non-uniform horizontal expansion distortions are disastrous for the symbologies of linear-bar codes and that the relative sizes of bars and spaces will change rendering the bar code illegible The exception to this are linear bar codes that have clock tracking formed within it, such as the "bar code" known as Postnet. These_ types of linear bar codes can be distorted horizontally in a non-uniform way and still be explorable. "As for linear bar code symbologies, linear stacked bi-dimensional symbologies are the most affected by non-uniform horizontal enlargement distortions since the relative sizes of the bars and spaces will change causing the bar code to be unexplorable In general, two-dimensional matrix symbologies are more tolerant of non-uniform scaling distortions across any principal axis. The 'decoding of the bi-dimensional matrix simbolology which has non-uniform horizontal or vertical enlargement distortions, requires that an imaginary grid be distorted non-uniformly in the same way as the bar code and placed on the distorted bar code. By forming an imaginary grid distorted non-uniformly, it is difficult to do in the absence of any indices in the bar code to indicate how the "bar code is distorted in a non-uniform manner." The clock trackers are frequently added to the symbologies of bi-dimensional matrix to aid in the formation of this imaginary grid but with any major expansion distortions will make those codes unexplorable.Moreover, the mathematical formation of an imaginary grid distorted in a non-uniform manner is a time-consuming and time-consuming task. it requires a substantial amount of computing capacity All the existing transition codes are highly resistant to all types of non-uniform vertical and horizontal expansion distortions because the width and variable element heights do not affect the decoding capability of the code as a result of i7 The presence of transitional indices inherent in the symbology A third type of distortion is the shear distortion.This type of distortion is often caused by the elements of a print head that is not exactly perpendicular to the direction of movement of the substrate. The cutting distortion can be created as an artifact of the scanning apparatus For example, FIGURE 1 shows a manual one-dimensional scanning apparatus 7 that scans an undistorted bar code 8 on a piece of paper. scanning apparatus 7 will observe the bar code having a cutting distortion if the _, axis 9 of the scanning elements of the scanning apparatus 7 is not perpendicular to the main axis 10 of the bar code 8 that is scanned. Bar codes are generally resistant to moderate forms of uniform cut distortion, however, excessive amounts of dist Orsion will convert most existing bar code symbologies into unexploitable ones except the color transition code described in the '993 patent. Scanning under severe cutting distortions becomes difficult because the bar and space widths are difficult to determine in linear and stacked two-dimensional symbologies and the locations of Elements in bi-dimensional matrix symbologies are also difficult to determine without extensive processing. The transition codes are more tolerant to uniform cut distortions although they can become very difficult to decode under severe cut distortions due to the transition point of each cell column that becomes difficult to determine. The color described in the '993 patent is not affected by uniform cut distortions since the angle of intersection between each adjacent color bar changes but does not affect the scanning capability.The non-uniform horizontal and vertical cut distortions are disastrous for all existing types of bar codes due to -locations and relative separation of the elements of those bar codes that can not be reliably determined.However, there are two exceptions.The color transition bar code described in '993 patent is not affected by uniform cut distortions since the intersection angle is Re each bar of adjacent color changes but does not affect the ability to scan. The code of 'transition is resistant to small amounts of this type of non-uniform cut distortion although excessive amounts of this type of distortion will convert to the bars in unexplorable due to the transition point of each cell column that becomes "impossible to determine." Referring again to FIGURE 1, non-uniform horizontal and vertical cut distortions are more commonly caused by artifacts from the process scanning when the longitudinal axis 9 of the scanning elements of the manual barcode scanner 7 changes in a variable manner relative to the main axis 10 of the barcode 8 being scanned.This can occur when the manual barcode scanner 7 is rotated about its longitudinal axis 11 as the barcode is scanned 8. ß The last type of bar code distortion is wave distortion.Wave distortion can occur on the horizontal or vertical axis of a code. bars and can be of uniform or non-uniform type.The wave, in the context of this description, involves a disturbance or oscillation between points through the bar code in the ^ direction parallel to the main axis of distortion. The disturbance or oscillation can be of any type, such as sinusoidal, triangular, square or sawtooth. A characteristic attribute of the uniform wave distortion is that the wave type is of the same magnitude and phase on each end of the bar code. Wave distortions horizontal and vertical non-uniform do not have the same magnitude and phase on each end of the barcode. Wave distortions can occur during the printing process where the object that is marked moves with respect to the printing apparatus. Wave distortions can be caused by an artifact of the scanning system. Referring again to FIGURE 1, ideally, the barcode scanner 7 should not move along the axis 12 of the bar code 8 and only move along the main axis 10 of the bar code 8. Uniform wave distortions will be created if the manual scanner 7 starts to oscillate along the axis 12 according to the bar code being scanned along the axis 10. ~ The linear bar codes are very tolerant to the distortions of Horizontal wave uniforms. However, they are not very tolerant of uniform vertical wave distortions since the scanner can perceive inadequate bar and space widths if the bar code scanner is not scanning exactly parallel to the axis of the bar code being scanned. Two-dimensional bar codes are not tolerant of any type of wave distortion because when trying to calculate an imaginary grid on bar code symbology for decoding, it is a task that it consumes time, requires a "substantial amount of computing power and may be impossible without the help of any suitable indexes from the bar code symbology that indicate how the bar code is distorted by ~ wave. Bar codes and clock trackers help even though any substantial wave distortion, those rates are usually not sufficient.Transition codes are extremely tolerant of uniform horizontal wave distortion.However, transition rates are lost under the remaining types of wave distortions and similarly, the transition bar code becomes increasingly difficult to decode under those types of distortions.The color transition code described in the '993 patent would be resistant to any kind of distortion of uniform or non-uniform wave, since the transition rates are not lost under any type of Wave Stress A propagation error in a barcode symbology occurs with an error in an element of the bar code propagating to the next or preceding bar code element. Therefore, an error becomes two or more errors. This phenomenon is usually caused by the values of elements of a bar code symbology that depends on the value or structure of an adjacent element.
The "Transition Barcode is an example of a bar code symbology that is subject to propagation errors." Propagation errors can also occur in color bar codes US Patent No. 5,576,528 to Chew _ et al., describes a method for increasing the information density of a bar code symbology by generating multiple constituent bar code symbols where each symbol is formed in a different color selected from a group of several primary colors. symbol with color is located on top of another, forming in this way a bar code symbol added in various colors.In the areas where the different color bars overlap each other, the color different from those "in the group original colors are formed. Using a reverse process, each individual bar code can be separated and processed individually afterwards. Although this coding method increases the desired information, the strength of the aggregate bar code symbology decreases as a result of the phenomenon of propagation error. This occurs due to an error or color change in a bar code element that can, under certain circumstances, prevent the remaining color layers of the bar code from being determined.
The only bar code symbology that exhibits extraordinary resistance to all types of damage and distortion and that is not subject to propagation errors is the color transition bar code described in the '993 patent. However, this bar code is limited in its data capacity, does not contain a space-efficient data encoding method and does not contain means for error correction and detection. J ~ Resistance to distortion and damage is very important in bar code symbologies when using manual "printers" and manual scanners since the human hand tends to be unstable so it can cause variations in the processes of printing and exploration. "" A bar code that has resistance to inherent distortion is easier and faster to scan with scanning devices area and linear bar code. Resistance to damage and distortion is also important when using low-quality printing processes, such as commercial inkjet machines. Providing high quality marking and scanning machines is expensive and unnecessary if the bar code symbology that is used is highly resistant to distortion and contains a substantial amount of media. "error detection and correction." Distortion resistance is also important for most types of scanning applications because scanning system artifacts can cause the bar code to appear distorted. As non-expensive colors become more prevalent, the use of color information in a bar code symbology is not irrational and highly desirable due to the cast information, when properly used, it helps in the resistance to damage and the distortion in that it increases the density of bar code information.Color is also attractive to the eye and is desirable for marking consumer products. = - - = _ For the above reasons, there is a need for a symbology of color transition barcode, you are resistant to the effects of all types of damage and distortion described above in this trailer n a space-efficient data coding structure with double error correction capability. Of the present invention to provide a color bar code symbology where the relative sizes of its elements are not critical, which makes the bar code so resistant to any type of distortion or combinations thereof described herein. The object of the present invention is to provide a color-transition bar code symbology which can be decoded using a simple decoding algorithm without determining the type and magnitude of its distortion. Still another object of the present invention is to provide a symbology of color transition bar code that can be scanned by an area image former or a linear image former with and without position feedback. A further object of the present invention is to provide a color transition bar code symbology that does not require "start" and "stop" patrons. A further object of the present invention is to provide a symbology of color transition bar codes incorporating a space-efficient data coding system. "Another object of the present invention is to provide a bar code symbology of .color transition which can be printed at very high and very low densities.
Still another object of the present invention is to provide "a color transition bar code symbology having double error correction capability.: A further object of the present invention is to provide a color transition bar code symbology. In summary, and in accordance with the foregoing, the present invention is directed to a color transition bar code symbology that satisfies the need for a transitional bar code symbology of color that "satisfies the need for a bar code symbology that is resistant to the effects of all types of damage and distortions previously described, equipped with data-efficient structure for" space and double error correction capability " . - A symbology of color transition bar code having the characteristics of the present invention, comprises a plurality of values that can be concatenated according to a set of rules and definitions to encode data. To represent each of these values, a plurality of mutually exclusive set of colors is formed. A plurality of color cells is then created, each having a color selected from any of the colors available contents in any of the color sets. A plurality of single color cell groups are then formed when each color cell group comprises a plurality of color cells selected from the same color set. Each color cell group can be referred to by having been formed from the available color sets. Each color cell in each color cell group is always joined by a color cell of another color from the same color set that creates a first form of transition indexes. . Each data value that the bar code symbology can encode is mapped to two or more color cell groups-formed from different sets. As the bar code symbology is formed, each color cell group is joined by a color cell group formed from a different color set that creates a second form of transition indexes. To form a complete symbology, each data value that is to be concatenated to encode information is selected from one of the two or more color cell groups selected to represent that data value. The current-color set of the color cell group selected to represent that value depends on the color sets of the cell groups that will be joined in the bar code symbology so that two color cell groups from the same color set are never contiguous. A search pattern is then constructed around the cell groups used to code the data. The "combinations of cell elements that make up the groups of color cells are strategically selected to be able to correct or minimize unambiguously the number of cell group possibilities of damaged color that can be contained. try to decode this barcode, the first attempt process to correct each color cell group is executed before the second errdT correction process requiring digits of _verification is initiated. This process is therefore a "form of double error correction that increases the error correction capability of this bar code symbology and also increases the resistance of the barcode to damage and distortions by increasing the efficiency of the algorithms of Reed-Soloman error correction Also, because each color cell group represents a value directly, the propagation phenomenon is not present The values for each of the verification digits are represented by a group of groups of color cell that are exclusive from the group of groups of color cells used to represent the encoded data. This eliminates the use of the "start" and "stop" patterns in the "bar code symbology" because the verification digits can be placed at the end of the bar code and the data at the beginning of the bar code, inherently identifying in this way the "start" point and the "determination" point of the bar code symbology These and other features, aspects and advantages of the present invention will be better understood with respect to the following description, the appended claims and the accompanying drawings BRIEF DESCRIPTION OF THE DRAWINGS AND APPENDICES The organization and "the form of structure and operation of the invention, together with the objects and additional advantages thereof, can be better understood by reference to the following description, taken in connection with the accompanying drawings, in which similar reference numbers identify similar elements in which: Figure 1 ustra a view of a manual barcode scanner that scans a barcode; Figure 2 illustrates a view of a two-dimensional color bar code incorporating the features of the present invention; Figure 3 illustrates a flow chart describing a genetic logarithm to generate an optimal active set combination; Figure 4 illustrates a diagram showing two active sets that are crossed; Figure 5 illustrates a flow chart of a first decoding algorithm starting in a top cell of a cell column; Figure 6 illustrates a flow diagram of a second decoding algorithm starting in a lower cell of a cell column: Figure 7 illustrates a view of a distorted two-dimensional color bar code of this invention showing the typical scanning patterns of the first and second decoding algorithms; and Figure 8 illustrates a bar code. APPENDIX A is a list of an active set of cell columns; APPENDIX B is a list of the valid set of cell columns; APPENDIX C shows the data cell column map formation; - APPENDIX D shows the formation of Reed-Saloman cell column maps; APPENDIX E shows the formation of a miscellaneous cell column map; APPENDIX F shows all possible types of errors to which a cell column may be subject; EJ APPENDIX G shows a list of computer programs in C ++ to generate cell column solution statistics; APPENDIX H shows a first sample output listing from the computation program in APPENDIX G which shows the details that refer to the correction capability of the "cell" columns in an active set; APPENDIX I shows a second Sample output listing from the computation program in APPENDIX G which shows the average correction capacity of each cell column in an active set While the invention may be susceptible to being presented in different ways, it is shown in the drawings, and in the present to be described in detail, a specific embodiment with the understanding that the present description will be considered as an exemplification of the principles of the invention, and is not intended to limit the invention to that as it is illustrated and described in the present. The preferred embodiment of the present invention is now described in detail. Referring to Figure 2, 3. 2 A variable length barcode is built. The bar code has a unique pattern search pattern that has two components: a solid horizontal line of contiguous black cells 13 on the upper edge of the bar code, and two solid vertical lines 14 and 15 of contiguous black cells placed at along the lateral start torpe 16 of the bar code and along the iateral edge of the stop 17 of the bar code. This search pattern is used to define the physical size, orientation and symbol distortion. This search pattern is also used to discriminate this bar code from other barcode symbologies. Within the search pattern, a plurality of cell groups are formed and placed. In the preferred embodiment, the cell column amount is always greater than l and is increased and in proportion to the amount of data encoded within the bar code. Each cell group is formed from a plurality of cells where each cell has a specific position within the cell group. In the preferred embodiment, each cell group is a cell width by a length of eight cells and can be referred to as a column of cells. Each cell in each cell column can be referred to as a cell position number where the lower number 0, represents the lower cell in a "cell column and the higher number 7, represents the top cell in a cell column. These cell positions are referred to by a variable K. Each cell in each column cell has a color associated with "her- and the selected color is from a first set of colors or from a second set of colors. preferred modality, the first set of colors are RED, "GREEN and BLUE otherwise known as addiction colors. The second set of colors are CYAN, MAGENTA and YELLOW known ^ otherwise as subtractive colors. Additive colors and subtractive colors are referred to as opposed color sets in this description. An example of a color column can be found in FIGURE 2 where column 18 comprises cells 19-26. The upper cell 19 has a value k of 7 and the lower cell 26 has a value k of 0. There are three specific rules associated with each cell column. First, the color of the cells that is used in each cell column must be only from the additive color set or the subtractive color set. The combination of color cells from both sets in a cell column is prohibited. Second, two cells of the same color in a cell column can not be contiguous. Third, a cell that has a value k of 0 in a cell column may not have the same color than a cell that has a value k of 7 in the same cell column. In order to encode the data in the barcode, each cell column must represent a data value. Similarly, the unique cell color combinations in each cell column represent specific data values. Because working with color names is not convenient, each color of the additive and subtractive color sets are "correlated with numbers." Because cell-column can be formed from the additive color set or the Subtractive color set, a single number can represent a color from both sets of colors.The following table shows the correlation: _- a cell column formed from sets of additive or subtractive colors have the same cell column value. In other words, a value in the bar code can be represented in two ways; by a cell column formed from cells having additive color set colors or by a column of cell formed from -the cells that have colors from the subtractive color set. The additional reference to the cell column values will be made using the associated value _with each cell, not the color of "each cell, for example, a cell column formed from cells that have additive colors: has a cell column value .equivalent as a cell column formed from cells that have the following subtractive colors: Those two columns of cells represent the same value of the cell column because each respective cell in each of the columns of previous cells has the same value associated with it. For example, the position of cell 1 starting from the additive cell column is RED and has a corresponding value of 0 and a cell 1 position from the subtractive cell column is CIAÑ, which has a corresponding value of 0. Each cell can represent three different values 0, 1 and 2, each column represents theoretically 38 = 6561 different combinations. There are a couple of different ways to refer to the value of a cell column. A first way is by the original value of the cell column. Each unique combination of cells in a column of cells is represented by an original cell column number. The original cell column number is calculated by the following formula: §7 7 3k Cell Value (k) k = 0 In the two examples cited above, both cell columns have equivalent cell column values since ~~ each cell in each respective cell column has equivalent values. The original cell column value is calculated as follows: 3 ° (0) +31 (l) +32 (2) +33 (0) +3 (2) +35 (0) +36 (l) +37 (0) = 912 Each original value _ which represents each possible combination of cell values in a cell column forms the global set. However, not all original cell column values between 0 and 65, ~ 61 would represent a valid cell column. This is due to previously established rules where two colors of equal cells (or cell values) can not be contiguous or the color or value of the upper cells can not be of the same color or value as in the lower cell. Under these constraints, a valid cell set can be constructed, known hereinafter as the valid set. The valid set is comprised of two hundred and fifty-eight cell columns and is a subset of the global set. The valid set of cell set formed from the global set is found in APPENDIX B where each column combination valid cell is labeled or identified by its original cell column number. Because this invention uses Reed-Soloman error detection and correction, the bar code must be able to represent forty-seven different values which is the size of the Galoise Field (GF) selected in the preferred embodiment. In bar codes of the prior art, the size of the set of selected cell columns or groups is the same size as the Galois Field (GF) "of the bar code and the same cell groups used for data coding are They also use to code the verification digits.This can cause ambiguity when corrupted barcodes are decoded because, under the damage it can be difficult to determine whether the specific cell group represents a data value or check digit value. The preferred mode uses ninety-four columns of unique combinations of eight cell values.The first forty-seven cell columns represent data values and the second forty-seven cell columns represent Reed-Soloman check digit values. Cell columns that represent data values are described as data cell columns and cell columns that re present Reed-Soloman check digit values that represent digit values Reed-Soloman verification columns are described as "Reed-Soloman cell columns." The current value of each one of the ninety-four cell columns represents must be between 0 and 46 under a Galois field of forty-seven, but each set cell column can be distinguished from each other because they are now formed from unique combinations of cell values, thus eliminating any ambiguity. - Other columns of miscellaneous cells are necessary for the bar code of the present invention as well. The miscellaneous cell column column provides information about the structure of the bar code. The preferred mode uses twelve miscellaneous cell columns. Including the data value set, the Reed-Soloman value set, and the miscellaneous set, the bar code requires a total of one hundred and six combinations of single cell columns, as previously stated, each of the one hundred and six cell column combinations used in the bar code can be represented by an additive set of colors or a subtractive set of colors.The hundred and six combinations of cell column used to encode the data-set of data, the set of Reed-Soloman value and the miscellaneous set are a subset of the two hundred and fifty-eight cell columns that comprise the "valid set." These ..-. one hundred and six cell column combinations are mentioned as the active cell set and are shown in APPENDIX A. ^ T "" Each cell column Active may be subject to a "number of different types of errors. In fact, a cell column comprised of eight cells can be subjected to a total of two hundred and fifty-five different types of cell column errors as shown in APPENDIX F, where the "?" "represents an unknown cell value and an "-" represents a known cell value For each type of cell column error, a set of valid solutions can be generated, each possible solution must adhere to the rules where two of the same cell colors, or cell values do not they can be contiguous and the color or value of the upper cell can not be equal to the color or value of the lower cell of the same column, and each solution must be a member of the active set, a valid solution that conforms to this requirement The solution is called the active solution, using these three constraints, the number of possible solutions for each type of cell column error decreases.To clarify, the number of valid solutions for each type of The cell column is the same no matter which combination of cell columns are selected for the active set. Ei The number of active solutions is always less than the number of valid solutions, since the active set is less than ^ and a subset of the valid set_ and depends on the combinations of cell columns used to build the active set. One of the objects of this invention is to incorporate the double data correction capability in the bar code symbology. The ability to correct double data involves trying to correct errors in each cell column before the Reed-Soloman error correction algorithms are used to detect and correct errors. To create an effective double data correction barcode, one hundred and six cell columns are strategically selected from the active cell columns contained in the valid set, thus forming an active set of cell columns. The goal is to select a group of one hundred six cells from the valid set, where the number of active solutions available for each type of cell column error shown in APPENDIX F is minimized. This can best be demonstrated by reference to an active set of one hundred and six columns of selected cells as shown in APPENDIX A. A computer program can be written by someone with experience in the art who takes a column of active set cell in T APPENDIX A and submit each cell column to each type of cell column error listed in APPENDIX F. Such a computation program is found in APPENDIX G. The number of active valid solutions is then calculated for each type of error. APPENDIX H is a small portion of the output of such a computation program for the cell column that has an original value of eight hundred and seventy-five from the active set shown in APPENDIX A. The computer program shown in the APPENDIX F also compiles the number of active solutions for each type of cell column error in each cell column of the active set that is -analized.A summary of this information for the active set of APPENDIX A is shown in APPENDIX I **. To explain this summary in APPENDIX I: column 27 represents the original cell column number of the active set that is being analyzed, column 28 represents the cell values that comprise each cell column mentioned by _the value k, the column 29 represents the percentage of cell column error types found in APPENDIX F submitted to each respective CEID column that has only one active solution or, in "other words, they are correctable in an unambiguous way; column 30 represents the percentage of cell column error types found in APPENDIX F submitted to each respective cell column having two active solutions; and column 31 represents the percentage of the column error types ^ found in APPENDIX F submitted to each respective cell column that has three active solutions. An average of one, two and three active solution percentages is calculated for each of the cell columns in the active set and is shown on line 32 of APPENDIX I. * If you want to find the set of cell columns plus optimal for use in the active set. Because the valid set comprises two hundred and fifty-eight cell columns and the size of the active set in the preferred mode, it must be comprised of one hundred six columns of cells, the following formula describes the total number of possible active set combinations that can be be formed from the valid set: 258! 4.33 X 10244 r! (N-r)! 1061 (258-106)! Because there is an excessive number of active set combinations, it would not be practical to evaluate the "correction capacity of each cell column in each" of the combinations of possible active set- to determine the best combination of cell columns for use "for the final active set.Therefore, an algorithm It needs to be used to converge on the most optimal solution. The inventor selects to use a genetic algorithm to try to find the most optimal solution set. The genetic algorithm used to find the best group of one hundred and six cell columns for the active set can be better understood when reference is made to FIGURE 3. The genetic algorithm starts at step 3601 and advances to step 3602 where, a population of Ten active sets is recovered. These ten active sets are "known as related sets." Step 3603 randomly selects two active sets from the ten active sets created in step 3602. Step 3604 intertwines the two randomly selected "active sets" from 3603 forming a first active subordinate set and a second active subordinate set. The step 3605 determines whether the first subordinate set is more suitable with its respective relatives. If it is, the first subordinate set is stored in step 3606. If the first subordinate set does not adjust more than "its respective relatives, then it is discarded in step 3607. Step 3610 determines whether the second subordinate set is more suitable than their respective relatives. If it is, that second subordinate set is stored in step 3608. If the second subordinate set is not more suitable than its respective relatives then it is discarded in step 3609. Step 3612 then determines whether ten new subordinate sets have been stored. Otherwise, in step 3603 it is executed again to create an attempt to create more subordinate sets that are more suitable than their respective relatives. If the ten new subordinates have been stored, then the algorithm ends in step 3611. The interleaving function can be better understood when referring to FIGURE 4. Two active sets 3701 and 3702 are selected to be interleaved. The active set 3701 can also be referred to as an active set A and the active set 3702 can also be referred to as an active set B. The active sets A and B will be combined in the cross-location 3705, - thus forming two subordinate sets 3703 and 3704. The crossed location "3705 is changed randomly to provide more variety in the result created each time the algorithm in FIGURE 3 is executed.The subordinate subsets 3703 and 3704 are also known as the sets subordinates AB and BA respectively The subordinate set AB is formed by the "combination of left cell columns of interlacing point 3705 in set A with the right cell columns of crossing point 3705 in active set B. , the subordinate set BA is formed by combining the left cell columns of crossing point 3705 in the active set B with the right cell columns of the crossing point 3705 in the active set A. i The determination of whether a subordinate set is more appropriate than its relatives depends on two factors. The first factor is whether or not the subordinate set comprises a "valid set of cell columns." A cell column set is valid only if it contains cell columns found in the valid set of cell columns and if one of the cell columns is cell in the subordinate set are repeated more than once The second factor is whether or not the subordinate set has a superior marker than its relatives In the preferred embodiment, each set is assigned with a marker that is the average percentage of all the Cell column errors that can be ambiguously corrected for each cell column in the set that is being parsed.This marker is generated by an -account program in APPENDIX F and is shown in APPENDIX I in the location 33. Therefore, a higher marker indicates that, on average, each cell column comprising that active set has more correction capability than an active set with a marker comparable bottom.
The algorithm in "FIGURE 3 is repeated as many times as desired until an appropriate active set is found." The first time the algorithm is executed, ten active sets of one hundred and six cell columns are created randomly from the set valid for cell columns Each subsequent occasion that the algorithm in FIGURE 3 is repeated, the ten active parent sets loaded in step 3602 are the resulting subordinate sets as of the last execution of the algorithm. ten active sets generated by the algorithm are always more accommodating or have higher markers than the previous generation.As is known in the technique of genetic algorithms, a mutation is periodically introduced into one or more of the ten active relative sets in an attempt to create greater capacity for variation of the active relative population and, in the same way, create more adequate results. Active together generated from multiple iterations of such genetic algorithm is shown in APPENDIX A. It should be obvious that other combinations of active set can be used, which can have higher markers using those methods. At the time of the priority date, the most appropriate active set found by the inventors was the active set found in APPENDIX A.
Now that the method in the cell columns of the bar code and the respective values have been selected, the inventor forms the map of the data, Reed-Soloman, and miscellaneous values for the actual cell columns for the cell column of the set active of APPENDIX A. APPENDIX C shows the formation of column map, APPENDIX D shows the formation of Reed-Soloman cell column map and APPENDIX E shows the map formation of miscellaneous cell column. - The bar code is formed by first determining which data values need to be concatenated to modify the desired information according to the rules selected to encode the desired information or data. Next, the Reed-Soloman check digits are calculated. Finally, several miscellaneous values are determined that describe the format and error correction structure of the barcode data. All these values are correlated to values of respective cell columns (ie, "data values for data cell columns; Reed-Soloman values for Reed-Soloman cell columns; and miscellaneous values for columns of miscellaneous cells. ) using the tables found in APPENDICES C, D, and E. The cell column values are then concatenated in a sequence that uses specific rules of = the symbology. preferred, the first cell column in the sequence is a miscellaneous cell column that describes the start mode of the bar code. The data cell columns are then added to the sequence. The Reed-Soloman cell columns follow the data cell columns. The final cell column in the sequence is another miscellaneous cell column that describes the parameters for the Reed-Soloman .error correction verification digits. With reference to FIGURE 2, the column cells are placed within the search pattern starting from the left inner side 34 of the bar code search pattern. It is required that when each cell column is placed in the bar code, those cell columns alternate between the additive and subtractive color sets so that each cell color is always surrounded by a cell column of the set (ie, the cell columns are surrounded by subtractive cell columns, etc). The exception is the first and last cell columns, where the left and right sides respectively are joined by black search pattern cell. For example, the first cell column located at location 35 is selected from the additive set of _colors. The second cell column located at location 36 must be formed from the subtractive colors and the third cell column located in the Location 37 should be formed from the additive colors, etc. The last cell column placed at location 38 within the search pattern should always be from the subtractive set of colors. "* r A completed barcode symbology has now been formed with resistance for individual or combined effects of: magnification distortions, perspective distortions, cut distortions and wave distortions, both of the uniform and non-uniform type traversing the axis This can be best demonstrated by describing the barcode symbology decoding methods.Referring to FIGURE 2, the search pattern is the first one located in the field of view of the scanning device. This process requires a two-dimensional barcode scan or a linear barcode scanner that is capable of storing the two-dimensional bitmap image for decoding, then finding the upper cell of the first column is required. of decoding cell.This can be done by placing _ the solid vertical line of the pattern of search to 15 in a "iado 16 of the barcode, and the horizontal bar superior_ü3 of the search pattern. The point of intersection of the pattern components of search * circles the upper left corner of the upper cell of the first cell column 38. Before the actual decoding process is initiated, it is desirable to find the center of the upper cell of the first cell column. Because the upper left corner has been identified, it is a "simple matter to first scan to the right and to the bottom of the bar code to the upper right side, the lower right side and the corners of the lower left side that are located produce the size and general shape of the upper cell.The center point of the upper cell is approximated using this information.The center of the upper cell of the first cell column 38 is used as the starting point for the decoding algorithm shown in FIGURE 5. In fact, the starting point to decode all cell columns using the algorithm in FIGURE 5 is always the center point of the upper cell of the specific cell column that is being decoded. The decoding illustrated in FIGURE 5 will now be described: A visual representation of how this decoding algorithm works should be done in a FIGURE 7 illustrating a moderately distorted bar code symbology of the type described in the present invention. He The objective of the decoding algorithm in FIGURE 5 is to scan along each column of cells that all eight cells in the cell column have been traversed and decoded. Line 39, illustrates a path that the scanning algorithm of FIGURE 5 could incur. The decoding algorithm of FIGURE 5 begins with step 38017 ~ Step 3802 executed below, where the initial data values and 'parameters are initialized. The variable i is a cell counter and represents the number of cells traversed in the current cell column. The variable j represents the number of cell columns that would have been decoded and the current value of j always represents the current cell column to which the decoding algorithm is subjected. Step 3802 initializes the scan angle to 180 degrees. Scan angles are only measured in degrees where a scan angle of 0- or 360 degrees indicates a scan direction toward the top of the barcode. Step 3803 is executed next, where the current scan position is placed in the center of the lower cell of the current cell column that is decoded using the procedure described above. The color of the cell is determined and stored in step 3804. Step 3805 then advances the scanning exposure ~~ to the next cell immediately over the cell, current using the current scan angle. Step 3806. observes the color transition, with no color transition, then the scan continues in step 3805 using the current scan angle along the same path. When step 3806 detects a color transition, step 3807 is executed, which determines whether the color of the newly penetrated cell is derived from the same color set as the cell from which it recently left. If this is not the case, "then there is an indication that the newly penetrated cell is a member of an adjacent cell column or search pattern, and then stage 3808 r locates the position of" exploration to the point immediately preceding the last point. of the color transition and the new scan angle is "" selected in step 3809. The new scan angle selected must be selected to avoid scanning the reverse direction. If the color of the newly-penetrated cell in step 3807 is derived from the same color set as the cell from which it has just emerged, then there is an indication that the newly penetrated cell is a member of the same column of cell. In this case, step 3810 is executed by storing the color of the newly penetrated cell. Step 3811 increases i to keep track of how many cells have been traversed in the cell column current. Step 3812 determines whether the eight cells in the cell column have been decoded. Otherwise, then step 3805 is -reached to continue scanning of additional cells. If all eight cells have been traversed, then step 3813 is executed, which restores cell counter i and increments cell column counter j. Step 3814 checks to see if all cell columns have been scanned. Otherwise, step 3803 is "re-started" which initiates a new scan in the upper cell of the next cell column If step 3814 determines that all cell columns have been scanned, then the decoding algorithm ends in step 3815. Under cases of damage to the bar code symbology, the scanning algorithm may not be able to traverse the full length of each cell column.In this case, the data captured using the scanning algorithm of FIGURE 5 I is saved "and the scanning algorithm shown in FIGURE 6 is used to try to capture the remaining cells of the column of cells being scanned. This scanning algorithm is similar to the scanning algorithm shown in FIGURE 5, "except that the scan is initiated from the lower cell of each cell column from the upper cell, typically the second scanning algorithm in FIGURE 5. to 6 is "only used if the first scan algorithm shown in FIGURE 5 can not be completed successfully." Because the second scan algorithm needs to start in the lower cell of the cell column that is to be scanned, it is The lower cell needs to be located This can be done by scanning along the lower row of the bar code and counting the transitions until the desired cell column is located The operation of the decoding algorithm illustrated in FIQURE 6 will now be described. A visual representation of how this decoding algorithm works should be done in reference to FIGURE 7 which illustrates a moderately distorted bar code symbology of the type described in the present invention.The objective of the decoding algorithm in FIGURE 6 is explored as length of each cell column until all eight cells in the cell column have been traversed and decoded. Line 40 illustrates the trajectory over which the scanning algorithm of FIGURE 6 can be presented. The decoding algorithm of FIGURE 6 starts with step 3901. Step 3902 is executed when the initial data values and parameters are initialized. The variable i is a cell counter that represents the number of cells traversed in the column of current cell. The variable j represents the number of cell columns that have been decoded and the current value of j always represents the current cell column when the decoding algorithm is submitted. In this scanning algorithm, i is set to seven so that the lower cell of the cell column is scanned first and the scan angle is set at 0 degrees so that the scanning direction generally proceeds to the solid horizontal line of contiguous black cells 13. Step 3903 is then executed when the current scan position is placed in the center of the upper cell of the current cell column which is decoded using the previously described procedure. The color of that cell is determined and stored in step 3904. Step 3905 then proceeds to the scanning position to the next, immediately below the current cell using the current scan angle along path 40. The stage 3906 then observes a color transition, in case there is no color transition, then the scan continues at "step 3905 using the current scan angle along the same path." When step 3906 detects a transition stage of color, step 3907 is executed, which determines whether the color of the newly penetrated cell is derived from the same color set as the cell from which it has just get out. Otherwise, then this is an indication that the newly penetrated cell is a member of an adjacent cell column or search pattern. Step 3908 then relocates the scan position to aim immediately before the last color transition point and the new scan angle is selected in step 3909. The new scan angle selected must be close to the previous scan angle to avoid the exploration in the reverse direction. If the color of the newly penetrated cell in step 3907 is derived from the identical color set as that of the cell that has just come out, then this is an "indication that the newly penetrated cell is a member of the cell. same cell column In this case, step 3910 is executed by storing the color of the newly penetrated cell Step 3911 decreases and to keep track of how many cells have been traversed in the current cell column. Step 3912 determines whether the eight cells in the cell column have been decoded. Otherwise, then step 3905 is "reworked to continue scanning of additional cells." If all eight cells have been "traversed," then step 3913 is executed which restores the cell counter ie increments the cell column counter j. Step 3914 checks to see if all cell columns have been scanned. In case otherwise, step 3903 is reacted which starts a new scan in the lower cell of the next column of. cell. If step 3914 determines that all cell columns have been scanned - then the decoding algorithm ends at step 3915. Due to the structure of the bar code, the bar code can be decoded using the two previous decoding algorithms, and similarly it is resistant to all types of distortions described in this description for the following reasons: (1) Because the bar code is based on the transition, the length of each cell in each cell column is not critical . The decoding algorithm shown in FIGURE 5 will successfully decode a cell of any length in a cell column by staying in steps 3805 and 3806 until a color transition is detected. Therefore, any distortions that cause any cell height to change in a variable manner will not render the system untouchable. Barcode. (2) When the decoding algorithm scans each cell column, each color transition within the same color set serves as a clock tracker or indication that a new cell has been entered. Because each cell is always surrounded by a cell of a different color, a plethora of inherent clock trackers are formed within the code of bars. In virtually any type of distortion, the clock trackers serve as indicators of how the bar code is distorted across the width and height of the bar code. This is an advantage under non-uniform distortions when the distortion is not evenly distributed through the bar code symbology. (3) Finally, because each cell column is surrounded by a cell column formed from the cells of the opposite color system, each cell column is linked by a form of indices indicating that the decoding algorithm has passed through an adjacent cell column. Due to these indications, the decoding algorithm shown in FIGS. 5 or 6 is able to accurately track along each cell column under extreme amounts of uniform and non-uniform distortions of wave, cut, enlargement and perspective. The next stage in the decoding process involves decoding the colors of the cells of each cell column in their respective data, Reed-Soloman, and miscellaneous values. As each cell in each cell column is decoded through scanning algorithms, the corresponding value of the color of each cell is stored in an eight element array. The layout is then covered in an original value, using the following formula: ? 3k Cell Value (k) k = 0 where k is the position within the arrangement and Cell Value (k) represents the value of a cell placed in the disposition position k. The original value "is then correlated, through a search table, to a data value, a Reed-Soloman value or a miscellaneous value, in the event that any of the elements in the eight element arrangement are unknown _ As a result of damage in the cell column, a determination of the cell column j / al can be made even without restoring the Reed-Soloman verification digits.This is the first step in the correction of double data.This is done by substituting each cnation of cell value available in the "unknown element positions in the arrangement of eight elements until one or more active solutions are found. For example, the following eight-element arrangement is filled with cell value data extracted from a yield column, except that the first or higher of the cells (cell position k = 7) of the cell column can not be determine.
The position of cell 9 can only take "three possible values 0, 1 or 2. Substituting each of these three possible values in the position of unknown cell 0 produces the following three possibilities of cell column: Original Value of the Column of Cells = 873 _ The first probability that has an original value of .column of cell 873 is __a cnation of invalid cell column due to contiguous cell positions 0 and 1 that both contain a cell value of 0. The second possibility that has an original value The cell column of 874 is a valid cell column although it is not part of the active conjunct found in APPENDIX A, so it is not an active solution.
The original value of a cell column of 875 is a member of the active set in APPENDIX A and is the only possible active solution. In this case, the damaged cell column can be corrected immediately. Because the active set in APPENDIX A has been optimally selected using genetic algorithms, the number of active possibilities, in the case of damage, for all cell columns in the active set has been reduced to a minimum. In the case when more than one active solution is possible or when a cell column is missing or severely damaged, the cell column can be treated as a deletion and corrected using the Reed-Soloman correction algorithms. After each column has been decoded successfully, the desired information encoded in the barcode is extracted using the symbology data coding rules. When decoding symbologies that have had substantial environmental exposure, fading may occur that can make them difficult to decode as a result of the bar code cells changing in contrast, brightness and color. The present invention attempts to eliminate this problem by strategically placing the color cells that inform the scanning apparatus what the thresholds of contrast, brightness and color are at the different points of the bar code. Those color cells they are incorporated within the miscellaneous cell column values shown in the-APPENDIX E. Each of these miscellaneous columns has the last three cells (k = 5, 6, 7) which are 0, 1 and 2 respectively. Because the miscellaneous cell column is always placed at the beginning and end of the symbology in the preferred mode, a cell value of 0, 1 and 2 is always present in cells 41, 42 and 43, respectively at the beginning of the symbology and cells 44, 45 and 46 at the end of the symbology, see FIGURE 8. Because the first cell column at the beginning of the symbology is composed of cells of the additive set, cell 44 is always BLUE, the cell 45 is always GREEN and cell 46 is always RED. Similarly, because the last cell column at the end of the symbology is made up of cells in the subtractive set, cell 47 is always YELLOW, cell 48 is always MAGENTA, and cell 48 is always color CYAN . Because cells 41, 42, "43, 44, 45, and 46 are all at right angles, the bar code search pattern, are easily found by the-decoding algorithm before the decoding of each column begins As a preferred embodiment of the present invention was shown and described, it is considered that those skilled in the art can design several modifications of the present invention without departing from the spirit and scope of the appended claims.
ACTIVE ASSEMBLY ACTIVE ASSEMBLY ROW NUMBER COMBINATION OF CELDA COLUMN ROW NUMBER COMBINATION OF COLUMN Value k - > 01234567 DE CELDA Value k - > 01234567 369 2.1.0.2.1.0.1.0 2721 0.1.i.1.02.0,1 375 2.0.12.1.0.1.0 2733 2.0.1.2.02.0,1 902 2.0,1,0,2,0,1.0 2769 02.1,0.12.0,1 90. 7 1.2.1.0-2.0.1.0 2777 2.12.0.12.0.1 914 2.1.2.02.0.1.0 2H13 2.1.02.1 .0.1 923 2.1.0.1.2.0.1.0 2314 02.02.12.0,1 933 2.0-2.1.2.0,1.0 2319 2.0,12.1, 0.1 1247 2.1.0.1.0-1.1.0 3741 02.1.0.1.02.1 12 * 9 12.0.1.0.2.1,0 3746 2.0 • '.0.1.02.1 1265 2.1.2.1.02.1.0 3747 0.12.0.1,02.1 1230 2.0.1.2.0.2. L.O 3791 2.0.12.1,0,2.1 1235 1 .12.02.1.0 3795 0.2.12,1.02.1 1307 2.0.1,0,12,1.0 3313 2.0,1,02.0,2.1 1312 1.2.1.0.12.1.0 S22 0.2.1.02,02.1 1315 1.0.2.0.12.1.0 3S3-9 2.1.0.1,2,0.2.1 1319 2.12.0.12.1.0 3340 0.2.0.1.2,02,1 t357 12.02.12.1.0 3354 2.02,12.02.1 1555 12.1.0.1,02.0 3S55 0.12.12.02,1 1553 1.0.2.0.1.02.0 3921 0.2.0.1.0.12.1- 1562 2.12.0.1,02.0 3935 2.02.1.0.12.1 1600 1.2.02.1.02.0 3936 0.12.1.0.1,2.1 1603 l.ü.1 .1.0.2.0 39¿5 0.1.0.2.0.1.2.1 1666 1.02.1.2.02.0 3957 02.1.2.0.12.1 1735 12.0.1.0.12,0 4071 ü.l -O-! 1 47 1.0.2.1.0.12.0 4663 1.02.1.0.1,02 I75t 2.12.1.0.1 .0 4674 0.1.02.0.1.02 1760 2.1.0.2.0.12.0 467S 12.0.2.0.1.0.2 1765 1.0.12.0.12.0 4631 1.0.12.0.1.02 1374 2.0.1.02.1.2.0 4636 02.12.0.1.02 1379 12.1.02.12.0 4739 1.0.1.02.1.02 1332 1.0.2.02.12.0 4795 12.1.02.1.02 I.SS6 2.12.0.2.12.0 479S 1.02.02.1.0.2 1895 2.1.0.12.12.0 4300 0.12.02.1.02 2439 2.1.02.0.1.0.1 4S09 0.1.0.1 .1.02 2495 2.0.12.0.1.0.1 4394 12.0.1.02.02 2S03 2.0.1.02.1.0.1 4906 1.0.2.1.02: 02 2607 02.1.02.1.0.1 4957 12.1.0,12.02 261 2.12.02.1.0.1 4960 1.02.0.12.02 2624 2.1.0.12.1.0.1 4962 0.12.0.12.02 2625 02.0.12.1.0,1 499S 0.1.02.12.02 2639 2.02.12.1.0.1 5002 12.02.12.02 2705 2.1.0.1.02.0.1 J005 1.0.12.12.02 2706 02.0.1.02.0.1 5203 1.02.0,1.0.12 2720 2.02.1.02.0.1 5205 0.12.0.1.0.12 5241 0.1.0.2.1.0.12 5245 12.02.1.0.12 5243 l.'0.12.1.0.12 5253 02.12.1.0.12 5275 1.0.1.02.0.12 5230 02.1. 02.0.12 529S 02.0.12.0.1.2 APPENDIX A 5299 1.2.0.1.2.0,1,2 53 ti 1.0,2,12.0,1,2 5313 0.1.2.1-2.0,1.2 5622 0.2,0,1,0,2,1,2 5635 1.0, 2,1,0,2,1,2 5637 0.1,2,1,0,2.1,2 5646 0.1,0,2,0,2,1,2 5653 1,0,1,2,0,2, 1.2 5658 0.2.1 ^ .0.2.1.2 5685 0.2.1.0.1.2.1.2 569 and 0.1.2.0.1.2.1.2 APPENDIX A VALID ASSEMBLY SET VALID ROW NUMBER COMBINATION OF CELL PHONE COLUMN COMBINATION Value k - > 01234567 CELL ROW NUMBER Value k - > 01234567 820 t.O.1.0.1.0.1.0 321 2.0.1.0.1.0.1.0 1550 2.0.1.0.1,02.0 326 12.1.0.1.0.1.0 1555 12.1.0.1.02.0 329 1.02.0.1.0.1.0 1553 1.02.0.1,02.0 330 2.02.0.1.0.1.0 1559 2.02.0.1.02.0 IS33 2.12.0,1.0.1.0 1562 2.12.0.1.02.0 369 2.1.02.1.0.1.0 1598 2.1.02.1.02.0 571 12.02.1.0.1.0 1600 12.02.1.02.0 374 1.0.12,1.0,1,0 1603 1.0.12.1.02.0 875 2.0,12.1.0.1.0 1604 2.0.12.1,02.0 330 12.12.1.0,1,0 1609 12.12.1,02.0"901 1.0.1.02.0.1.0 1630 1.0.1.02.02.0 902 2.0.1.02.0,1.0 1631 2.0.1.02.02.0 907 12.1.02,0,1,0 1636 12.1.02.02.0 910 1.02.02.0.1.0 1639 1.02.02.02.0 911 2.02.0,2.0.1.0 1640 2.02.02.02.0 914 2.12.02.0.1.0 1643 2.12.02.02.0 923 2.1.0.1, 0.1.0 1652 2.1.0.12.02.0 925 1 .0.12.0.1.0 1654 12.0.12.02.0 937. 1666 1.02.12.02.0 933 2.02.12.0.1.0 1667 2.02.12.02.0 94 (2.1 .12.0.1.0 1670 2.12.12.0.2.0 124 2.1.0.1.02.1.0 1733 2.1.0.1.0.12.0 1249 1.2.0.1.02.1.0 1735 12.0.1.0.12.0 1261 i.o "> .t.a i.i.o 1747 1.02.1.0.12.0 1262 2.02.1.02.1.0 1743 2.02.1.0.12.0 1255 2.12.1.0.2.1.0 1751 ..12.1.0.12.0 * I274 2.1.02.0.2. i, to 1760 ¿.1.0.2.0.12.0 1276 12.02.0.2.1.0 1762 1.2.02.0.12.0 1279 1.0.12.02.1,0 1765 1.0.12.0.12.0 12S0 2.0.12.02.1.0 176o 2.0.1 .0.12,0 123J 12.12,02.1.0 1771 1 .1 .0.1-1.0"1306 1.0.1.0,12.1,0 1373 1.0.1.02.12.0 1307 2.0.1.0.12.1.0 137-i 2.0.1.02.12.0 1312 I2.I.G.12.1.0 1379 12.1.02.12.0 13 U 1.02.0.1 '. [.O 1332 1.02.0.2.12.0 1316 2.02.0.12.1.0! SS3 2.02.02.12.0 Í3I9 2.12.0,12.1.0 1336 2.12.02. i.2.0 1355 2.1.02.12.1.0 1395 2.1.0.12.12.0 1357 12.02.12.1.0 1397 12.0.12.12.0 1360 I.Q.I2.12.I.0 1909 1.02.12.12.0 1361 2.0,12.12.1.0 1910 2.02.12.12.0 fj6? 12.12.12.1.0 1913 2.12.12.12.0 Í549 1.0.1.0.1.02.0 2460 0.1.0.1.0,1.0.1 2462 2.1.0.1.0.1.0.1 2463 02.0.1.0.1.0.1 70.77 2.02.1.0.1.0.1 2473 0.12.1.0-1.0.1 2480 2.12.1.0.1.0.1 2437 0.1.02.0.1.0.1 2439 2.1.02.0.1.0.1 02.02-0.1.0.1 2490 APPENDIX B 3340 02.0.1, .0.02. 2495 2.0.1.2.0.1,0, 3854 2.02.1. 2.02 2499 0.2.12.0.1.0, 3355 0.1.2.!.: .0.2. 2603 2.0.1,02.1,0. 3357 2.1 .1 .: 2607 .0.2. 02.1.0.2.1,0, 3913 0.1,0,1 .0,12,1 2612 2.02.02.1.0, 3920 2.1.0.1.0.12. 2613 0.12.02.1,0, 3921 02.0,1.0,1,2,1 2615 2.12.0.2.1.0, 3935 2.02.1.0,1,2,1 2622 0.1.0.12.1.0. 3936 0.12,1,0,1,2, 2624 2.1.0.1.2.1.0, 3938 2.1,2,1,0,1,2,1 2625 02.0.12.1.0, 3945 0.1.0.2.0.1.2.1 2639 2.02,12,1,0, 3947 2.1.0,20,1.2, 2640 0,1,2,1,2,1,0, 3948 0.2.02.0,1,2. 2642 2.1.2, 12.1.0, 3953 2.0,120.12. 2703 0.1.0.1,0,2,0, 3957 0.2.120,1.2, 2705 2.1,0,1.0,2,0, 4061 2.0.1,02,1,2. 2706 02.0.1.02.0. 4065 02.1.0,2.1.2, 2720 2.02.1.02.0. 4070 2.0.2.02.1.2. 272! 0.12.1.02.0, 4071 0.1.2.0.2,1,2,1 2723 2.1 .1.02,0, 4073 2.12,0.2,1,2, 2730 0.1.0.2.02.0, 4080 0.1.0,12.1,2,1 2732 2.1.0.2.0.2.0, 40S2 2. I, 0.12,12. 2733 02.02.02.0. 4033 0.2.0.12,1,2, 2733 2.0.1.2.02.0, 4097 2.02.12.12. 2742 02.12.02.0, 4098 0.12.12.1.2. 2765 2.0.1.0.12.0, 4100 2.1.2.12.12. 2769 02.1.0.1,2.0, 4647 0.1.0.1.0,1.0.2 2774 2.02.0.1,2,0, 4650 0.2,0,1.0,!. 0.2 2775 0.12.0.12.0, 4651 1.2.0.1.0,1.0.2 2777 2.1.2.0.1,2.0. 4663 1.0,2,1.0,1.0.2 2SII 0.1.02.12.0, 4665 0.1.2.1,, 0.1.0.2 2SI3 2.1.02.1.2.0. 4674 0.1.02, .0.1.02 28"14 02.02.12.0, 4677 0.2.0.2, .0.1.0.2 2319 2.0,1,2,1,2.0. 4678! 2.0.2., 0.1.0.2 2323 0.2.12,12.0, 4681 1.0,1,2,, 0,1,0,2 3737 2.0,1.0,1,02. 4636 0.2,1.2.0.1,0,2 3741 02,1.0,1,02, 4687 12.1.2.0,1.0.2 3746 2.02.0,12, 4739 1.0.1.0,2.1.0.2 3747 0.1.2.0,!, 0.2, 4794 0.2.1.02.1.0,2 3749 2.1 .0,1,0,2, 4795 1.2.1.0,2.1.02 3733 0.1.02,1.02. 4798 1.0.2-0.2.1.0.2 3735 2.1.02,1.02. 4300 0.12.0, .2.1.02 3736 02.0.2.1.02. 4309 0.1.0.12.1,02 3791 2.0.1.2.1,02. 4812 02.0.12,1,0.2 3795 02.12.1.02. 4313 12.0,12.1.0,2 3313 2.0,1,02.0.2. 4325 1.0.2.1, 2.1.02 3322 02.1.02.02. 4327 0.12.12.1.02 3327 2.02.02.02. 4390 0.1.0.1.02,02 3823 0.12.02.02, 4393 0.2.0.1.02.02 3S30 2.! 2.0.2.02. 4394 12.0.1.02.02 3837 0.1.0.12.02, 4906 1.02.1.02.02 3339 2.1.0.12.02. APPENDIX B 4908 0.12.1.02.02 5685 0.2.1.0.1.2.12 4917 0.1.02.02.0.2 5636 12.1.0.1,2.12 4920 02.0,2.02.02 5689 1.02.0,12,1,2"49 1 12.02.02.0.2 56 1 0.12.0.12.12 4924 1.0,1.2.0,2,0,2 5727 0.1.0,2.12,12 4929 02.12.02,0,2 5730 0.2,02.1,2,1,2 4930 1.2.12.02,02 5731 12.0.2,1.2.12 4951 1.0.1.0.1.2.02 5734 1.0,1.2.1,2,1,2 4956 02.1,0.1,2.02 5739 0.2.12.12.12 4957 12.1.0.1, 0.2 5740 1.2.1.217,1,2 4960 1.0,2,0,12,0,2 4962 0.12,0,12,02 4998 0,1,0,2.12,0,2 .5001 0,2,0,2,1,2.02 5002 1, 2.02.12.02 5005 1.0,12.1,2,0,2 5010 0.2.12.12.02 5011 12.1,2,1,2,0,2 5194 1.0,1,0,1,0,12 5199 02, 1.0.1,0,12 5200 1.2.1.0.1, 5203 1.02.0. 5205 0.12.0.1,1 5241 0.1.02.1. 5244 02.02.1. 5245 12.02. 5243 1.0.1.2.1,0.12 5253 02.12.1.0.12 5254 12.12.1.0.12 5275 1.0.1.02.0.12 5230 02.1.02,0.12 5281 12.1.02.0.12 5234 1.02.02.0.12 5236 0.12 -02,0.12 5295 0.1.0.12,0.12 529S 0.2.0.12.0.12 5299 1.2.0.12.0.1.2 531! 1.02.12,0.12 5313 0.12.12.0.12 5619 0.1.0.1.02,1.2 56X2 02.0,1.02,12 5623 12.0.1.02.12 5635 1,02,1.0.2,1,2 5637 0,12,1,02, 12 5646 0.1.02.02.12 5649 0.2.02.02.12 5650 12.02.02.12 5653 1.0.12.02.12 5658 02.12.02.12 5659 12.12.02.12 5630 1.0.1.0.12.12 APPENDIX B ACTIVE ASSEMBLY DATA VALUE NUMBER COMBINATION OF NUMBER COMBINATION OF VALUE OF VALUE OF FILA CELDA COLUMN CELL DATA COLUMN DATA OF FILA APPENDIX C ACTIVE ASSEMBLY VALUES REED SOLOMAN NATION OF VALUES REED NUMBER COMBI NUME RO CO REINFORCEMENT OF VALUES REED SOLOMAN CELDA SOLAR FILA COLUMN SOLOMAN CELDA COLUMN Valork - > 01234567 Valork - > 01234567 4962 0.12.0.12.02 35 2777 2.12.0.12.0.1 0 4993 0.1.02.12.02 36 2St3 2.1.02.12.0.1 1 7 5002 12.02.12.0"'37 2314 02.0,2.12.0.1 5005 JS 2319 2.0,12.12.0.1 3 4 5622 02.0,1.02.12 39 3741 02.1.0,1.02.1 376 5635 1,02,1.02.12 40 2.0,2,0.1.02.1 5 5637 0,1,2.1.02,12 4 | 3747 0.12,0.1.0.2.1 6 5646 0.1.02.02.12 n 3791"" 2.0,12.1.02.1 7 5653 1,0,12.02.12 43 3795 02.1 .1.02.1 3 9 5653 02.12.02.12 -4. 3313 2.0.1.02.02.1 5635 02.1.0.12.12 Í 322 0.2.1.02.02.1 10 56 1 0.12.0.12.12 46 3339 2.1.0,1,2.02.1 11 3340 02.0.12.02.1 12 3354 2.0"U" '.0"'. L 15 14 3355 0.12.12.02.1 15 3921 02.0.1.0.12.1 3935 2.0.2.1. 0.12.1 l? 3936 0.1.2.1.0.12.1 17 3945 0.1.02.0.12.1 13 3957 0.2.12.0.1 i.l 19 407! 0.12.02.12.1 20 4663 l.02.1.0.1.01 21 4S74 0.1.02.0.1.02 2"3 4673 1 .Q2.0.1.0.2 23 4631 1.0.12.0.1.02 24 4686 02.12.0.1.02 25 4739 1.0,1.02.1.02 26 4795 12.1.02.1.02 27 4793 1.02.02.1.02 23 4300 0.12.02.1.02 29 4S09 0.1.0,12.1.02 30 4S94 12.0.1.02.02 51 4906 l.02. t.02.C "'32 4957 12.1.0.12.1 33 34 4960 1.02.0.12.1 APPENDIX D ACTIVE ASSEMBLY MISCELLANEOUS VALUES NUMBER COMBINATION OF VALUES MISCELLANEOUS CELDA COLUMN FROM FILA Valork - > 01234567 5203 1,0,2,0,1,0,1.2 0 5205 0,1,2,0,1,0,12 l 524! 0,1,0,2,1,0,12 2 5245 1,2,0,2,1,0,1,2 3 524S 1,0,1,2,1,0,1,2 4 5253 0 , 2,1,2,1,0,1,2 5 5275 -1,0,1,02.0.12 6 52S0 0.2,1,0,2,0,1,2 7 5293 0.2,0 , 1.2.0.1.2 3 5299 1.2.0.1.2.0.1.2 9 5311 l, 0.2, L2.0, t, 2 10 5313 0.1.2.1.2.0.1.2 11 APPENDIX E TYPES OF ERROR NUMBER OF NUMBER DESCRIPTION DESCRIPTION ERROR ERROR ERROR ERROR 1 55 777-- 2 57 7 - ??? - 3 53 _7_777__ 4 __7 59 7 - 7 60 - 7777__ 6. 61 7 - 777 or - 7 62 -.77777 8 63 777777 - 9 7 - 7 64 10 -7-7 65 11 77-7 66 -7 7_ 12 - 77 67 77 _ 13 7 - 27 68 - 7 7_ 14 -. 14 - ??? 69 7 - 7 T- 15 -7777 - -._ 70 - 77 7 - 16 71 777 7_ 17 72. "7 - 7- a _7 - 7 73 7 7_ 19 77 74 _7_7 7_ __7_7 75 7-7 7_ 21 7- 7-? 76 77 _ 22 _77-7 77 7-77 -3- 23 77.7 -.7 78 -777 7- 24 77___ 79 7 77 -3 _ 7 77 80 7-7- 26 -7-7? 81 7 7-7- 27 77 - 77 82 _7 - -7 - 34 _7 7 - 89 • 3 - 77 -7 - 35 77? - 90 -7-77-7- 36 91 77-77-7-37 _7 - 92 777_7_ 38 - 77 - 7 - 93 7-777-7- 39 ??? -? - 94 -7777-7- 40 -.__ 7_7_- 95 77777-7- 4L 7 - 7 - 7 - 96 77- 42 -? -? -? - 97 7 - 43 7? - 7-? - - 98 - or 77 - 44 77_7__ 99 77 77- 45 7 - ?? -? - 100 - - 3 7 * 3 - 46 -. 46 - ??? - "? - 101 7-7 ?? - 47 7777-7 - 102 - 77 77- 48 77 103 777 - 77 - 49 7 77 - 104 7-77- 50 _7 77 - 105 7? - ? 7 - 51 77 77 - 106 - - - 7-7 - 52 7-7? - 107 77-7-77- 53 7-7-77 - 10? _- 77-77- 54 - ?? - ?? - 109 7-77-77- 55 777-77-- 110 - • 377 - 77 - 111 7777-77- APPENDIX F 112 1 P Oi-iri M ri H fí r UL LU I I I o o LU < // mamxpp #include < stdio.h > #include < math.h > #include "def.h" #clude "global.h" #include "Element.h" #include "Pixel_colu n.h" #include "Utilities.h" void ain (void) { UWORD i, j; UWORD temp, attempt; FILE * stream; ACTrVE_PC_STRUCT the_actual_stats; strearn = fopen ("text.out", "w"); strea l = fopen ("dump.out", ""); streaml_fiag = FALSE; Utilities utiIity_object; utility_object.create_global_set (); utility_object.print_global_set (stream); utility_object.create_valid_set (); utility_object.print_valid_set (stream); utility_obj ect.create_active_set (); _ utility_object.print_active_set (stream); Pixel__column te; for (attempt = 0; attempt < l; attempt-H-). { utility_object.create__active_set (); printf ("\ r \ nATTEMPT #% u", attempt); for (i = 0; i <ACpVE_SET_SIZE; i ++). { trials [0] .active_set [i] .ra _n m = 0; trials [0] .active_set [i] .sipgle_bit_solutions = (float) 0; trials [0] .active_set [i] .double_bit_solutions = (float) 0; trials [0] .active_set [i] .triple_bit_solutions = (float) 0; trials [0] .active_set [i] .tri? leplus_bit__solutions = (float) 0; } trials [0] .single_bit_solutions_avg = (fioat) 0; trials [0] .double_bit_solutions_avg = (float) 0; APPENDIX G trials [0] .triple_bit_solutiops_avg = (float) 0; trials [0] .tripleplus_bit_solutions_avg = (float) 0; trials [0] .single_bit_solutions_std_dev = (float) 0; ttials [0] .double_bit_solutions_std_dev = (float) 0; triaIs [0] .triple_bit_solutions_std_dev = (float) 0; rrials [0] .tripleplus_bit_soluti f? s_std_dev = (float) 0; for (i = 0; i <ACTTVE_SET_SIZE; i ++). { tc.set_raw_value (active_set [i] .get_raw_valueO); tea. generate_stats (); tc.get_actual_stats (& the_actual_stats); trials [0], active_set [i], raw_num = tc.get_raw_value (); trials [0] .active_set [i] .single_bit_solutions = (float) ((float) (£ he_acrual_stats.singIe_bit_solutiops * (float) 100) / (float) (pow (2, HEIGHT) - D); tri is [0] .active_set [i]. double_bit_solutions = (float) ((float) (the_actual_stats.double_bit_solutiops * (float) 100) / (float) (pow (2, HEIGHT) -i)); trials [0] .active_set [i] .triple_bit_solutions = (ñoat) ((float) (& e_actual_stats.tripIej3Ít_solutiorLS * (float) 100) / (float) (pow (2, HEIGHT) -)); triais [0] .active_set [i] .trip lep lus_bit_solutions = (float) ((float) (the_actual_stats.tripleplus_bit_solutions * (float) 100) / (float) (pow (2, HEI GHT) -1)); } // calculate average and std_dev information for (i = 0; i < ACTrVE_SET_SÍZE; i ++). { tri is [0]. sipgle_bit_so lutions_avg + = trials [0] .active_set [i] .single_bit_solutions; trials [0] .double_bit_solutions_avg + = trials [0] .active_set [i] .double_bit_solutions; trials [0] .triple_bit_solutions_avg +: trials [0] .active_set [i] .tri? le_bit_solutiops; trials [0] .tripleplus_bit_solutions_avg + = trials [0] .active_set [i] .tripleplus_bit_solutions; } trials [0] .sipgle_bit_solutions_avg / = (float) ACTTVE_SET_SIZE; trials [0] .double_bit_solutions_avg / = (float) ACTTVE_SET_SIZE; ttials [0] -triple_bit_solutions_avg / = (float) ACTrV? _SET_SIZE; trials [0] .tripleplus_bit_solutioñs_avg / = (float) ACTrv? _SET_SIZE; for (i = 0; i <ACTTV? _SET_SIZE; i ++). { tríals [0] .single_bit_solutions_std_dev + = (fioat) pow ( APPENDIX G (trials [0] .active_set [i] .single_bit_solutions - trials [0] .single_bit_solutions_avg), 2); trials [0] .double_bit_solutions_std_dev + = (float) pow ((trials [0] .active_set [i] .double_bit_solutions - trials [0] .double_bit_solutions_avg), 2); trials [0] .triple_bit_solutiops_std_dev + = (fioat) pow ((trials [0] .active_set [i] .triple_bit_solutions - trials [0] .tripIe_bit_solutions_avg), 2); trials [0] .triple? lus_bit.solutions_std_dev + = (float) pow ((triaIs [0] .active_set [i] .tripleplus_bit_solutions- tri ls [0] .tripleplus_bit_solutions_avg), 2); } triaIs [0] .smgle_bit_solutiops_std_dev / = ((float) ACTTV? _SET_SIZE -1); trials [0] .single_bit_solutions_std_dev = (float) sqrt (trials [0] .single_bit_soIutions_std_dev); tri s [0] .doublej3Ít_solutío ?? s_std_dev / = ((float) ACTTv? _SET_SIZE-l); trials [0] .double_bit_solutions_std_dev = (float) sqrt (rials [0] .doubIe_bit_solutions_std_dev); trials [0] .triple_bit_solurions_std_dev / = ((float) ACTrV? _SET_SIZE -1); trials [0] .triplt_bit_solutions_std_dev = (float) sqrt (trials [0] .triple_bit_solutions_std_dev); trials [0] .tripleplus_bit_soiutions_std_dev / = ((fioat) ACTrV? _SET_SIZE trials [0] .tripleplus_bit_solutions_std_dev = (float) sqrt (rrials [0] .tripleplus_bit_solutions_std_dev); // compare and save to the storage area if better if (trials [0] .single_bit_solutions_avg &rtials [l] .single_bit_solutiops_avg ). { // this one is better so save it in area # 1 fprmtf (stream, "\ r \ nATTEMPT #% u \ r \ n", attempt); printf ("\ r \ nBest Attempt So Far #% u", attempt); for (i = 0; i < ACTrV? _SET_SLZE; i ++). { triais [l] .active_set [i]. raw_num tpals [0] .active_set [i] .raw_num; tc.set_raw_value (trials [l] .active_set [i] .ra _num); triaIs [l] .active_set [i] .single_bit_solutions trials [0] .active_set [i] .sipgle_bit_solutions; trials [l] .active_set [i] .double_bit_solutions trials [0] .active_set [i] .double_bit_solutiops; trials [l] .active_set [i] .triple_bit_solutions trials [0] .active_set [i] .triple_bit_solutions; trials [l] .active_set [i] .tripleplus_bit_solutions triaís [0] .active_set [i] .tri? le? lus_bit_solutions; APPENDIX G tc.fbrint_pixel_column (stream); fprintf (stream, "\ t% .2 t% .2f \ t% .2 t% .2f \ r \ n", (float) trials [.l] .active_set [i] .single_bit_solutions, (float) triajs [ l] .active_set [i] .double_bit_solutions, (float) trials [l] .active_set [i] .tripIe_bit_solutions, (float) trials [l] .active_set [i], tripleplus_bit_solutions ); } trials [l] .single_bit_solutions_avg trials [0] .singie_bit_soIutions_avg; trials [l] .double_bit_solutions_avg trials [0] .double_bit_solutions_avg; trials [l] .triple_bit_solutions_avg trialsfO] .triple_bit_solutions_avg; trials [l] .tripleplus_bit_solutions_avg trials [0] .tripleplus_bit_solutions_avg; trials [l] .single_bit_solutions_std_dev triáis [0] .single_bit_so lutions_std_dev; trials [l] .double_bit_solutions_std_dev trials [0] .double_bit_solutions_std_dev; triais [1]. trip i e_bit_solutions_std_dev trials [0] .triple_bit_solutions_std_dev; triais [1]. trip lep lus_b i t_solutions_std_dev trials [0] .tripleplus_bit_solutions_std_dev; rintf (stream, "\ t \ t \ t% .lt% .2ñt% .2f \ t% .2? \ r \ n", (float) trials [l] .sipgle_bit_solutions_avg, (float) trials [l]. double_bit_solutions_avg, (float) trials [l] .trjple_bit_solutions_avg, (float) trials [l] .tripleplus_bit_solutions_avg); fprintf (stream, "\ t \ t \ t%: 2ñt% .2f \ t% .2ñt% .2fr \ n", (float) trials [1] .single_bit_solutions_std_dev, (float) trials [l] .double_bit_solutions_std_dev, ( float) trials [l] .triple_bit_solutions_std_dev, (float) trials [1] .tripleplus_bit_solutions_std_dev); } } // for (attempt ... fclose (stream); // now take the best solution stored in tri is location # 1 and create a dump file stream l_fíag = TRUE; // enab le writing of dump file // dump the active set in the dump ñle for archival purposes íprintf (strea l, "DUMP FILEVrVoActive set: \ r \ n"); APPENDIX G utility_object.print_active_set (streaml); for (i = 0; i &l / * ACTrVE_SET_SIZE * /; i-¡- +.). { tc.set_raw_value (875 / * trials [l] .active_set [i] .raw_num * /); tc.generate_stats (); } fclose (streaml); / * printf ("\ r \ n"); fprintf (stream, "\ r \ n"); valid_set [10] .print_pixel_column (); ~ valid_set [10] .fprint_pixel_column (stream); printf ("\ r \ n"); fprintf (stream, "\ r \ n"); valid_ set [10] .set_ _element (0, UNKNOWN) valid_ set [10] .set_ _element (1, UNKNOWN) valid_ _set [10] .set_ _element (2, UNKNOWN) valid_ set [10] .set_ _element (3, UN NOWN): valid_. Set 10] .set_ element (4, UNKNOWN) valid_ set [10] .set_ element (5, UNKNOWN) valid _set [10] .set_ element (6, UNKNOWN) valid_set [10] .generate_valid_solutions ( ); ); valid_set [10].? rint_jpixel_columnO; valid_set [10] .fprint__pixel_column (stream); printf ("\ r \ n"); fprintf (stream, "\ r \ n"); Pixel_column temp_column; U W O R D * s or l u t i o n s _ p t r n e w UWORD [valid_set [10] .get_valid_solutions_sum ()]; valid_set [10] .get_valid_solutions (solutions_ptr); printf ("Valid Solutions are: \ r \ n"); fprintf (stream, "Valid Solutions are: \ r \ n"); for (i = 0; i <valid_set [10] .get_valid_solutiops_sum0; i ++). { temp_column.set_raw_value (solutions_ptr [i]); temp_colurnn.print_pixel_coiurpnO > temp_column fprint_pixel_column (stream); printf ("\ r \ n"); APPENDIX G fprintf (stream, "\ r \ n"); } printf ("Solutions sum-->% u \ r \ n", valid_set [10] .get_valid_solutions_sum ()); delete solutions_ptr; valid_set [10] .generate_active_solutions (); printf ("\ r \ n"); fprintf (stream, "\ r \ n"); valid_set [10] .print_pixel_column (); valid_set [10] .fprint_pixel_column (stream); printf ("\ r \ n"); fprintf (stream, "\ r \ n"); Pixel_column templ_column; solutions_ptr = new UWORD [valid_set [10] .get_active_solutions_sum ()]; valid_set [10] .get_active_solutions (soIutions_ptr); printf ("Active Solutions are: \ r \ n"); fprintf (stream, "Active Solutions are: \ r \ n"); for (i = 0; i <valid_set [10] .get_active_solutions_sum (); i-H-). { templ_coi-ur-n.set_raw_value (solutions_ptt [i]); temp l_column.print_pix.el_column (); templ__column.fprint_pixel_column (stream); priptf ("\ r \ n"); fprintf (stream, "\ r \ n"); } printf ("Solutions sum-- > u \ r \ n", valid_set [10] .get_active_solutions_sum ()); * / // elementh #if ldefined (ELEMENT?) #define ELEMENT H class Element. { public: Element (UBYTE color); // Element constructor (); // default constructor UBYTE get_value (); UBYTE get_color_set (); APPENDIX G UBYTE get_colorO; BOOLEAN set_color (UBYTE color); BOOLEAN set_element_value (UBYTE element_valueA); BOOLEAN set_color_set (UBYTE color_set); ~ Element (); // private destructor: UBYTE element_value; UBYTE element_color; UBYTE element_color_set; void determine_element_parameters_by_color (); void determine_element_parameters_by_value (); void determine_element_parameters_by_color_set (); }; #endif //! def? ned (ELEMENT H) // Element.cpp #include < stdio.h > #include "def.h" #ipclude "global.h" #include "Element.h" #include "Pixel_column.h" #include "Utilities.h" Element:: Element () element_color = RED; element color set = ADDITIVE; Element:: Element (UBYTE color) element_color = color; determine_element_parameters_by_color (); UBYTE Element :: get_valueO return (UBYTE) element_value; UBYTE Element :: get_color_setO APPENDIX G . { _ re urn (UBYTE) element_color_set; UBYTE Element:: get_colorOl return (UBYTE) element_color; } BOOLEAN Element :: set_color (UB ^ TE color). { element_color = color; determine_element_parameters_by_color (); retum TRUE; } , BOOLEAN Element:: set_color_set (UBYTE color_set) r element_color_set = color_set; determine_elementjparameters_by_color_set (); retum TRUE; } BOOLEAN Element:: set_element_value (UBYTE element_valueA). { if ((element_ alueA> = 0) & (element_valueA < = 2) || UNKNOWN). { // Check Base 3 element_value = element_valueA; determme_element_parameters_by_value (); retum TRUE; } return FALSE; } void Element :: determine_element_parameters_by_color (). { switch (element_color). { case (R element_value = 0; break; case (GREEN): APPENDIX G element_value = l; element_color_set = ADDITrVE; break; case (BLUE): element_value = 2; element_color_set = ADDITrV ?; break; case (CYAN): element_value = 0; element_color_set = SUBTRACTrV ?; break; case (MAGENTA): element_value = l; element_color_set = SUBTRACTrVE; break; case (YELLOW): element_value = 2; element_color_set = SUBTRACpVE; break; default: element_value = UNKNOWN; break; } // switch (color)} void Element :: determine_eiement_parameters_by_value () . { switch (element_value). { case (O): if (element_color_set = ADDITrV?) element_color = RED; if (element_coÍor_set = SUBTRACTIVE) element_color = CYAN; break; case (l): if (element_color_set - ADDITIVE) element_co lor = GREEN; if (element_color_set = SUBTRACTIVE) element_color = MAGEÑTA; break; case (2)) :: if (element_color_set - ADÜITIVE) APPENDIX G element_color = BLUE; if (element_color_set = SUBTRACTrVE) element_color = YELLOW; break; default: break; } // switch (color)} void Element :: determine_elementjparameters_by_color_set () . { switch (element_color_set). { case (ADDITrv?): if (element_color = CYAN) element_color = RED; if (element_colar_set = MAGENTA) element_color = GREEN; if (element_color_set = YELLOW) element_color = BLUE; break; case (SUBTRACTrVE): if (element_color = RED) element_color = CYAN; > if (element_coIor_set = GREEN) element_color = MAGENTA; if (eIement_color_set = BLUE) element_color = YELLOW; break; default: break; } // switch (color)} Element:: ~ ElementO. { // No code here} // global.h #imdef GLOBAL H APPENDIX G #define GLOBAL_H extem FILE * streaml; // output stream for solutions file extern BOOLEAN stream l_flag; extem copst UWORD powers_of_three []; extern const UWORD powers_of_two []; extem Pixel_column * global_set; extem UWORD global_set_size; extem Pixel_column * valid_set; extern UWORD valid_set_size; extem Pixel_column * active_set; extem UWORD active_set_size; exém copst UWORD mask7_length; extem const char mask7 [54] [l 1]; extem const double weight_amount [3] [8]; extem copst UWORD normalization_array [3] [8]; extem ACTIVE_SET_STRUCT * trials; extem const UWORD perm_active_set []; extem copst UWORD md_active_set []; extern const UWORD temp_active_set []; #endif // global.cpp #include < stdio.h > #include "def.h" #inciude "globaLh" FILE * streaml; // output stream for solutions file BOOLEAN streaml_flag; copst UWORD powers_of_two [] =. { 1,2,4,8,16,32,64,128,256}; const UWORD powers_of_threeQ =. { 1,3,9,27,81,243,729,2187,6561,19683,59049}; copst UWORD mask7_length = 54; copst UWORD perm_active_set [] = // 84. { 869, 902, 923, 925, 1247, APPENDIX G 1249, 1261, 1262, 1265, 1274, 1280, 1312, 1319, 1355, 1558, 1598, 1600, 1654, 1735, 1747, 1760, 1762, 1765, 1766, 1771, 1879, 1886, 1897, 2495, 2603, 2607, 2624, 2706, 2720, 2738, 2765, 2769, 2774, 2775, 2777, 2813, 2819, 3741, 3747, 3783, 3785, 3786, 3791, APPENDIX G 3795, 3822, 3840, 3854, 3936, 3953, 3957, 4065, • 4663, 4674, 4681, 4789, 4794, 4795, 4798, 4800, 4813, 4825, 4906, 4960, 4962, 5002, 5205, 5241, 5248 , 5280, 5286, 5295, 5298, 5299, 5311, 5313, 5635, 5637, 5658, 5691}; copst UWORD md_active_set [] = // 46. { 875, 907, 914, 938, 1285, APPENDIX G 1307, 1315, 1357, 1555, 1562, 1603, 1666, 1751, 1874, 1882, 1895, 2489, 2615, 2625, 2639, 2705, 2721, 2814, 3746, 3818, 3839, 3855, 3921, 3935, 3945, 4071, 4678, 4686, 4809, 4894, 4957, 4998, 5005, 5203, 5245, 5253, 5275, 5622, 5646, 5653, 5685}; APPENDIX G copst UWORD temp_active_set [] = // l 06. { 869, 875,902,907,914,923,938,1247,1249,1265,128? "1285,1307,1312,1315,1319,1357,1555,1558,1562,1600, 1603,1666,1735,1747,1751,1760,1765,1874,1879 , 1882, 1886, 1895, 229, 2495, 243, 267, 2615, 2624, 2625, 2639, 2705, 2706, 2720, 2121, 2738, 279, 277, 2813, 2814, 2819, 3741, 376, 377, 331 , 3795,3818,3822,3839,3840,3854, 3855,3921,3935,3936,3945,3957,4071,4663,4674,4678, 4681,4686,4798,4800,4809,4813,4825,4894,4906 , 4957, 4960.4962,4998,5002,5005,5203,5205,5241,5245,5248, 5233,5275,5280,5298,5299,5311,5313,5622,5635,5637, 5646,5653,5658,5685 , 5691.} F I * copst UWORD temp_active_set [] = lll 30. { "// 869, 875, 902, 907, 914, 923, 925, 938, APPENDIX G 1247, 1249, // 1261, 111262, 111265, 1274, 1280, 1285, 1307, 1312, 1315, 1319, // 1355, 1357, 1555, 1558, 1562, // l 598, 1600, 1603, // l 654, 1666, 1735, 1747, 1751, 1760, // l 762, // 1765, 11X766, 1771, 1874, 1879, 1882, 1886, 1895, // l 897, 2489, 2495, 2603, 2607, 2615, 2624, 2625, APPENDIX G 2639, 2705, 2706, 2720, 2721, 2738, // 2765, 2769, 112114, II211S, 2777, 2813, 2814, 2819, 3741, 3746, 3747, // 3783, // 3785, // 3786, 3791, 3795, 3818, 3822, 3839, 3840, 3854, 3855, 3921, 3935, 3936, 3945, // 3953, 3957, // 4065, 4071, 4663, 4674, 4678, 4681, 4686, // 4789, // 4794, APPENDIX G // 4795, 4798, 4800, 4809, 4813, 4825, 4894, 4906, 4957, 4960, 4962, 4998, 5002, 5005, 5203, 5205, 5241, 5245, 5248, 5253, 5275, 5280, // 5286, 1/5295, 5298, 5299, 5311, 5313, 5622, 5635, 5637, 5646, 5653, 5658, 5685, 5691}; * / // for a height of seven only const UWORD normalization_array [3] [8] =. { 0.3,0,0,0,0,0,0, 0,0,3,6,11,21,42,126, APPENDIX G 0.0,4,8,8,0,0,0}; // add height area later const double weight_amount [3] [8] =. { 0.0.80.0.0.0.0.0.0, 0.0.0.09.0.009.0.0009.0.00009.0.000009.0.0000009, 0.0.0.09.0.009.0.0009.0.0.0}; // FORMAT IS YPE [2] INDEX # (BASE 10) [2] MASK_DATA [7] in this case coñst char mask7 [54] [l 1] =. { "S \ x01 \ x00X - -", "S \ x01 \ x01-X" S \ x01 \ x02- - "S \ x01 \ x03- X-" S \ x01 \ x04 - X- "S \ x01 \ x05 X- "S \ x01 \ x06 X", "C \ x02 \ x00XX", "C \ x02 \ x01-XX-", "C \ x02 \ x02-XX-", "C \ x02 \ x03-- XX- "," C \ x02 \ x04 - XX- "," C \ x02 \ x05 XX "," C \ x03 \ x00XXX - "," C \ x03 \ x01-XXX- "," C \ x03 \ x02 -XXX- "," C \ x03 \ x03- XXX- "," C \ x03 \ x04 - XXX "," C \ x04 \ x00XXXX- "C \ x04 \ x01-XXXX--", "C \ x04 \ x02-XXXX- "," C \ x04 \ x03- XXXX "," C \ x05 \ xOOXXXXX- "C \ x05 \ x01-XXXXX-" C? x05 \ x02 ~ XXXXX "," C \ x06 \ x00XXXXXX- " , "C \ x06 \ x01-XXXXXX", "C \ x07 \ xOOXXXXXXX", ", APPENDIX G "N \ x02 \ x02X- X ~", "N \ x02 \ x03X - X-", "N \ x02 \ x04X ~ - X", "N \ x02 \ x05-XX-", "N? X02 \ x06 -X ~ X ~ "," N \ x02 \ x07-X- X- "," N \ x02 \ x08-X- -X "," N \ x02 \ x09 - XX- "," N \ x02 \ xl0 - XX- "," N \ x02 \ xl lX- X "," N \ x02 \ xl2- XX- "," N \ x02 \ xl3- XX "," N? x02 \ xl4 - XX "," N \ x03 \ x00X-XX- "," N \ x03 \ x01X-X ~ X- "," N \ x03 \ x02X-X- X "," N \ x03 \ x03X - XX- "," N \ x03 \ x04X ~ XX "," N \ x03 \ x05X- XX "," N \ x03 \ x06-XXX- "," N \ x03 \ x07-XXX "," N \ x03 \ x08-X - XX " , "N \ x03 \ x09-XXX", "N \ x04 \ x0OX-XXX"}; Pixel_coIumn * global_set; UWORD global_set_size; Pixel_column * valid_set; UWORD valid_set_size; Pixel_column * active_set; / UWORD active_set_size; ACTrV? _SET_STRUCT * trials; // Pixe__column.h #if! Defiped (PIXEL_COLUMN_H) #defme PLXEL COLUMN H class Pixel_column. { -public: Pixel_column (); APPENDIX G 9 ~ 6 Pixel_column (UBYTE height, UBYTE color_set, UBYTE * elements); / / Pixel_column constructor (UBYTE height, UBYTE color_set); // constructor UBYTE getJieightO; UBYTE get_color_set (); UBYTE getJypeO; UWORD get_raw_valueO; UWORD get_actual_valueO; BOOLEAN set_height (UBYTE height); BOOLEAN set_color_set (UBYTE set_color_set); BOOLEAN set ypeO; BOOLEAN set_element (UBYTE element_number, UBYTE element_value); BOOLEAN set_raw_value (UWORD valued); BOOLEAN set_actual_ value (UWORD valued); BOOLEAN is_raw_valid (); BOOLEAN is_raw_active (); BOOLEAN generate_valid_solutions (); BOOLEAN generate_active_solutions (); BOOLEAN raw2element_set (UWORD raw_value, Element * pixel_column_ptr ); BOOLEAN element_set2raw (UWORD * raw_value, Element * pixel_column_ptr); UWORD get_valid_solutions__sum (); BOOLEAN get_valid_solutions (UWORD * global_solutions); UWORD get_active_solutions_sum (); ~ _ BOOLEAN get_active_solutions (UWORD * gIobal_solutions); UBYTE get_element_value (UBYTE element_number); BOOLEAN print_pixel_colu n (); BOOLEAN fprintjpixel_column (FILE * stream); BOOLEAN print_stats (); BOOLEAN generate_stats (); BOOLEAN get_actual_stats (ACTIVE_PC_STRUCT * the_actual_stats); / BOOLEAN fprint_state (FILE * stream); ~ Pixel_column (); // private destructor: UBYTE pixel_column_height; UBYTE pixel_column_color_set; UBYTE pixeI__column_type; UWORD pixel_column_raw_value; UBYTE pixel_column_actual_value; APPENDIX G Element * pixel_column_ptr; UWORD valid_solutions_sum; UWORD * valid_solutions; UWORD active_solutions_sum; UWORD * active_soIutions; STATS * valid_stats; // must declare dynamically STATS * actual_stats; // must declare dynamically}; #endif // Pixel_column.cpp #include < stdip.h > #include "def.h" #ipclude "global.h" #include "Element.h" #include "Pixel_column.h" #inciude "Utilities.h" #ipclude < math.h > #include < stdlib.h > #include < conio.h > Pixel_column :: Pixel_column (). { - - - UWORD i; pixel_column_ptr = pew EIement [Ffl-IGHT]; for (i = 0; KHEIGHT; i ++). { pixel_column_ptr [i] .set_element_value (0); -} pixeI_column_height = HEIGHT; pixeI_column_color_set = ADDITGVE; // just to initialize a block so there is something to delete before a new one is // allocated in the global solutions function // valid_solutiops = new UWORD [2]; active_solutions = new UWORD [pow (2, HEIGHT)]; } Pixel _coI ?? mn :: Pixel_colurrm (UBYTE height, UBYTE coIor_set, UBYTE * elements). { UWORD i; pixel_columnjptr = new Element [height]; for (i = 0; Kheight; i-H-). { APPENDIX G pixel_columpjtr [i] .set_element value (elements [i]); } pixel; ou? mn_height ~ height; pixel_column_color_set = color_set; // just to initialize a block so there is something to delete before a new one is // allocated in the global solutions functiop // valid_solutions = new UWORD [1]; active_solutions = new UWORD [pow (2, HEIGHT)]; } Pixel_column :: Pixel_column (UBYTE height, UBYTE color_set). { UBYTE i; pixel_column_ptr = new Element [heighfJ; for (i = 0; i < height; i ++). { pixel_column_ptr [i] .set_element_value (0); -} pixel_column_height = height; pixel_column_color_set = color_set; // just to initialize a block so there is something to delete before a new one is // allocated in the global solutions function valid_solutions = new UWORD [1]; active_so! utiops = new UWORD [pow (2, HEIGHT)]; UBYTE Pixel_column :: get_height () return pixel_column_height; UBYTE Pixel_column:: get_color_set () retum pixel_column_color_set; UBYTE Pixel_column :: get_typeO rerum O; UWORD Pixel_column :: get_raw_value () element_set2raw (& pixel__column_raw_value, pixel_column_ptr); APPENDIX G return pixel_colupm_raw_value; } UWORD Pixel_column:: get_actual_value (). { retum 0; } BOOLEAN Pixel_colurr_n :: set_ height (UBYTE height). { pixel_column_height = height; element_set2raw (& pixeI_column_raw_value, pixel_column_) tr); retum TRUE; } BOOLEAN Pixel_column :: set_color_set (UBYTE color_set). { _ UBYTE i; pixel_column_color_set = color_set; for (i = 0; i <pixel_column_height; i ++). { pixel_colurnn_jptr [i] .set_color_set (color_set); } retum TRUE; } BOOLEAN Pixel_column :: set_type (). { _ "return TRUE;.}. BOOLEAN Pixel_column :: set_element (UBYTE element_number, UBYTE element_value) { pixel_column_ptr [element_number] .set_eIement_value (element_value); retum TRUE;.}. BOOLEAN Pixel_column :: set_raw_value (UWORD valued). { . _ if ((UDWORD) value > = powers_of_three [pixel_column_height]) retum FALSE; raw2element_set (valué, pixel_column_ptr); - element_set2raw (& pixel_column_raw_value, pixel_column_ptr); APPENDIX G retum TRUE; } BOOLEAN PixeI_column :: set_actual_value (UWORD valued). { retum TRUE; } Pixel_column :: ~ Pixel_columnO. { "7 delete [] pixel_column_ptr; // delete [] vaIid_solutions; delete [] active_solutions;.}. UBYTE Pixel_column :: get_element_vaIue (UBYTE element_number) { Return pixeI_column_ptr [element_number] .get_value ();.}. BOOLEAN Pixel_column: : raw2element_set (UWORD raw_value, Element * pixeI_column_ptr) { "UWORD j; // MSB is the last or bottom element in a pixel column for (j = 0; j <pixeI_column_height; j ++). { pixel_column_ptr [j] .set_element_value ((raw_value / powers_of_three [j])% 3); } retum TRUE; } BOOLEAN Pixel_column :: element_set2raw (UWORD * raw_value, Element * pixel_column_ptr). { 1 UWORD i; BOOLEAN invalid_fiag; invalid_flag = FALSE; * raw_value = 0; for (i = 0; i <pixel_column_height; i ++). { if ((pixel_column_ptr [i] .get_value () = 255) || (pixel_column_ptr [i] .get_value () = '?')). { invaiid_fiag = TRUE; } APPENDIX G * raw_value = (* raw_value) + pixel_column_ptr [i] .get_value () powers_of_three [i]; } if (invalid Iag = TRUE). { * raw_value = INVALID; retum FALSE; } else return TRUE; } BOOLEAN Pixel_column :: is_raw_valid (). { UWORD i; for (i = 0; i < (pixel_column_height-l); i ++). { if (pixel_column_ptr [i] .get_value () > = 3) retum FALSE; if (pixel__column_ptr [i] .get_valueO = pixel_column_ptr [i + 1] .get_valueO) return FALSE; } if (pixel_column_ptr [i] .get_valueO == pixel_column_ptr [0] .get_value ()) retum FALSE; // check loop constraint retum TRUE; } BOOLEAN Pixel_column :: is_raw_active (). { r UWORD i, temp; for (i = 0; i < ACTrVE_SET_SIZE; i ++). { - temp = active_set [i] .get_raw_value (); if (pixel_column_raw_value = temp) retum TRUE; ".}. return FALSE;.}.
B OOLEAN Pixel_co lumn:: generate_ vaIid_solutions (). { UWORD ij, unknown_counter; UWORD unknownjpositions [HEIGHT]; UWORD k, total_possibilities; // determine the amount of UNKNOWNS and their respective positions for (i = 0; i <HEIGHT; i ++). { APPENDIX G unknowp_positions [i] = FALSE; } unknown_counter = 0; for (i = 0; i <HEIGHT; i ++). { if (pixel_column_ptr [i] .get_value () = UNKNOWN). { unknown_positions [unknown_counter-H-] = i; } } if (unknown_counter = 0) retum TRUE; total_possibilities = powers_of_three [unknown_counter]; delete [] valid_solutions; valid_solutions = new UWORD [total_possibilities]; valid_solutions_sum = 0; for (k = 0; k < total_possibiIities; k ++). { for (j = 0; j <unknown_counter; j ++). { p ix el_c or l umn_p tr [unkno wn_p or s it i or ns [j]] = (k / powers_of_three [i])% 3; } if (is_raw_valid) { // capture its raw number and increase valid_solutions_sum // printf ("TOTAL =% u, VS =% u \ r \ n", total possibilities, valid_solutions_sum); element_set2raw (& valid_soIutions [valid_solutions_sum -? - + -], pixeI_column_ptr); } } for (i = 0; i <unknown_counter; i ++). { pixel_column_ptr [unknown_positions [i]] = UNKNOWN; -} retum TRUE; } BOOLEAN Pixel_column:: generate_active_solutions (). { UWORD ij, unknown_counter; UWORD unknown positions [HEIGHT]; UWORD k, totaI_possibilities; // determine the amount of UNKNOWNS and their respective positions for (i = 0; KHEIGHT; i-H-). { unknown_positions [i] = FALSE; } unknown_counter = 0; APPENDIX G for (i = 0; i <HEIGHT; i-H-). { if (pixel_column_ptr [i] .get_valueO = UNKNOWN). { ur? known_positions [unknown_counter-H-] = i; } } if (unknown_counter == 0) retum TRUE; total_possibilities = powers_of_three [unknown_counter]; if (streaml_fiag) fprintf (streaml, "\ t \ tTotal possibilities:% u", total_possibilities); // delete [] active_solutions; // active_solutions = new UWORD [total_possibiIities]; active_solutions_sum = 0; for (k = 0; k < total_possibilities; k ++). { for 0 = 0; j < unknown_counter; j ++). { p ix e l_c or lumn_p tr [unknow n_ o s i t i or ns [j]] = (k / powers_of_three [j])% 3; } _ get_raw_valueO; if (streaml_flag) fprintf (streaml, "\ r \ n \ t \ t \ t"); if (streaml_flag) fprint pixel_column (streaml); if (is_raw_active ()) { if (streaml_flag) rintf (streaml, "-> Active!"); // capture its raw number and increase active_solutiops_sum // printf ("TOTAL =% u, VS =% u \ r \ n", total_possibilities, active_solutions_sum); element_set2raw (& active_solutions [active_solutions_sum ++], pixel_column ptr); // EXiT ROU? NE IF ACTGV? SOLU? ONS > I TO SAVE TIME SINCE WE ARE NOT KEEPING TRACK OF THESE SEPARATLY // if (active_solutions_sum > 3) retum TRUE; } else { __ if (! is_raw_validO). { if (streaml lag) fprintf (streaml, "- > Invalid"); } else { if (streaml_flag) fprintf (streaml, "-> Non-Active"); } } } for (i = 0; i <unknown_counter; i ++). { pixel_colurr? nj3tr [ur-known_ positions [i]] = UNKNOWN; } if (streaml_flag) fprintf (streaml, "\ r \ n \ t \ tTotal active solutions for this error APPENDIX G sequence:% u \ r \ n \ r \ n ", active_solutions_sum); retum TRUE;.}.
UWORD Pixel_column:: get_valid_solutions_sum (). { return vaiid_solutions_sum; _} ~ BOOLEAN Pixel_coIumn :: get__valid_solutions (UWORD * solutions) . { UWORD i; for (i = 0; i <valid_solutions_sum; i ++). { solutions [i] = valid_solutions [i]; } retum TRUE; } UWORD Pixel_column:: get_active_solutioñs_sum (). { _ "return active_solutions sum;.}. BOOLEAN Pixel_column :: get_active_solutions (UWORD * solutions) . { "UWORD i; for (i = 0; í < active_solutions_sum; i ++) { Solutions [i] = active_solutions [i];.}. Retum TRUE;.}.
BOOLEAN Pixel_column:: print_pixel_column (). { UWORD i; UWORD temp; temp = get_raw_valueO; if (temp = rNVALLD) printf ("UNKNOWNNt"); else APPENDIX G printf ("% u \ t", temp); for (i = 0; i < (HEIGHT-l); i ++). { temp = get_element_value (i); if (temp = 255). { printf ("?,"); } eise { printf ("% u,", temp); } } temp = get_element_value (i); if (temp = 255). { printf ("7"); } else { priptf ("% u", temp); } retum TRUE; } BOOLEAN Pixel_column :: fprint_pixel_colurrm (FILE * stream) . { UWORD i; UWORD temp; temp = get_raw_valueO; if (temp == INVALID) fprintf (stream, "UNKNOWNNt"); else fprintf (stream, "% u \ t", temp); for (i = 0, HEIGHT-1); i ++). { ^ temp = get_element_value (i); if (temp == 255). { fprintf (stream, "?,"); } else { fprintf (stream, "% u,", temp); } } temp = get_eiement_value (i); if (temp = 255). { fprintf (stream, "?,"); } else { APPENDIX G fprintf (stream, "% u", temp); } retum TRUE; } BOOLEAN Pixel_column :: generate_stats () r current_stats = new STATS; UWORD ij, k, l, originaí_raw; UWORD error num; actual_stats- > single_bit_solutions = 0; actual_stats- > double_bit_solutions = 0; actual_stats- > triple_bit_soIutions = 0; actual_stats- > tripleplus_bit_solutions = 0; original_raw = get_raw_value (); if (stream l_flag) fprintf (streaml, "\ r \ n \ r \ nProcessing Active Valué:"); if (streaml_flag) frint_pixel_column (streaml); if (streaml_flag) fprintf (streaml, "\ r \ n"); for (i = l; i < (powers_of_two [HEIGHT]); i ++). { if (streaml_flag) fprintf (streaml, "\ tError sequence #% u \ r \ n \ t \ t", i); error_num = i; for (j = (HEIGHT); j! = 0; j--). { if (error_num > - powers_of_two [j-l]). { set_element ((UBYTE) O'-l), UNKNOWN); error_num - = powers_of_two¡j-l]; } } if (streaml_flag) fprint_pixel_column (streaml); if (streaml_flag) fpriptf (streaml, "\ r \ n"); generate_active_so lutions (); if (active_solutions_sum = 1). { actual_stats- > single_bit_solutions ++;} if (acüve_solutions_sum = 2). { actual_stats- > double_bit_solutions-H-;} if (active_solutions_sum = 3). { actual_stats- > triple_bit_solutiops ++;} if (active_solutions_sum > 3). { actual_stats- > tri? leplus_bit_solutions ++;} set_raw_value (original_ra); } // for printf ("*"); retum TRUE; } BOOLEAN Pixel_column :: get_actual_stats (ACTIVE_PC_STRUCT * the_actual_stats APPENDIX G ). { the_actual_stats- > singie_bit_solutions = actual_stats- > single_bit_solutions; the_actual_stats- > double_bit_solutions = actual_stats- > double_bit_solutions; the_actual_stats- > tri? le_bit_solutions = actual_stats- > triple_b? t_solutions; the_actual_stats- > tripleplus_bit_solutions = actual_stats- > triple? Ius_bit_solutions; delete current_stats; retum TRUE; } BOOLEAN Pixel_coIumn :: print_stats (). { UWORD j; printf ("\ r \ n \ r \ nACTrv? STATS \ r \ n"); priptf ("Single bit->% .lf, Double bit->% .lf, Triple bit->% .lf, 3+ bit- >% .lf \ r \ n", (float) (actual_stats - > single_bit_solutions) * (100 / MASK_LEN), (float) (100 / MASK_LEN * actual_stats-> double_b? t_solut? ons), (float) (l 00 / MASK_LEN * actual_stats-> g_t_ple_solut? ons), ( float) (l 00 / MASK_LEN * actual_stats-> tripleplus_bit_solutions)); delete current_stats; retum TRUE; // Utilities.h #if! Defmed (UTILITIES_H) #defme UTILITIES H class Utilities. { pubiic: UtilitiesO; UWORD get_global_set_size (); BOOLEAN create_global_setO; APPENDIX G BOOLEAN create_valid_set (); BOOLEAN create_active_set (); UWORD get_valid_set_size (); UWORD get_active_set_size (); void print_valid__set (FILE * stream); void print_global_set (FILE * srream); void print_active_set (FILE * stream); ~ Utilities (); private: }; #endif // Utilities.cpp #include < stdio.h > #include < stdlib.h > #include < time.h > #include "def.h" #include "global.h" #include "Element.h" #include "Pixel_column.h" #ipclude "Utilities.h" UtiIities :: Utilities (). { UWORD i, trial_num; // initialize with something global_set = new Pixel_column [powers_of_three [HEIGHT]]; global_set_size = powers_of_three [HEIGHT]; valid_set = new Pixel_column [? owers_of_three [HEIGHT]]; valid_set_size = powers_of_three [HEIGHT]; active_set = new Pixel_colu? rm [ACTIVE_SET_SIZE]; triáis = new ACTIVE_SET_STRUCT [2]; // clear storage area for (trial_num = 0; trial_num < 2; trial_num ++). {; trials [trial_num] .score_avg = 0; // not used now trials [triaI_num] .score_std_dev = 0; // not used now trials [trial_num] .single_bit_solutions_avg; trials [trial_num] .double_bit_solutíons_avg; APPENDIX G triaIs [trial_num] .triple_bit_solutions_avg; trials [trial_pum] .triplepIus_bit_solutions_avg; trials [trial_num] .single_bit_solutions_std_dev; trials [trial_num] .double_bit__solutions_std_dev; tri ls [trial_num] .triple_bit_solutions_std_dev; trials [trial_num] .tripleplus_bit_solutions_std_dev; for (i = 0; Í <ACTGV? _SET_SIZE; i ++). { trials [trial_num] .active_set [i] .raw_num = 0; trials [trial_num] .active_set [i] .score = 0; trials [trial_num] .active_set [i] .single_bit_solutions; trials [trial__num] .active_set [i] .double_bit_solutions; trials [trial_num] .active_set [i] .triple_bit_solutions; trials [trial_num] .active_set [i] .tripleplus_bit_solutions; } } UWORD Utilities:: get_global_set_size () return global_set_size; UWORD Utilities:: get_valid_set_size () retum valid_set_size; UWORD Utilities:: get_active_set_size () retum ACTIVE_SET_SIZE; BOOLEAN Utilities:: create_global_set (). { UWORD i; delete [] global_set; global_set = new Pixel_column [powers_of_three [HEIGHT]]; global_set_size = powers_of_three [HEIGHT]; valid_set_s ize = 0; for (i = 0; i <powers_of_three [HEIGHT]; i ++). { global_set [i] .set_height (HEIGHT); global_set [i] .set_raw_value (i); APPENDIX G } retum TRUE; } BÓOLEAN Utilities :: create_valid_set (). { UWORD ij; delete [] valid_set; valid_set = new Pixel_column [powers_of_three [HEIGHT]]; // make it same size as global_set to be safe valid_set_size = 0; . j = 0; for (i = 0; i <global_set_size; i ++). { if (gIobal__set [i] .is__raw_validO). { valid_set [j] .set_height (global_set [i] .get_heightO); valid_set [j-H -]. set_raw_value (global_set [i] .get_raw_vaíue ()); valid_set_size ++; } } retum TRUE; BOOLEAN Utüities :: create_active_set (). { // this funtion creates an active set from the valid set UWORD i; for (i = 0; i < (UWORD) TEMP_ACTrVE_SET_SIZE; i ++). { active_set [i] .set_raw_yalue (temp_act? ve_set [i]); } retum TRUE; I * BOOLEAN Utilities:: create_active_set (). { // this funtion creates a random active set from the valid set UWORD i, j, temp, t, m, N, n; UBYTE state, next_state; float U; BOOLEAN terminate; terminate = FALSE; APPENDIX G state = 1; next_state = 0; U = (fioat) 0; N = valid_set_size; n = ACTIVE_SET_SIZE; srand ((unsigned) time (NULL)); forever ) . { switch (state). { case (l): t = 0; m = 0; next_state = 2; break; case (2): U = ((float) rand () / (float) RAND_MAX); next_state = 3; break; case (3): if (((N-t) * U) > = (n-m)) next_state = 5; else next_state = 4; break; case (4): active_set [m] .set_raw_value (valid_set [t] .get_raw_valueO); m ++; t ++; if (m < n) next_state = 2; else termínate = TRUE; break; case (5): t ++; next_state = 2; break; } if (termínate) break; state = next_state; } retum TRÜE; } "* / APPENDIX G void Utilities ::? rint_valid_set (FILE * stream). { UWORD ij; printf ("VALLD SET \ r \ nVALID SET SLZE% u \ r \ n", valid_set_size); fprintf (stream, "VALID SET \ r \ nVALLD SET SIZE% u \ r \ n", valid_set_size); for (i = 0; i <valid_set_size; i ++). { valid__set [i] .print_pixel_column (); printf ("\ r \ n"); valid_set [i] .fprintj3Íxel_colurru? (stream); fprintf (stream, "\ r \ n"); -} } void Utilities:: print_global_set (FILE * stream). { UWORD ij; printf ("GLOBAL SET \ r \ nGLOBAL SET SIZE% u \ r \ n", global_set_size); fprintf (stream, "GLOBAL SET ?? nGLOBAL SET SIZE% u \ r \ n", global_set_size ); for (i = 0; i <global_set_size; i ++). { global_set [i] .ppnt_pixel_columnO; ppntf ("\ r \ n"); global_set [i] .fprint_pixel_column (stream); fppntf (stream, "\ r \ n"); } } void Utilities :: print_active_set (FILE * stream) UWORD ij; printf ("ACTIVE SET \ r \ nACTrv? SET SIZE% u \ r \ n", ACTrV? _SET_SIZE); fprintf (stream, "ACTIVE SET \ r \ nACTrVE SET SIZE% u \ r \ n", ACTGVE_SET_SGZE); for (i = 0; i < ACTrVE_SET_SIZE; i ++). { active_set [i] .print_pixel_columnO; printf ("\ r \ n"); active_set [i] .fprint_pixel_column (stream); fprintf (stream, "\ r \ n"); } } Utüities :: ~ Utilities () APPENDIX G delete [] global_set; delete [] valid_set; delete [] triáis; // def i #if! defined (DEF_H) #define DEF_H typedef unsigned char UBYTE; typedef char SBYTE; typedef unsigned short UWORD; typedef unsigned long UDWORD; typedef signed short SWORD; t pedef unsigned char BOOLEAN; #define ACTGVE_SET_SIZE 106 // 130 // 258 // 106 #define PERM_ACTIVE_SET_SLZE 46 #define RND_ACTIVE_SET_SIZE 84 #defme TEMP ACTIVE SET SIZE 106 typedef struct. { UWORD Ien; UWORD cnt; UWORD max; UWORD min; double temp; double avg; double std_dev; } STAT DATA; typedef struct. { // Format is: [Type of data group (Single (S), Contiguous (C), NonContiguous (N)] APPENDIX G // [Subset of data group, S is none, C is 2-7, N is 2-4] // [An actual sample element of that group, Last element is SUMMARY] // STAT DATA stat_array [4] [8] [20]; // double weighted; UWORD single_bit_soIutions; UWORD double_bit_solutions; UWORD triple_bit_solutions; UWORD tnpleplus_bit_solutions; } STATS; typedef struct. { UWORD raw_num; // raw pixel_colump number of this valid_idx double score; float single_bit_so! utions; float double_bit_solutions; float triple_bit_solutions; float tripleplus_bit_solutions; } ACTrVE_PC_STRUCT; typedef struct. { ACTrVE_PC_STRUCT active_set [ACTIVE_SET_SIZE]; double score_avg; double score_std_dev; float single_bit_solutions_avg; float double_bit_solutions_avg; float triple_bit_solutions_avg; float tripleplus_bit_solutions_avg; float single_b? t_solutions_std_dev; _ float double_bit_solutions_std_dev; float triple_bit_solutions_std_dev; float tripleplus_bit_solutions_std_dev; } ACTTVE_SET_STRUCT; // ???? #include "Element.h" #include "Pixel_column.h" // ???? #define EVER;; #define FALSE 0 APPENDIX G #defme TRUE 1 #def and INVALID 65330 #define ADDITIVE (UBYTE) OR #define SUBTRACTIVE (UBYTE) 1 #define RED (UBYTE) O #define GREEN (UBYTE) 1 #define BLUE (UBYTE) 2 #define CYAN (UBYTE) 3 #define MAGENTA (UBYTE) 4 #define YELLOW (UBYTE) 5 #define BLACK (UBYTE) 6 #define WHITE (UBYTE) 7 #define UNKNOWN (UBYTE) 255 #define HEIGHT (UWORD) 8 '#define MASKJ EN (float) ) 54 #defme SINGLE 0 // single bit errors #define CONTIGUOUS 1 // contiguous errors "#defme NONCONTIGUOUS 2 // noncontiguous errors # deñne SUMMARY 19 // last element of stat_array by definition #defme WEIGHTED 0 // weighted summary average #defme UNWEIGHTED 1 // unweighted summary average #endif APPENDIX G Original Value Processing: 875 2.0, 1.2, 1.0, 1, u Error Sequence # 1?, 0,1,2,1,0,1,0 Total Possibilities: 3,873 0,0,1,2,1,0 1,0 - > Invalid 874 1.0,1,2,1,0,1,0 - > Valid 875 2.0,1,2,1,0,1,0 - > Active ! Total active solutions for this error sequence: 1 Error Sequence £ 2 2.7,1,2,1,0,1,0 Total Possibilities: 3 875 2.0,1,2,1,0,1,0 - > Active ! 878 2.1.1.2.1.0.1.0 - > Invalid 881 2,2,1,2,1,0,1,0 - > Invalid Total active solutions for this error sequence: 1 Error Sequence fr3 _ = t?,?, 1,2,1,0,1,0"" * Total Possibilities: 9 873 0,0,1,2,1,0 / 1,0 - > Invalid 874 1.0,1,2,1,0,1,0 - > Valid 875 2.0,1,2,1,0,1., 0 - > Active ! 876 0.1.1.2.1.0.1.0 - > Invalid 877 1,1,1,2,1,0,1,0 - > Invalid APPENDIX H 878 2.1.1.2.1.0.1.0 - > Invalid 879 0.2.1.2.1.0.1.0 - > Invalid 880 1,2,1,2,1,0,1,0 - > Valid 881 2,2,1,2,1,0,1,0 - > Invalid Total active solutions for this error sequence: 1 Error sequence §4 2.0,?., 2.1.0.1.0 Total Possibilities: 3 866 2.0,0,2,1,0,1,0 - > Invalid 875 2.0,1,2,1,0,1,0 - > Active! 884 2.0.2.2.1.0.1.0 - > Invalid Total active solutions for this error sequence: 1 Error sequence 5?, 0,?, 2,1,0,1,0 Total possibilities: 9 864 0,0,0,2,1,0,1,0 - > Invalid 865 1.0.0.2.1.0.1.0 - > Invalid 866 2.0,0,2,1,0,1,0 - > Invalid 873 0,0,1,2,1,0,1,0 - > Invalid 874 1.0,1,2,1,0,1,0 - > Valid 875 2.0,1,2,1,0,1,0 - > Active! 882 0.0.2.2.1.0.1.0 - > Invalid 833 1.0.2.2.1.0.1.0 - > Invalid 334 2.0.2.2.1.0.1.0 - > Invalid APPENDIX H I went Total active solutions for this error sequence: 1 Error sequence 6 2,?, 7,2,1,0,1,0 Total possibilities: 9 866 2,0,0,2,1,0,1,0 - > Invalid 869 2.1.0.2.1.0.1.0 - > Active! 872 2, 2.0.2, 1.0, 1.0 ^ - > Invalid 875 2.0,1,2,1,0,1,0 - > Active! 878 2.1.1.2.1.0.1.0 - > Invalid 881 2,2,1,2,1,0,1,0 - > Invalid 884 2.0,2,2,1,0,1,0 - > Invalid 837 2,1,2,2,1,0,1,0 - > Invalid 890 2,2,2,2,1,0,1,0 - > Invalid Total active solutions for this error sequence: 2 Error Sequence # 7 1,1, -i, 2, 1,0, 1,0 Total Possibilities: 27 864 0,0,0,2,1,0,1,0 - > Invalid 865 1.0,0,2,1,0,1,0 - > Invalid 866 2,0,0,2,1,0,1,0 - > Invalid 867 0, l, 0.2, l, 0, l, 0_- > Invalid 868 1,1,0,2,1,0,1,0 - > Invalid 869 2.1.0.2.1.0.1.0 - > Active! 870 0.2.0.2.1.0.1.0 - > Invalid APPENDIX H 871 1.2.0.2.1.0.1.0 - > Valid 872 2.2.0.2.1.0.1.0 - > Invalid 873 0.0,1,2,1,0,1,0 - > Invalid 874 1.0,1,2,1,0,1,0 - > Valid 875 2.0,1,2,1,0,1,0"-> Active! 876 0.1.1.2.1.0.1.0 - > Invalid 877 1,1,1,2,1,0,1,0 - > Invalid 878 2,1,1,2,1,0,1,0 - > invalid 879 0.2,1,2,1,0,1,0 - > Invalid 880 1,2,1,2,1,0,1,0 - > Valid 881 2.2.1.2.1.0.1.0 - > invalid 882 0.0,2,2,1,0,1,0 - > invalid 883 1.0,2,2,1,0,1,0 - > invalid 884 2.0,2,2,1,0,1,0 - > invalid 885 0.1.2.2.1.0.1.0 - > invalid '886 1,1,2,2,1,0,1,0 - > invalid 887 2,1,2,2,1,0,1,0 - > invalid 888 0.2,2,2,1,0,1,0 - > invalid 889 1,2,2,2,1,0,1,0 - > invalid 890 2,2,2,2,1,0,1,0 - > Invalid Total active solutions for this sequence: 2 APPENDIX H 27 28 29 30 31 Value k: '0, 1, 2, 3, 4, 5, 6, 7 869 2,1,0,2,1,0,1,0 29.80 22 .75 10.98 875 2.0,1,2,1,0,1,0 18.43 26 .27 10.98 902 2.0,1,0,2,0,1,0 17,65 22 .35 10.98 907 1,2,1,0,2,0,1,0 22.75 21 .96 10.98 914 2.1.2.0.2.0.1.0 21.96 21 .18 11.76 923 2.1.0.1.2.0.1.0 23.14 22 .75 11.76 938 2.0.2.1.2.0.1.0 22.75 22.35 11.37 1247 .2.1,0,1,0,2,1,0 18.43 23 .53 17.65 1249 1.2.0.1.0.2.1.0 22.35 25.49 7.84 1265 2, 1,2,1,0,2,1,0 18.43 23 .14 17.65 1280 2.0.1.2.0.2.1.0 26.67 20.00 11.76 1285 1,2,1,2,0,2,1,0 22.75 25 .10 9.41 1307 2.0,1,0,1,2,1,0 22.75 23 .53 10.20 1312 1,2,1,0,1,2,1,0 17,65 22. .35 10.98 1315 1.0.2.0.1.2.1.0 22.75 22.35 11.37 1319 2.1.2.0.1.2.1.0 20.00 23.53 10.59 13S7 1,2,0,2,1,2,1,0 22.75 23 .53 10.98 1555 1.2, 1, 0.1.0.2.0 18.43 25.49 9.80 1558 1.0.2.0.1.0.2.0 17.65 22..35 10.98 1562 2.1.2.0.1.0.2.0 22.75 21, .96 11.76 1600 1.2.0.2.1.0.2.0 30.98 22..35 6.27 1603 1.0,1,2,1,0,2,0 18.43 26. .27 10.98 1666 1.0.2.1.2.0.2.0 23.92 22.7575 11.76 1735 1.2.0, 1.0.1.2.0 30.98 21. .96 11.37 1747 1.0.2.1.0.1.2.0 21.18 23. .53 10.98 1751 2.1.2.1.0.1.2.0 18.43 26. .67 10.20 1760 2, 1.0.2.0, 1.2.0 29.02 25. .49 1.31 1765 1.0,1,2,0,1,2,0 29.80 20. .78 12.55 1874 2.0,1,0,2,1,2,0 22.75 22. .35 11.37 1879 1,2,1,0,2,1,2,0 25.49 24. 31 7.06 1882 1, 0, 2, 0, 2, 1,2,0 18,43 25. 10 10.98 1886 2.1.2.0.2.1.2.0 17.65 22..35 10.98 1895 2.1.0.1.2.1.2.0 22.75 23. 14 11.37 2489 2.1.0.2.0.1.0.1 18.43 26., 67 10.59 2495 2.0,1,2,0,1,0,1 18.43 20.7878 17.25 2603 2.0,1,0,2,1,0,1 21.18 22., 35 8.63 2607 0.2,1,0,2,1,0,1 23.53 23. .53 10.59 2S15 2.1.2.0.2.1.0.1 18.43 25., 49 10.98 2624 2.1.0.1.2.1.0.1 17.65 22.7575 12.55 2625 0.2,0,1,2,1,0,1 22.75 22. .75 12.94 2639 2.0,2,1,2,1,0,1 21.96 22., 75 9.41 2705 2.1.0.1.0.2.0.1 18.43 24. 1 11.76 2706 0.2.0.1.0.2.0.1 20.39 22. 35 12.16 2720 2.0.2.1.0.2.0.1 22.35 21. 13 11.37 APPENDIX I 2721 0.1.2.1.0.2.0.1 25.83 20..39 '11.37 2738 2.0,1,2,0,2,0,1 13 .73 22. .35 '20.00 2769 0.2, 1.0.1.2.0.1 25 .10 23. .53 7.84 2777 2.1.2.0.1.2.0.1 26 .67 21. .57 '11.76 2813 2,1,0,2,1,2,0,1 24, .31 23. .53 9.80 2814 0.2.0.2.1.2.0.1 26, .67 20.7878 10.98 2819 2.0,1,2,1,2,0,1 13 .43 21. .18 17.25 3741 0.2,1,0,1,0,2,1 10 .20 24. .31 16.86 3746 2.0,2,0,1,0,2,1 22 .75 22. .35 12.16 3747 0,1,2,0,1,0,2,1 23 .53 2 .96 9.41 3791 2.0,1,2,1,0,2,1 24 .71 22. .35 9.41 37§5 0.2,1,2,1,0,2,1 18 .43 23, .53 14.51 3818 2.0,1,0,2,0,2,1 18 .43 26, .27 10.59 3822 0.2, 1.0.2.0.2.1 15 .29 23. .53 12.94 3839 2.1.0.1.2.0.2.1 23 .92 23. .53 10.98 3840 0.2,0, 1,2,0,2, 1 24 .31 23, .14 8.63 3854 2.0,2,1,2,0,2,1 17 .65 22, .35 10.98 3855 0.1 / 2.1.2.0.2.1 8 .43 26 .27 10.20 3921 0.2,0,1,0,1,2,1 18 .43 27 .84 11.76 3935 2.0.2.1.0.1.2.1 22 .75 22.35 10.59 3936 0,1,2,1,0,1,2,1 20 .39 21 .96 11.76 3945 0.1.0.2.0.1.2.1 23 .92 23 .92 10.20 3957 0.2,1,2,0,1,2,1 28 .63 22 .75 8.63 4071 0.1.2.0.2.1.2.1 21 .96 23. .53 10.20 4663 1.0, 2.1.0.1.0.2 20. .78 19. .61 12.16 4674 0, 1.0, 2.0, 1.0.2 20. .39 22. .35 12.16 4678 1.2.0.2.0.1.0.2 25.88.78.78 13.33 4681 1.0,1,2,0,1,0,2 18., 04 21., 57 12.55 4686 0.2.1.2.0.1.0.2 25-. .88 21. .57 11.76 4789 1.0, 1.0.2.1.0.2 10., 20 24. .31 16.47 4795 1,2,1,0,2,1,0,2 18. .43 21., 96 14.90 4798 1.0.2.0.2.1.0.2 15., 29 23., 53 13.33 4800 0,1,2,0,2,1,0,2 25., 10 23. .14 7.45 4809 0.1,0,1,2,1,0,2 30., 20 18., 04 13.73 4894 1.2.0.1.0.2.0.2 21. 57 21., 96 13.33 4906 1.0,2,1,0,2,0,2 10. 20 25. .10 17.25 49S7 1,2,1,0,1,2,0,2 18., 43 25., 49 9.80 4960 1.0,2,0,1,2,0,2 21. 18 20., 12 12.16 4962 0,1,2,0,1,2,0,2 15. 29 24. .31 12.55 4"998 0.1.0.2.1.2.0.2 18., 43 26. .67 10.20 5002- 1,2,0,2,1,2,0,2 17.65 65.75 12.55 5005 1.0,1,2,1,2,0,2 18., 43 23. .92 12.55 5203 1.0.2.0.1.0.1.2 18., 43 23.92 92.37 5205 0,1,2,0,1,0,1,2 15., 29 22., 75 13.73 5241 0.1.0.2.1.0.1.2 23. .53 23. .14 10.20 5245 1,2,0,2,1,0,1,2 18., 43 25. 10.10 10.93 5248 1.0,1,2,1,0,1,2 17., 65 22. .35 10.98 5253 0.2,1,2,1,0,1,2 18., 43 23.92 12.16 5275 1.0,1,0,2,0,1,2 18. 43 24., 31 10.20 5280 0.2, 1.0.2.0.1.2 21. .96 22. .35 9.41 APPENDIX I 5298 0.2,0,1,2,0,1,2 15.29 27 34 13.73 5299 1,2,0,1,2,0,1,2 22. 35 24 31 12.16 5311 1, 0.2.1, 2.0, 1 > 2 20. 00 25 10 6.67 5313 0,1,2,1,2,0,1,2 23. 53 23 53 9.41 5622 0.2,0,1,0,2,1.2 18 43 24 31 11.37 5635 1.0.2.1.0.2.1.2 18 43 20.00 16.47 5637 0,1,2,1,0,2,1,2 21 18 20 00 13.73 5646 0.1.0.2.0.2.1.2 22 75 22 .75 10.98 -5653 1.0,1,2,0,2,1,2 18 43 23 .92 12.16 5658 0.2,1,2,0,2,1,2 20 39 21 .96 11.76 5685 0.2,1,0,1,2,1,2 18 43 24 .31 10.98 5691 0,1,2,0,1,2,1,2 10 20 24 .31 14.51 .32 20 85 23 17 11.59 33 APPENDIX I

Claims (40)

  1. CLAIMS 1. A bar code to represent encoded data that is capable of being scanned by a bar code reader, such code is characterized in that it comprises: _ a plurality of columns, each column is formed from a plurality of cells, and each column that represents an original value, each cell in each column that has a color associated with it, each color is either a first set of colors or a second set of colors, each color within each set of colors which has a value assigned to it, where in each column, the cells are either the first set of colors or the second set of colors, where the adjacent columns are not formed from the same set of colors, and where the continuous cells in each cell column are not formed from the same color within the set of colors.
  2. 2. The barcode according to claim 1, characterized in that an original value of each column is calculated by: n (t)? 3k Cell ValueOO p where n is the first position of the cells in the column, n (t) the total number of cells in the cell column, k is the position of the cell within the column and Cell value (k) is the value of a cell placed in position k.
  3. The barcode according to claim 2, characterized in that the original value of each column is correlated to a data value, a Reed-Soloman value or a miscellaneous value, the data value, the _ Reed-Soloman value or the miscellaneous value that represents the encoded data within the bar code.
  4. 4. The bar code according to claim 1, characterized in that the first set of colors are red, green and blue. "" "
  5. 5. The bar code according to claim 4, characterized in that the red color has a value of 0, the green color has a value of 1, and the blue color has a value of 2.
  6. 6. The barcode according to claim 1, characterized in that the first set of colors are additive colors.
  7. 7. The barcode according to claim 1, characterized in that the first set of colors are cyan, magenta and yellow.
  8. 8. The bar code according to claim 7, characterized in that the color cyan has a value of 0, the color magenta has a value of 1 and the color yellow has a value of 2.
  9. 9. The barcode of compliance with claim 1, characterized in that the first set of colors are subtractive colors.
  10. The barcode according to claim 1, characterized in that the first set of colors are red, green and blue and the first set of color are_ cyan, magenta and yellow. "
  11. 11. The code of _ bars in accordance with claim 10, characterized in that the red color has a value of 0, the green color has a value of 1 and the blue color has a value of 2, and the cyan color has a value of 0, the magenta color has a value of 1, and the yellow color has a value of 2.
  12. 12. The barcode according to claim 1, characterized in that each column is of a width of one cell and of a length of eight cells.
  13. 13. The barcode according to claim 1, characterized in that ninety-four columns are provided.
  14. 14. The bar code according to claim 13, characterized in that the first forty-seven columns represent data values and the second forty-seven columns represent Reed-Soloman check digit values.
  15. 15. The bar code according to claim 14, characterized in that it also includes twelve columns to represent the information of the structure of the bar code.
  16. 16. The bar code according to claim 1, characterized in that the columns representing the data have first and last columns, and also include search columns adjacent to the first and last columns.
  17. 17. The bar code according to claim 16, characterized in that the search columns are black.
  18. The barcode according to claim 1, characterized in that the first column in the bar code that is formed from one of the first or second set of active colors and the last column in The bar code are formed from the first or second sets of active colors.
  19. 19. The method of reading the barcode formed according to claim 1, characterized in that the column has an upper cell and a lower cell, the method is characterized in that it comprises the steps of: (a) providing a code reader of bars; (b) locating the upper cell of the column to be decoded using the bar code reader; (c) scanning from the upper cell to the lower one of the column to be decoded until all the cells in the column that are decoded have been traversed; (d) storing the color of each cell in the column to be decoded in an arrangement; (e) repeating steps (a) to (d) for each column to be decoded until the column has been decoded; - (f) convert each provision to an original value; and (g) correlating the original value to a data value, Reed-Soloman value or a miscellaneous value, the data value, the Reed-Soloman value, or the miscellaneous value representing the encoded data within the bar code.
  20. 20. The method according to claim 19, characterized in that the bar code has first and last column and a plurality of columns between them and where the columns are decoded in order from the first to the last.
  21. 21. The method according to the claim 19, characterized in that in step (f), such an arrangement is converted to an original value number by use of the formula: n (t)? 3 Cell Value (k) n _ where n is the first position of the cells in the column, n (t) is the total number of cells in the cell column, k is the position of the cell within the column and Cell Value (k) is the value of a cell placed in position k.
  22. 22. A method in accordance with the claim 19, characterized in that step (c) is executed by: (cl) determining the color of the upper cell; (c2) scanning down from the upper cell to the cell next to the same cell using a predetermined scan angle until the cell next to the upper cell is scanned; (c3) determine the _ color of the next cell scanned; (c4) Determine if the color of the next scanned cell is in the same color as the upper cell, ~ T (c5) where if the color of the next scanned cell is not the same color set as the upper cell, change the scan angle and explore the other cell next to the upper cell and determine if the color of this last scanned cell is in the same set of colors as the upper cell; (c6) where if the color of the next scanned cell is in the same set of colors as the upper cell, the last cell scanned is in the column and therefore the scan downwards from it using the angle. default scan for the cell next to it; (c7) explore and determine the color of the last cell scanned; (c8) Determine if the color of the last cell scanned is in the same set of colors as the previously scanned cell, (c9) where if the color of the last cell scanned is not in the same set of colors as the cell previously scanned, change the scan angle and explore another cell next to the cell previously scanned and determine if the color of this final scanned cell is in the same set of colors as the previously scanned cell; (clO) where if the color of the last cell scanned is in the same set of colors as the previously scanned cell, the last cell scanned is the next cell in the column "and later, repeat the steps (c6) - (c9) ) until the end of the column to be scanned is reached - 23. The method according to claim 19, characterized in that the ^^ bar code includes a vertical search pattern adjacent to the first column and a pattern horizontal search, the top cell of each column, and where the top cell of the first column is located using the reader _Se barcode to locate the vertical search pattern and the horizontal search pattern; Scanning the barcode to find the corners upper right, lower right and left lower bar code to define the size of the barcode, approaching the position of the upper cell of the first column using the size of the barcode. bars . 24. The method according to claim 23, characterized in that a central point of the upper cell of the first column is approximated using the approximate size and shape of the upper cell of the first column. 25. The method according to claim 19, "" characterized in that if the bar code is damaged and the steps (a) to (g) can not decode the entire length of one of the columns, the values obtained using the steps ( a) to (g) are stored in such an arrangement, and the following steps are carried out to decode each column that has not been decoded by steps (a) to (g): (h) locate the lower_cell of the column that it has not been decoded using the barcode reader; (i) scanning to the top the column that has not been decoded until all the cells in the column that have not been decoded have been decoded and traversed; _ (j) store the color of each cell in the column that has not been decoded in the layout; and I (k) convert the arrangement into a number representing the encoded data within the bar code. 26. The method according to claim 25, characterized in that step (i) is executed by: (íl) determining the color of the lower cell; (i2) scan upward from the lower cell to the cell next to it using a predetermined scan angle until the cell next to the lower cell is scanned, "~ (13) determine the color of the next cell scanned; (i4) Determine if "the color of the next scanned cell is in the same set of colors as the lower cell, __ (i5) where if the color of the next scanned cell is not the same set of colors as the lower cell , change the scan angle and explore the other cell next to the lower cell and determine if the color of this last scanned cell "is in the same set of colors as the lower cell; (i6) where yes the color of the next one The scanned cell is in the same set of colors as the lower cell, the next cell scanned is in the column that is being scanned and then it will be upwards from it using the default scan angle to the cell next to it; i7) explore and determine the color of the last cell scanned; (i8) determine if the color of the last scanned cell is in the same set of colors as the previously scanned cell, (i9) where yes _the color of the last cell scanned is not in the same set of colors as the cell previously scanned, change the scanning angle ~ and explore another cell next to the previously scanned cell and determine if the color of this final scanned cell is in the same set of colors as the previously scanned cell; (ilO) where if the color of the last cell scanned is in the same set of colors as the cell previously scanned, the last cell scanned is the next cell in the column "and later, repeat the steps (i7) - (i9) ) until the final end of the column to be scanned is reached 27. The bar code according to claim 1, characterized in that the column has upper and lower cells, the upper and lower cells that "are Different colors within the sets of colors from which the cells in the column are formed. 28. The barcode according to claim 27, characterized in that an original value of the column is calculated by: n (t)? 3k Cell Value (k) n where n is the first position of the cells in the column, n (t) is the total number of cells in the cell column, k is in the position of the cell within the column, and Cell Value (k) is the value of the cell placed in position k. 29. The bar code according to claim 28, characterized in that the original value of each column is correlated with a data value, a Reed-Soloman value or a miscellaneous value, the data value, the Reed-Soloman value or the miscellaneous value representing the data encoded within the barcode 30. The method of reading a bar code, formed according to claim 27, characterized in that each column has an upper cell and a lower cell, the method comprises the stages of: (a) providing a bar code reader; (b) locating the upper cell of the column to be decoded using the bar code reader; (c) scanning from the upper cell to the lower one of the column to be decoded until all the cells in the column that are decoded have been traversed; (d) storing the color of each cell in the column to be decoded in an arrangement; (e) repeating steps (a) to (d) for each column that "will be decoded until the column has been decoded; (f)" convert each disposition to an original value; and (g) correlating the original value to a data value, Reed-Soloman value or a miscellaneous value, the data value, the Reed-Soloman value, or the miscellaneous value representing the encoded data within the bar code . 31. The method according to claim 30, characterized in that the bar code has first and last columns and a plurality of columns between them, and in "where the columns are ~" decoded in order of the first to the last. 32. The method according to claim 30, characterized in that in step (f), such an arrangement is converted to the original value number, by using the formula: n (t) T, 3 Cell Value (k) n where n is the first position in the cells in the column, n (t) is the total number of cells in the column of cell, k is the position of the cell within the column and Cell Value (k) is the value of the cell placed in position k. 33. The method according to claim 30, characterized in that step (c) is executed by: (cl) determining the color of the upper cell; (c2) scanning down from the upper cell to the cell next to the isma using a predetermined scan angle until the cell next to the upper cell is scanned; _ (c3) determine the color of the next cell scanned; (c4) determine if the color of the next scanned cell is in the same color as the upper cell, - (c5) where if the color of the next scanned cell is not the same color set as the upper cell, change the color angle of exploration and explore the-another cell next to the upper cell and determine if the color of this last cell scanned is in the same set of colors as the upper cell; (c6) where if the color of the next cell scanned is in the same set of colors as the upper cell, the last cell scanned is in the column and therefore the scan downwards from it using the predetermined scan angle for the cell next to it; (c7) explore and determine the color of the last cell scanned; (c8) Determine whether the color of the last cell scanned is in the same set of colors as the previously scanned cell, (c9) where yes _the color of the last cell scanned is not in the same set of colors as the cell previously scanned, change the scan angle and explore another cell next to the previously scanned cell and determine if the color of this final scanned cell is in the same set of colors as the previously scanned cell; (clO) where if the color of the last cell scanned is in the same set of colors as the "cell previously scanned, the last cell scanned is the next cell in column ^ and later, repeat steps (c6) - (c9) until the end of the column to be scanned is reached. 34. The method according to claim 30, characterized in that the bar code further includes a vertical search pattern adjacent to the first column and a horizontal search pattern of such an upper cell of each column, and wherein the upper cell of the first column is located using the bar code reader to locate the vertical search pattern and the horizontal search pattern; explore such bar code to find the corners top right, bottom right and bottom left of the barcode to define the size of the bar code, approximating the position of the top cell of the first column using the bar code size. 35. The method according to claim 34, characterized in that a central point of the upper cell of the first column is approximated using the approximate size and shape of the first upper cell of the first column. 36. The method according to claim 30, characterized in that if the bar code is damaged and steps (a) to (g) can not decode the full length of one such column, the values obtained using the steps (a ) a (g) are saved in such an arrangement and the following steps are carried out to decode each column that has not been decoded by steps (a) to (g); (h) locate - the bottom cell of the column that has not been decoded using the bar code reader; (i) scanning to the top the column that has not been decoded until all the cells in the column that have not been decoded have been decoded and traversed; "(j) store the color of each cell in the column that has not been decoded in the arrangement, and (k) convert the arrangement to a number that represents the data encoded within the bar code. with claim 36, "characterized in that step (i) is executed by: (il) determining the color of the lower cell; (i2) scanning up from the lower cell to the cell next to it using a predetermined scan angle until the cell next to the lower cell is scanned, (i3) determining the color of the next scanned cell; (i4) determine if _: the color of the next scanned cell is in the same set of colors as the lower cell, (i5) where if the color of the next scanned cell is not the same set of colors as the lower cell , change the scan angle and explore the other cell next to the lower cell and determine if the color of this last explored cell is in the same color as the lower cell; (i6) where if the color of the next scanned cell is in the same set of colors as the lower cell, the next scanned cell is in the column that is being "scanned" and then it will be upwards from it using the angle Default scan to the cell next to it; (i7) Scan and determine the color of the last cell scanned; _ (i8) Determine whether the color of the last cell scanned is in the same set of colors as the previously scanned cell , (i9) where if the color of the last cell scanned is not in the same set of colors as the cell previously scanned, change the scan angle and explore another cell next to the previously scanned cell and determine if the color of this cell final scanned cell is in the same set of colors as the previously scanned cell; (ilO) where if the color of the last scanned cell is in the same set of colors that the cell previously explored, the last cell scanned is the next cell in the column and later, repeat the stages (i7) - (i9) until the final end of the column to be explored is reached. 38. The method of coding data in a bar code that can be read by a bar code reader, the method is characterized in that it comprises the steps of: _ (a) forming a numerical frame of a valid set, such a set valid that is formed by the training arrangements in accordance with the following: "(a) provide a first set of colors; (a2) assign values to each of the colors within the first set; (a3) provide a plurality of provisions of the values assigned to the first set, where the continuous numbers in each arrangement are not "the same; (a4) providing a second set of colors; (a5) assign values to each of the colors within the second set; (aß) providing a plurality of dispositions of the values assigned to the second set, where t the continuous numbers in the arrangement are not the same; (b) select the defaults of the valid set to represent the data to be encoded within the bar code; " (c) correlating the predetermined valid set to the colors that are represented by the values within each valid set; (d) forming the bar code by placing a plurality of columns adjacent to each other, each column being formed from one of the valid sets of available color schemes. 39. The method according to claim 38, characterized in that step (aß) further includes the first number and the last number in the arrangement that are not equal. 40. The method according to claim 38, characterized in that the valid set is further limited by using a genetic algorithm to obtain an active set and wherein the values from the active set are used to form such a bar code.
MXPA/A/1999/009196A 1997-04-08 1999-10-07 Distortion resistant double-data correcting color transition barcode and method of generating and using same MXPA99009196A (en)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US60/043,441 1997-04-08

Publications (1)

Publication Number Publication Date
MXPA99009196A true MXPA99009196A (en) 2000-06-01

Family

ID=

Similar Documents

Publication Publication Date Title
EP1016027B1 (en) Distortion resistant double-data correcting color transition barcode and method of generating and using same
US5243655A (en) System for encoding and decoding data in machine readable graphic form
CA2097359C (en) Record with encoded data
US5053609A (en) Dynamically variable machine readable binary code and method for reading and producing thereof
US4939354A (en) Dynamically variable machine readable binary code and method for reading and producing thereof
US7510125B2 (en) Multi-dimensional symbologies and related methods
US5124536A (en) Dynamically variable machine readable binary code and method for reading and producing thereof
US5939700A (en) Bar code symbology capable of encoding 16-bit characters, and method and apparatus for printing and reading same
US6321986B1 (en) Robust machine-readable symbology and method and apparatus for printing and reading same
US5481103A (en) Packet bar code with data sequence encoded in address/data packets
US5126542A (en) Dynamically variable machine readable binary code and method for reading and producing thereof
CN101512561A (en) Bar code authentication
KR100455802B1 (en) Method and apparatus for displaying a time-varying code to a handheld terminal, and method and apparatus for approval and authentication processing by using the same
KR20010006507A (en) Robust machine-readable symbology and method and apparatus for printing and reading same
RU2457537C2 (en) Two-component bar-code
MXPA99009196A (en) Distortion resistant double-data correcting color transition barcode and method of generating and using same
US20020056759A1 (en) Bar code symbology for consumer scanning applications
WO2012035552A2 (en) Generating a code system using haar wavelets
AU655800B2 (en) Systems for encoding and decoding data in machine readable graphic form
US20040176915A1 (en) Apparatus and method for encoding chemical structure information
JPH05290204A (en) Method and device for encoding data to mechanically readable graphic shape and decoding this shape
CA2063103A1 (en) Systems for encoding and decoding data in machine readable graphic form
CA2448709C (en) Record with encoded data
IL104209A (en) Systems for encoding and decoding data in machine readable graphic form