home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 1
/
ARM_CLUB_CD.iso
/
contents
/
education
/
a
/
autopcb
/
!AutoPCB
/
c
/
Plot
< prev
next >
Wrap
Text File
|
1991-04-06
|
3KB
|
135 lines
#include <stdio.h>
#include "werr.h"
#include "cell.h"
extern long GetCell(int, int, int);
extern void move(int, int);
extern void draw(int, int);
extern void circle(int, int, int);
struct _travel
{
int mask;
int x0, y0, x1, y1;
};
static struct
{
int mask;
int x0, y0;
} circle_travel[] =
{
{ HOLE_NORTH, 0, 1 },
{ HOLE_NORTHEAST, 1, 1 },
{ HOLE_EAST, 1, 0 },
{ HOLE_SOUTHEAST, 1, -1 },
{ HOLE_SOUTH, 0, -1 },
{ HOLE_SOUTHWEST, -1, -1 },
{ HOLE_WEST, -1, 0 },
{ HOLE_NORTHWEST, -1, 1 },
{ 0, 0, 0 }
};
static struct
{
int mask;
int x0, y0, x1, y1;
} line_travel[] =
{
{ LINE_HORIZONTAL, -1, 0, 1, 0 },
{ LINE_VERTICAL, 0, -1, 0, 1 },
{ DIAG_NEtoSW, 1, 1, -1, -1 },
{ DIAG_SEtoNW, -1, 1, -1, 1 },
{ CORNER_NORTHEAST, 0, 1, 1, 0 },
{ CORNER_SOUTHEAST, 0, -1, 1, 0 },
{ CORNER_SOUTHWEST, 0, -1, -1, 0 },
{ CORNER_NORTHWEST, 0, 1, -1, 0 },
{ BENT_NtoSE, 0, 1, 1, -1 },
{ BENT_NtoSW, 0, 1, -1, -1 },
{ BENT_EtoSW, 1, 0, -1, -1 },
{ BENT_EtoNW, 1, 0, -1, 1 },
{ BENT_StoNW, 0, -1, -1, 1 },
{ BENT_StoNE, 0, -1, 1, 1 },
{ BENT_WtoNE, -1, 0, 1, 1 },
{ BENT_WtoSE, -1, 0, 1, -1 },
{ ANGLE_NEtoSE, 1, 1, 1, -1 },
{ ANGLE_SEtoSW, 1, -1, -1, -1 },
{ ANGLE_SWtoNW, -1, -1, -1, 1 },
{ ANGLE_NWtoNE, -1, 1, 1, 1 },
{ SHARP_NtoNE, 0, 1, 1, 1 },
{ SHARP_EtoNE, 1, 0, 1, 1 },
{ SHARP_EtoSE, 1, 0, 1, -1 },
{ SHARP_StoSE, 0, -1, 1, -1 },
{ SHARP_StoSW, 0, -1, -1, -1 },
{ SHARP_WtoSW, -1, 0, -1, -1 },
{ SHARP_WtoNW, -1, 0, -1, 1 },
{ SHARP_NtoNW, 0, 1, -1, 1 },
{ 0, 0, 0, 0, 0 }
};
static void traverse(int x0, int y0, int *col, int *row, int side)
{
int i, x, fromcol, fromrow;
fromcol = *col;
fromrow = *row;
*col += x0;
*row += y0;
x = GetCell(*row, *col, side);
if (x & HOLE)
{
draw(*col * 50 + 25, *row * 50 + 25);
}
else
for (i = 0; line_travel[i].mask != 0; i++)
if (x & line_travel[i].mask)
{
if (line_travel[i].x0 == x0 && line_travel[i].y0 == y0)
{
traverse(x0, y0, col, row, side);
}
else if (line_travel[i].x1 == x0 && line_travel[i].y1 == y0)
{
traverse(x0, y0, col, row, side);
}
else if (line_travel[i].x0 == -x0 && line_travel[i].y0 == -y0)
{
draw(*col * 50 + 25, *row * 50 + 25);
traverse(line_travel[i].x1, line_travel[i].y1, col, row, side);
}
else if (line_travel[i].x1 == -x0 && line_travel[i].y1 == -y0)
{
draw(*col * 50 + 25, *row * 50 + 25);
traverse(line_travel[i].x0, line_travel[i].y0, col, row, side);
}
else
werr(0, "Unable to traverse at (%d, %d) from (%d, %d)",
*col, *row, fromcol, fromrow);
}
}
void PlotLine(int x, int col, int row, int side)
{
int i;
if (x & ~HOLE)
{
move(col * 50 + 25, row * 50 + 25);
for (i = 0; circle_travel[i].mask != 0; i++)
if (x & circle_travel[i].mask)
traverse(circle_travel[i].x0, circle_travel[i].y0, &col, &row, side);
}
}