Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2013, 15:12   #11
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от alextrof94 Посмотреть сообщение
http://astralax.ru/articles/pathway вот нашел еще тогда. размер поля 500х500, сотни юнитов.

"...На карте размером 504 × 504...
... на процессоре Celeron 1000 (разогнанный 667)..."
Ни один уважающий себя разработчик не будет работать на разогнанном процессоре (собственно, на Селероне - тоже не будет). Поэтому вывод здесь может быть только один - статья написана не квалифицированным профессионалом, а школьником, точно так же, как и Вы, не имеющим опыта.

Ваше желание перенять у кого-то опыт - понятно, но Вы для этого выбрали неподходящий объект.
s-andriano вне форума Ответить с цитированием
Старый 26.05.2013, 03:30   #12
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Не получается сменить часть битмапа корректно.
Код:
procedure TPathFinder.DrawSquare(x1, y1, x2, y2: integer);
var i,j: integer;
begin
  for j:=y1 to y2 do
    for i:=x1 to x2 do
      DrawPixel(i,j);
end;

procedure TPathFinder.DrawPixel(x, y: integer);
var Row: pByteArray;
begin
  Row := pByteArray(Bmp.Scanline[y]);
  Row[x div 8] := (x mod 8 or Row[x div 8]);//проблемная строка
end;
Собственно не получается сменить нужный бит в нужном месте. Как это сделать?
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 26.05.2013, 04:17   #13
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Так. Немного разобрался... Я присваиваю байту определенное десятичное число, а надо двоичное...т.е. если х=30, то я присваиваю (30%8) 3 (00000011) or row[3](01110000) = (01110011), а надо (00000100 or 01110000 = 01110100), да еще и номер байта неверный.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 26.05.2013, 16:30   #14
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Код:
1 shl (x mod 8)
Как-то так.
Номер бита нужно не записывать в битмап, а использовать для сдвига нужного бита, записываемого в битмап.
s-andriano вне форума Ответить с цитированием
Старый 26.05.2013, 17:01   #15
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Код:
1 shl (x mod 8)
Как-то так.
Номер бита нужно не записывать в битмап, а использовать для сдвига нужного бита, записываемого в битмап.
сдвиг? откуда? куда? вот чего я не понимаю.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 26.05.2013, 17:13   #16
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Код:
  PathFinder.DrawSquare(50,50,59,59);
...
procedure TPathFinder.DrawSquare(x1, y1, x2, y2: integer);
var i,j: integer;
begin
  for j:=y1 to y2 do
    for i:=x1 to x2 do
      DrawPixel(i,j);
end;
...

procedure TPathFinder.DrawPixel(x, y: integer);
var Row: pByteArray; b,mask,bitIdx,byteIdx:Byte;
begin
  Row := pByteArray(Bmp.Scanline[y]);
  Row[x div 8] :=1 shl (x mod 8);
end;
рисует вот это (2 полосы, в начале первого нужного байта(48бит) и собственно там где должен закончится квадрат (60бит)), а хочется квадрат (от 51 до 60, с высотой все норм хотя бы):
Изображения
Тип файла: png Безымянный.png (4.2 Кб, 58 просмотров)
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 26.05.2013, 19:17   #17
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от alextrof94 Посмотреть сообщение
сдвиг? откуда? куда? вот чего я не понимаю.
А Вы нарисуйте на бумаге, как выглядит строка экрана.
По сути - 1 бит на 1 пиксел.
Если, скажем, длина строки 640 пискелей, значит, это будет 80 байтов.
Грубо изображу приметно так:
|bbbbbbbb|bbbbbbbb|bbbbbbbb|bbbbbbb b|bb....
здесь я обозначил буквой b биты, а вертикальная черта - граница между байтами. Всего до многоточия уместилось 4.25 байт, 34 бита-пикселя.
Допустим, у нас есть строка изображения:
|00101100|00001000|10001001|0001000 0|10....
пусть здесь для определенности 0 - черный, а 1 - белый.
и нам нужно закрасить белым 12-й пиксель.
Вычисляем 12 div 8 = 1, т.е. нам нужен 1-й байт (байты считаем с 0)
|00001000|
из этого байта нужен 12 mod 8 = 4, т.е. 4-й бит:
|00001000|
берем 1, (в двоичном коде 00000001) вдвигаем ее влево на 4, чтобы получить 4-й бит: 00010000, после чего нам нужно совместить новый пиксель с исходным изображением, для чего используем операцию or:
|00001000|
or
|00010000|
=
|00011000|

Я привел только часть формулы, убирать из нее исходный байт нельзя, т.к. мы должны изменить только 1 бит, а остальные 7 должны остаться неизменными.
Код:
Row[x div 8] := ((1 shl (x mod 8)) or Row[x div 8]);

Последний раз редактировалось s-andriano; 26.05.2013 в 19:19.
s-andriano вне форума Ответить с цитированием
Старый 26.05.2013, 20:24   #18
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
А Вы нарисуйте на бумаге, как выглядит строка экрана.
По сути - 1 бит на 1 пиксел.
Если, скажем, длина строки 640 пискелей, значит, это будет 80 байтов.
Грубо изображу приметно так:
|bbbbbbbb|bbbbbbbb|bbbbbbbb|bbbbbbb b|bb....
здесь я обозначил буквой b биты, а вертикальная черта - граница между байтами. Всего до многоточия уместилось 4.25 байт, 34 бита-пикселя.
Допустим, у нас есть строка изображения:
|00101100|00001000|10001001|0001000 0|10....
пусть здесь для определенности 0 - черный, а 1 - белый.
и нам нужно закрасить белым 12-й пиксель.
Вычисляем 12 div 8 = 1, т.е. нам нужен 1-й байт (байты считаем с 0)
|00001000|
из этого байта нужен 12 mod 8 = 4, т.е. 4-й бит:
|00001000|
берем 1, (в двоичном коде 00000001) вдвигаем ее влево на 4, чтобы получить 4-й бит: 00010000, после чего нам нужно совместить новый пиксель с исходным изображением, для чего используем операцию or:
|00001000|
or
|00010000|
=
|00011000|

Я привел только часть формулы, убирать из нее исходный байт нельзя, т.к. мы должны изменить только 1 бит, а остальные 7 должны остаться неизменными.
Код:
Row[x div 8] := ((1 shl (x mod 8)) or Row[x div 8]);
Дело в том, что я тоже пробую и так и сяк подгонять... И так я уже пробовал, итог (черные границы 48-54, 60-64):
Изображения
Тип файла: png Безымянный.png (3.0 Кб, 56 просмотров)
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 26.05.2013, 21:26   #19
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Честно говоря, не понимаю, что на рисунке.
Я обычно для отладки рисую наклонную линию из точек.

Сейчас не помню, давно не имел дела с монохромными изображениями, но, возможно, пиксели нумеруются не с права налево, с а лова направо.
На примере наклонной линии это сразу будет заметно.
s-andriano вне форума Ответить с цитированием
Старый 26.05.2013, 23:14   #20
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Честно говоря, не понимаю, что на рисунке.
Я обычно для отладки рисую наклонную линию из точек.

Сейчас не помню, давно не имел дела с монохромными изображениями, но, возможно, пиксели нумеруются не с права налево, с а лова направо.
На примере наклонной линии это сразу будет заметно.
я пытался нарисовать квадрат 51,51,60,60. сейчас линию попробую рисовать.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск пути в массиве Niken Помощь студентам 9 14.03.2013 22:01
Поиск пути Alexandr555 Общие вопросы C/C++ 5 29.01.2013 20:00
поиск пути Nikita1111 Visual C++ 1 09.02.2012 00:44
Поиск пути Federal Помощь студентам 1 19.06.2011 12:24
поиск пути NiCola999 Общие вопросы C/C++ 19 16.11.2009 09:25