Действующий

ГОСТ Р ИСО/МЭК 16022-2008 Автоматическая идентификация. Кодирование штриховое. Спецификация символики Data Matrix (с Изменением N 1)

Приложение F
(обязательное)

     
Размещение знаков символа в символе версии ЕСС 200

F.1 Программа размещения знаков символа

Следующая программа на языке программирования С генерирует схемы размещения знаков символа:

#include <stdio.h>

#include <alloc.h>

int nrow, ncol, * array;

/* "module" places "chr+bit" with appropriate wrapping within array[ ] */

void module (int row, int col, int chr, int bit)

{ if (row < 0) { row += nrow; col += 4 - ((nrow+4)%8); }

if (col < 0) { col += ncol; row += 4 - ((ncol+4)%8); }

array[row*ncol+col] = 10*chr + bit;

}

/* "utah" places the 8 bits of a utah-shaped symbol character in ECC200 */

void utah(int row, int col, int chr)

{ module(row-2, col-2, chr, 1);

module(row-2,col-1,chr, 2);

module(row-l, col-2, chr, 3);

module(row-1, col-1, chr, 4);

module(row-1, col, chr, 5);

module(row, col-2, chr, 6);

module(row, col-1, chr, 7);

module(row, col, chr, 8);

}

/* "cornerN" places 8 bits of the four special corner cases in ECC200*/

void corner1(int chr)

{ module(nrow-1, 0, chr, 1);

module(nrow-1, 1, chr, 2);

module(nrow-1, 2, chr, 3);

module(0,ncol-2,chr,4);

module(0,ncol-1, chr, 5);

module(1,ncol-1, chr, 6);

module(2,ncol-1, chr, 7);

module(3,ncol-1, chr, 8);

}

void comer2 (int chr)

{ module(nrow-3, 0, chr, 1);

module(nrow-2, 0, chr, 2);

module(nrow-1, 0, chr, 3);

module(0, ncol-4, chr, 4);

module(0, ncol-3, chr, 5);

module(0, ncol-2, chr, 6);

module(0, ncol-1, chr, 7);

module(1, ncol-1, chr, 8);

}

void corner3(int chr)

{ module(nrow-3, 0, chr, 1);

module(nrow-2, 0, chr, 2);

module(nrow-1, 0, chr, 3);

module(0, ncol-2, chr, 4);

module(0, ncol-1, chr, 5);

module(1, ncol-1, chr, 6);

module(2, ncol-1, chr, 7);

module(3, ncol-1, chr, 8);

}

void corner4(int chr)

{ module(nrow-1,0, chr,1);

module(nrow-1, ncol-1 ,chr,2);

module(0, ncol-3, chr,3);

module(0, ncol-2, chr,4);

module(0, ncol-1, chr,5);

module(1, ncol-3, chr,6);

module(1, ncol-2, chr,7);

module(1, ncol-1, chr,8);

}

/* "ecc200" fills an nrow x ncol array with appropriate values for ECC200*/

void ecc200(void)

{ int row, col, chr;

/* First, fill the array[ ] with invalid entries*/

for (row=0; row<nrow; row++) {

for (col=0; col<ncol; col++) {

array[row*ncol+col] = 0;

}

}

/* Starting in the correct location for character #1, bit 8,. */

chr= 1; row = 4; col = 0;

do {

/* repeatedly first check for one of the special corner cases, then... */

if ((row == nrow) && (col == 0)) corner1 (chr++) ;

if ((row == nrow-2) && (col == 0) && (ncol%4)) corner2 (chr++) ;

if ((row == nrow-2) && (col == 0) && (ncol%8 == 4)) сorner3 (chr++) ;

if ((row == nrow+4) && (col == 2) && (!(ncol%8))) corner4 (chr++) ;

/* sweep upward diagonally, inserting successive characters,... */

do {

if ((row < nrow) && (col >= 0) && (!array[row*ncol+col]))

utah (row, col, chr++);

row -= 2; col += 2;

} while ((row >= 0) && (col < ncol)) ;

row += 1; col += 3;

/* & then sweep downward diagonally, inserting successive haracters,... */

+

do {

if ((row >= 0) && (col < ncol) && (!array[row*ncol+col]))

utah (row, col, chr++);

row += 2; col -= 2;

} while ((row < nrow) && (col >= 0));

row += 3; col += 1;

/*... until the entire array is scanned */

} while ((row < nrow) || (col < ncol));

/* Lastly, if the lower righthand corner is untouched, fill in fixed pattern */

if (!array[nrow*ncol-1]) {

array[nrow*ncol-1] = array[nrow*ncol-ncol-2] = 1;

}

}

/* "main" checks for valid command line entries, then computes & displays array */

void main (int argc, char *argv[ ])

{ int x, y, z;

if (argc =< 3) {

printf("Command line: ECC200 #_of_Data_Rows #_of_Data_Columns\n");

} ELSE {

nrow = ncol = 0;

nrow = atoi(argv[1]); ncol = atoi(argv[2]);

if ((nrow >= 6) && (~nrow&0x0l) && (ncol >= 6) && (~ncol&0x01)) {

array = malloc(sizeof(int) * nrow * ncol);

ECC200 ( );

for (x=0; x<nrow; x++) {

for (y=0; y<ncol; y++) {

z = array[x*ncol+y];

if (z==0) printf ("WHI");

ELSE if (z == 1) printf ("BLK") ;

ELSE printf ("%3d.%d",z/10,z%10) ;

}

Printf ("\n") ;

}

Free (array);

}

}

}

________________

Процедура "module" записывает в матрицу array[ ] числа вида "10* chr+bit", где chr - порядковый номер знака символа, a bit - номер бита данного знака символа, которые записывают, начиная с первого знака и бита.

Процедура "Utah" размещает 8 битов знака символа, имеющего форму штата Юта, в символе версии ЕСС200.

Процедура "corner" размещает 8 битов для четырех специальных угловых случаев в символе версии ЕСС200.

Процедура "есс200" заполняет nrow x ncol массив соответствующими значениями для символа версии ЕСС200.

Сначала заполняют массив array[ ] недопустимыми значениями.

Фиксируют начальное положение модуля в матрице для знака с порядковым номером (chr) 1 и бита с номером 8 и начинают заполнять матрицу.

Повторно (в цикле) проверяют на предмет одного из специальных угловых случаев, тогда … .

Продвигаясь вверх по диагонали, вставляют последовательные знаки,... .

Затем продвигаясь вниз по диагонали, вставляют последовательные знаки... .

...пока не просмотрят весь массив.

И наконец, если не заполнен нижний правый угол, заполняют его, используя фиксированный шаблон.

Процедура "main" проверяет правильность командной строки, затем вычисляет и отображает массив array.

F.2 Правила размещения знаков символа

F.2.1 Нетипичная форма знака символа

Ввиду того, что знаки символа типичной формы не всегда могут быть размещены в границах модулей данных в символе и в некоторых его углах, необходим небольшой набор знаков символа нетипичной формы. Установлено шесть условий размещения - два условия размещения на границах, которые действуют во всех форматах символа, и четыре различных условия размещения в углах, которые применимы для отдельных форматов символа:

a) одну часть знака символа нетипичной формы размещают на одной стороне символа и другую - на противоположной. Это условие применяют к двум базовым формам знака символа (рисунок F.1). Варианты таких компоновок зависят от взаимосвязи между строками на левой и правой границах (таблица F.1);

b) одну часть знака символа размещают на верхней границе символа, а другую - на нижней. Это условие применяют к двум базовым формам знака символа (рисунок F.2). Варианты такой компоновки зависят от взаимосвязи между столбцами на верхней и нижней границах (таблица F.1);

c) четыре знака символа нетипичной формы распределяют по двум или трем углам (рисунки F.3-F.6). Знаки символа нетипичной формы размещают на противоположных границах. Число таких пар возрастает прямо пропорционально периметру координатной матрицы. Базовые комбинации представлены на рисунках F.1 и F.2. На рисунке F.1 модули а8 и а7 находятся в одной и той же строке, так же как и модули b7 и b6. На рисунке F.2 модули с6 и с3 находятся в одном и том же столбце, так же как и модули d3 и d1. Существует семь вариантов размещения знаков символа на границах, которые определяют относительное положение знаков символа по вертикали (рисунок F.1), положение по горизонтали (рисунок F.2) и условия размещения в углах.


Таблица F.1 - Факторы, определяющие вариант размещения на границах

Вариант размещения на границах

Взаимосвязь модулей а8 и а7 в строках

Взаимосвязь модулей с6 и с3 в столбцах

Рисунок, поясняющий условия в углах

Используемые отображающие матрицы

Рисунки приложения F с примером

1

Строка с модулем а7 = строке с модулем а8

Столбец с модулем с3= столбцу с модулем с6

нет

Квадратные: 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96 и 120

F.9 и F.16

2

Строка с модулем а7= строке с модулем а8-2

Столбец с модулем с3= столбцу с модулем с6-2

нет

Квадратные: 10 и 18

F.10 и F.17

3

Строка с модулем а7= строке с модулем а8+4

Столбец с модулем с3= столбцу с модулем с6+4

F.3

Квадратные: 12, 20, 28, 36, 44, 108 и 132

F.11 и F.18

4

Строка с модулем а7= строке с модулем а8+2

Столбец с модулем с3= столбцу с модулем с6+2

F.4

Квадратные: 14 и 22

F.12 и F.19

5

Строка с модулем а7= строке с модулем а8

Столбец с3= столбцу с модулем с6+2

F.5

Прямоугольные: 6x16 и 14x32

F.13

6

Строка с модулем а7= строке с модулем а8

Столбец с модулем с3= столбцу с модулем с6-2

нет

Прямоугольные: 10x24 и 10x32

F.14

7

Строка с модулем а7= строке с модулем а8+4

Столбец с модулем с3= столбцу с модулем с6+2

F.6

Прямоугольные: 6x28 и 14x44

F.15