Максим Кич писал(а):Отступы для всех актуальны, просто это не сразу приходит.
А в плане кода, по мне лучше действительно взять код из Вики и не мучиться. Проверку на прозрачность надо вставить туда, где в примере вызов SetPixel, причём первый вызов за пределами цикла можно опустить, поскольку в этой точке по определению будет находиться один из двух персонажей.
Ну я имел в том плане не актуальны, что мне их не видно...
И для меня отступы не несут из за этого смысловой нагрузки...
Не буду я же считать сколько пробелов перед каждой строкой...
Я тогда просто с ума сойду...
А вобще согласен это хороший тон программирования.
И весьма повышает читабельность.
А по поводу алгоритма...
Мне больше вот отсюда код нравится...
http://compgraphics.info/2D/Brezenham.php
На мой взгляд понятно и сердито
вот адаптировал его немножко...
Код: Выделить всё
bool line( int x1, int y1, int x2, int y2)
{
bool isSeen = true;
int dx = (x2 - x1 >= 0 ? 1 : -1);
int dy = (y2 - y1 >= 0 ? 1 : -1);
int lengthX = abs(x2 - x1);
int lengthY = abs(y2 - y1);
int length = max(lengthX, lengthY);
// if (length == 0)
// {
// SetPixel(hdc, x1, y1, 0);
// }
if (lengthY <= lengthX)
{
// Начальные значения
int x = x1;
int y = y1;
int d = -lengthX;
// Основной цикл
length++;
for (int i = 2; i <= length; i ++)
{
if (BlockingTile(x, y))
{
isSeen = false;
break;
}
x += dx;
d += 2 * lengthY;
if (d > 0) {
d -= 2 * lengthX;
y += dy;
}
}
}
else
{
// Начальные значения
int x = x1;
int y = y1;
int d = - lengthY;
// Основной цикл
length++;
for (int i = 2; i<= length; i++)
{
if (BlockingTile(x, y))
{
isSeen = false;
break;
}
y += dy;
d += 2 * lengthX;
if (d > 0) {
d -= 2 * lengthY;
x += dx;
}
}
}
return isSeen;
}
Хотя там автор почему-то упоминает момент когда разница между расстояниями равна нулю,
т.е. (x2 - x1) = (y2 - y1),
то мол это отдельный случай и говорит что надо выйти тогда из цикла...
Этот момент закомментен здесь...
Вот только из-за этого и не включаю его в свой исходник...