Я предлагаю следующее (C / pseudocode mix):
void draw_outline(int x1, int y1, int x2, int y2)
{
int x, y;
double slope;
if (abs(x2-x1) >= abs(y2-y1)) {
// line closer to horizontal than vertical
if (x2 < x1) swap_points(1, 2);
// now x1 <= x2
slope = 1.0*(y2-y1)/(x2-x1);
draw_pixel(x1-1, y1, '*');
for (x = x1; x <= x2; x++) {
y = y1 + round(slope*(x-x1));
draw_pixel(x, y-1, '*');
draw_pixel(x, y+1, '*');
// here draw_line() does draw_pixel(x, y, '#');
}
draw_pixel(x2+1, y2, '*');
}
else {
// same as above, but swap x and y
}
}
Редактировать : Если вы хотите, чтобы последовательные линии соединялись без проблем, я думаю, вам действительно нужно нарисовать все контурыв первом проходе, а затем линии.Я отредактировал код выше, чтобы нарисовать только контуры.Функция draw_line()
будет точно такой же, но с одним draw_pixel(x, y, '#');
вместо четырех draw_pixel(..., ..., '*');
.И тогда вы просто:
void draw_polyline(point p[], int n)
{
int i;
for (i = 0; i < n-1; i++)
draw_outline(p[i].x, p[i].y, p[i+1].x, p[i+1].y);
for (i = 0; i < n-1; i++)
draw_line(p[i].x, p[i].y, p[i+1].x, p[i+1].y);
}