mirror of
https://github.com/zint/zint
synced 2024-11-16 20:57:25 +13:00
121 lines
3.9 KiB
C
121 lines
3.9 KiB
C
|
/*
|
||
|
* sunburst.c
|
||
|
*
|
||
|
* Many encoding schemes were put forward when the UPC system was being considered,
|
||
|
* and this code encodes numeric data according to one of the more interesting looking
|
||
|
* varieties. The system proposed by Charecogn Systems Inc. doesn't seem to have had
|
||
|
* an official name, but "sunburst" seems appropriate from its appearance. The idea was
|
||
|
* that the symbol would be read by a sensor mounted on a rotating head.
|
||
|
*
|
||
|
* This code takes numeric data and produces an image as an SVG.
|
||
|
*
|
||
|
* More details in US Patent 3,636,317, Filed April 28th 1969.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <math.h>
|
||
|
|
||
|
void print_head(char upc_number[]) {
|
||
|
printf("<?xml version=\"1.0\" standalone=\"no\"?>\n");
|
||
|
printf("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n");
|
||
|
printf(" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
|
||
|
printf("<svg width=\"100\" height=\"100\" version=\"1.1\"\n");
|
||
|
printf(" xmlns=\"http://www.w3.org/2000/svg\">\n");
|
||
|
printf(" <desc>Sunburst %s</desc>\n\n", upc_number);
|
||
|
printf(" <g id=\"sunburst\" fill = \"#000000\">\n");
|
||
|
printf(" <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"#ffffff\" />\n");
|
||
|
}
|
||
|
|
||
|
void print_foot() {
|
||
|
printf(" </g>\n");
|
||
|
printf("</svg>\n");
|
||
|
}
|
||
|
|
||
|
static const char *torrey[11] = {
|
||
|
"01010101", "10010101", "01100101", "10100101", "01010110", "10010110",
|
||
|
"01100110", "10101010", "01011001", "10011001", "01001101"
|
||
|
// Two "surplus" codes were also defined as "01011010" and "10110010"
|
||
|
// In these codes 0 is dark and 1 is light
|
||
|
};
|
||
|
|
||
|
int main(int argc, char** argv) {
|
||
|
|
||
|
int in_length;
|
||
|
char upc_number[12];
|
||
|
char binary[100];
|
||
|
int i;
|
||
|
int posn;
|
||
|
int left, right;
|
||
|
double ax, ay, bx, by, cx, cy, dx, dy;
|
||
|
|
||
|
if (argc != 2) {
|
||
|
/* Only command line input should be the number to encode */
|
||
|
printf("Usage: sunburst {number}\n");
|
||
|
printf("Where {number} is the number to be encoded, up to 11 digits\n");
|
||
|
return 0;
|
||
|
} else {
|
||
|
in_length = strlen(argv[1]);
|
||
|
if (in_length > 11) {
|
||
|
/* Check maximum length */
|
||
|
printf("Input data too long\n");
|
||
|
return 0;
|
||
|
} else {
|
||
|
/* Add padding if needed */
|
||
|
strcpy(upc_number, "");
|
||
|
for(i = in_length; i < 11; i++) {
|
||
|
strcat(upc_number, "0");
|
||
|
}
|
||
|
strcat(upc_number, argv[1]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Check input is numeric */
|
||
|
for (i = 0; i < 11; i++) {
|
||
|
if ((upc_number[i] < '0') || (upc_number[i] > '9')) {
|
||
|
printf("Invalid character(s) in input data\n");
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
strcpy(binary, torrey[10]); // Start
|
||
|
|
||
|
for (i = 0; i < 11; i++) {
|
||
|
strcat(binary, torrey[upc_number[i] - '0']);
|
||
|
}
|
||
|
|
||
|
print_head(upc_number);
|
||
|
|
||
|
posn = 0;
|
||
|
|
||
|
do {
|
||
|
if (binary[posn] == '0') {
|
||
|
for (i = 0; binary[posn + i] == '0'; i++);
|
||
|
left = posn;
|
||
|
right = posn + i;
|
||
|
|
||
|
ax = 50.0 + (18.72 * cos(0.06545 * left - 1.5708));
|
||
|
ay = 50.0 + (18.72 * sin(0.06545 * left - 1.5708));
|
||
|
bx = 50.0 + (50.0 * cos(0.06545 * left - 1.5708));
|
||
|
by = 50.0 + (50.0 * sin(0.06545 * left - 1.5708));
|
||
|
cx = 50.0 + (50.0 * cos(0.06545 * right - 1.5708));
|
||
|
cy = 50.0 + (50.0 * sin(0.06545 * right - 1.5708));
|
||
|
dx = 50.0 + (18.72 * cos(0.06545 * right - 1.5708));
|
||
|
dy = 50.0 + (18.72 * sin(0.06545 * right - 1.5708));
|
||
|
|
||
|
printf(" <path d=\"M %.2f %.2f A 50.00 50.00 0 0 1 %.2f %.2f L %.2f %.2f A 18.72 18.72 0 0 0 %.2f %.2f Z\" />\n",
|
||
|
bx, by, cx, cy, dx, dy, ax, ay);
|
||
|
|
||
|
posn += i;
|
||
|
} else {
|
||
|
posn++;
|
||
|
}
|
||
|
} while (posn < 96);
|
||
|
|
||
|
print_foot();
|
||
|
|
||
|
return (EXIT_SUCCESS);
|
||
|
}
|