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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2015, 18:51   #1
Тоба
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 86
По умолчанию Нарисовать пазловую сетку на Bitmap

Добрый день уважаемые форумчане.
Вообщем возникла необходимость нарисовать на битмапе пазловую сетку.
Размер каждого пазлика должен быть в пределах(100px условно в зависимости от результатов деления и остатка)
Т.е. пользователь загружает изображение в TImage, допустим 639х478
Создаём буферный битмап аналогичного размера, разбиваем его на условные прямоугольники путём деления.
Получим 6 прямоугольников по горизонтали, и 5 по вертикали
Размер каждого будет 106х95, за исключением правых и нижних- они будут на пару пикселей больше(в зависимости от остатков деления).
Из всего этого мы будем иметь точки (вершины всех прямоугольников).
А теперь к сути: как нарисовать сетку по этим точкам, примерно такую.
Использовал Bitmap.Canvas.Arc и т.п. в итоге запутался в координатах, циклах, массивах и убился головой об стену.
Кто-что думает:
Тоба вне форума Ответить с цитированием
Старый 27.09.2015, 19:07   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Кто-что думает
для начала скоммунизди у кого-нить расчёты отсечений сегментов. Относительные, канешна.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.09.2015, 19:53   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Кто-что думает:
ИМХО PNG использовать дабы была прозрачность...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.09.2015, 20:25   #4
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Никогда не замечал, что пазлы разные. Думалось, что все совершенно одинаковые.
Сегменты сделаны объединением из площадей окружностей с разным радиусом.
А расставить один и тот-же сегмент по координатной сетке, уж тут помогут...

Нарисовать один Bitmap на белом фоне вручную, сохранить в файл. Выводить его по координатам много раз.
Код:
// выведем рисунок
Form1.image1.canvas.Draw(x_bmp,y_bmp,bitmap);
Или так: "Подушечки" все одинаковые, а включенные-исключенные из них окружности по какой-то закономерности.
Репутация: полный "0"

Последний раз редактировалось zvygin1964; 27.09.2015 в 21:03.
zvygin1964 вне форума Ответить с цитированием
Старый 27.09.2015, 20:44   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для начала, разве что радиус побольше. Потом забабахать сопряжение маленькой окружности с каждой из сторон в сторону вогнутости. Вот с этим лень голову морочить
Код:
procedure TForm1.Button1Click(Sender: TObject);
const cWidth = 639;
      cHeight = 478;
      cCols = 6;
      cRows = 5;
var BitMap: TBitmap;
    xWidth,xHeight,i,j,i1,i2,j1,j2,k,ic,jc: Integer;
begin
  Randomize;
  BitMap:=TBitmap.Create;
  BitMap.Width:=cWidth;
  BitMap.Height:=cHeight;
  xWidth:=Round(cWidth/cCols);
  xHeight:=Round(cHeight/cRows);
  i1:=0; i2:=(cHeight-xHeight*(cRows-2)) div 2;
  for i:=1 to cRows do begin
    j1:=0; j2:=(cWidth-xWidth*(cCols-2)) div 2;
    for j:=1 to cCols do begin
      if j<cCols then begin
        k:=Round((i2-i1)*Sqrt(3)/2);
        ic:=i1+(i2-i1) div 2;
        if Random(2)=0 then begin jc:=j2-k; BitMap.Canvas.Arc(jc-i2+i1,ic-i2+i1,jc+i2-i1,ic+i2-i1,j2,i2,j2,i1); end
                       else begin jc:=j2+k; BitMap.Canvas.Arc(jc-i2+i1,ic-i2+i1,jc+i2-i1,ic+i2-i1,j2,i1,j2,i2); end;
      end;
      if i<cRows then begin
        k:=Round((j2-j1)*Sqrt(3)/2);
        jc:=j1+(j2-j1) div 2;
        if Random(2)=0 then begin ic:=i2-k; BitMap.Canvas.Arc(jc-j2+j1,ic-j2+j1,jc+j2-j1,ic+j2-j1,j1,i2,j2,i2); end
                       else begin ic:=i2+k; BitMap.Canvas.Arc(jc-j2+j1,ic-j2+j1,jc+j2-j1,ic+j2-j1,j2,i2,j1,i2); end;
      end;
      j1:=j2; Inc(j2,xWidth);
    end;
    i1:=i2; Inc(i2,xHeight);
  end;
  Image.Width:=BitMap.Width;
  Image.Height:=BitMap.Height;
  Image.Picture.Bitmap.Assign(BitMap);
  BitMap.Free;
end;
Изображения
Тип файла: jpg Безымянный.jpg (46.5 Кб, 133 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.09.2015, 21:09   #6
Тоба
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 86
По умолчанию

Спасибо.
Я немного делал по другому, но есть что подчерпнуть из вашего кода.
Уже что-то.
Тоба вне форума Ответить с цитированием
Старый 27.09.2015, 21:40   #7
Тоба
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 86
По умолчанию

Да, и ещё..
Мы ведь заранее не знаем количество условных прямоугольников по горизонтали
и вертикали, нам известны только ширина и высота битмапа.
Надо всё это дело расчитать, исходя из того, что размер каждого пазлика должен быть 100px(+ -)
Ведь пользователь может загрузить картинку размером скажем так 833х199
Тоба вне форума Ответить с цитированием
Старый 28.09.2015, 18:20   #8
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Задача понравилась. Сделаю. Каковы сроки?
ResourceSpace вне форума Ответить с цитированием
Старый 28.09.2015, 20:54   #9
Тоба
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 86
По умолчанию

Да ограничивающих сроков как таковых нет.
Я написал прогу Пазлы (пока прототип) - всё работает
Но работает по одному шаблону, т.е. изображение, которое
разбивается на сегменты(пазлики)должно иметь фиксированные
ширину и высоту.

А если написать этот скажем так генератор пазловой сетки,
то можно будет разбить любое изображение на разное количество пазликов(типа уровень сложности).
Любое в смысле - с разной шириной и высотой.
вот мои наработки:
Вложения
Тип файла: rar Пазловая сетка.rar (169.9 Кб, 48 просмотров)

Последний раз редактировалось Тоба; 28.09.2015 в 21:06. Причина: Добавление
Тоба вне форума Ответить с цитированием
Старый 28.09.2015, 21:16   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Мы ведь заранее не знаем количество условных прямоугольников по горизонтали и вертикали, нам известны только ширина и высота битмапа.
Вполне достаточно. Зная ширину картинки и примерную ширину пазла можно вычислить их количество по ширине. Аналогично по высоте. Ширину и высоту брал бы примерно одинаковую. Уменьшая эту примерную ширину и высоту усложнял бы. Можно еще вращение и/или изменение цвета для усложнения
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарисовать сетку 3JIou_geg C# (си шарп) 0 06.04.2015 01:57
Нарисовать полупрозрачный прямоугольник на Bitmap или Image DeGroup C++ Builder 2 30.04.2012 11:43
Как нарисовать сетку в ListView? Сергей089 Помощь студентам 1 18.08.2010 09:09
из-за чего появляется полоса (на скрине) при вставке BitMap в TImage? - Проблема с Bitmap Grey@2009 Мультимедиа в Delphi 2 02.01.2010 20:23