Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите алгоритм доски? [D7]


Desk ©   (2006-12-06 06:43:00) 

По которому можно нарисовать текстуру как у доски. Чтобы со всякими разводами и линиями, как у настоящей деревянной доски было.


vidiv   (2006-12-06 19:19:00) [1]

Вот пример: http://vid.sakhgu.sakhalin.ru/tree.png примерно 50kb


vidiv   (2006-12-06 19:15:00) [2]

Форма с одной кнопкой:

procedure TForm1.Button1Click(Sender: TObject);
var Bmp:TBitMap;
   i, j, x, y, s: integer;
   PLine, NewLine:PIntegerArray;
   C:Byte;
const BlurSize = 30;
begin
   Randomize;
   Bmp := TBitmap.Create;
   Bmp.Width := ClientWidth;
   Bmp.Height := ClientHeight;
   Bmp.PixelFormat := pf32bit;

   Bmp.Canvas.Pen.Color := $536974;
   Bmp.Canvas.Brush.Style := bsSolid;
   Bmp.Canvas.Brush.Color := $2D4755;
   Bmp.Canvas.FillRect(Rect(0, 0, Bmp.Width, Bmp.Height));
   Bmp.Canvas.Brush.Color := $5E8383;

   for i:=ClientWidth*ClientHeight div 40 downto 0 do begin
       x := random(Bmp.Width);
       y := random(Bmp.Height);
       Bmp.Canvas.Ellipse(x, y, x + random(5) + 10, y + random(2) + 1);
   end;

   GetMem(NewLine, Bmp.Width * 4);
   for y := 0 to pred(Bmp.Height) do begin
       PLine := Bmp.ScanLine[y];
       for x:=0 to pred(Bmp.Width) do begin
           for j:=0 to 2 do begin
               S := 0;
               for i:=x - BlurSize to x + BlurSize do
                   if (i>=0) and (i < Bmp.Width) then begin
                       S := S + PByte(Integer(PLine) + i*4 + j)^;
                   end else
                   case j of
                       0: S := S + $2d;
                       1: S := S + $47;
                       2: S := S + $55;
                   end;
               PByte(Integer(NewLine) + x*4 + j)^ := S div (BlurSize * 2+1);
           end;
       end;
       CopyMemory(PLine, NewLine, Bmp.Width * 4);
   end;
   FreeMem(NewLine);

   Canvas.Draw(0, 0, Bmp);
   Bmp.Free
end;


Sapersky   (2006-12-06 13:25:00) [3]

Подскажите алгоритм доски?

Ищи инструкции по созданию "деревянных" текстур в Photoshop. Я в своё время видел что-то такое - вроде всё довольно просто, никаких супер-мудрёных фильтров не применяется, вполне возможно написать самому.


Barloggg   (2006-12-06 12:20:00) [4]

не, тогда может криво получится все-таки мятые цилиндры это больше похоже на скелетную анимацию чем генерить извивающиеся линии

по сути выращивание дерева делается намазкой слоя за слоем. сначала делается скелет. с ветками.
потом слой за слоем намазывается белыми и коричневыми пикселями. по рандому - удвоенным слоем.
а потом делается срезка.

хотя делать сразу плоское тоже можно, но это будет хорошо разве что для осевого разреза. А вот снять стружку по спирали и получить текстуру фанеры можно только трехмерным деревом.


Jeer   (2006-12-06 12:11:00) [5]

Надо сразу выращивать плоское дерево по размеру изображения:)


Barloggg   (2006-12-06 11:07:00) [6]

в ухренительной. на сколько оперативки хватит :)
впрочем существуют такие вещи как альфаблендинг например так что можно сбацать в черновом реждиме, а потом поразмазывать как следует.


Kolan   (2006-12-06 11:06:00) [7]

> ухренительных

это 10 в какой степени?


Barloggg   (2006-12-06 11:04:00) [8]

да, вообщето это просто делается.
Именно для таких вещей и были придуманы трехмерные текстуры.

если автор хочет сделать целиком и полностью уникальную текстуру дерева значит ему нужно сначала это дерево вырастить, а потом выпилить из него доску.

то есть натурально делать мятые цилиндры один внутри другого не допуская их касания между собой и также делать сучки.

Всем нам известный шпон, (который на мебели или на фанере) делается срезанием стружки с целого бревна по спирали поэтому разводы выглядят такими скругленными  и смазанными. На досках все резче и прямее. особенно на центральных брусьях.

в общем сначала надо создать ухренительных размеров трехмерный массив, попиксельно вырастить в нем дерево, потом по спирали сделать срез и получить искомую текстуру.

вот и весь алгоритм.


Jeer   (2006-12-06 10:51:00) [9]


> Подскажите алгоритм доски? [D7]


Алгоритм можно придумать любой, другое дело, что такого готового вряд ли ты найдешь, поэтому  - [1].


iXT   (2006-12-06 09:33:00) [10]


> Elen ©   (06.12.06 09:29) [3]

Кажется в MS Office они были


Elen   (2006-12-06 09:29:00) [11]


> По которому можно нарисовать текстуру как у доски

Наверно такого алгоритма нет, то биш просто свежеспиленную доску нарисовать можно, чередуя полоски разным цветом с размытием на краях, а вот что с сучками делать? Возьми один из готовых текстур в инете чтоб особо не париться


iXT   (2006-12-06 09:17:00) [12]

Сабж 5 балов :)


Сергей М.   (2006-12-06 09:06:00) [13]

алгоритм этот прост до безобразия

Image.Picture.LoadFromFile('ТекстураКакУДоски.bmp');


Наверх

Титульная страница Поиск, карта сайта Написать письмо