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

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

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

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

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

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

Это я реализовал
И тень при перемещении пазлика щас делаю

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

В чем тогда проблема - все реализовал, а на битмапе не можешь прорисовать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.09.2015, 21:24   #13
Тоба
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 86
По умолчанию

вот не могу, хоть убей нарисовать это полигональное ребро.
Тоба вне форума Ответить с цитированием
Старый 28.09.2015, 21:32   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А поищи в гуглах как сопряжения строятся между дугами. В общем-то ничего сложного. Подбирается радиус сопрягающей дуги, исходя из этого находятся координаты её центра, как точки пересечения двух окружностей. Из этого центра строятся нормали к сопрягаемым дугам и находятся координаты их пересечения с ними. Все. Это если аналитически строить. А можно просто шаблон того кармана иметь, или двух - вертикального и горизонтального
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.09.2015 в 21:35.
Аватар вне форума Ответить с цитированием
Старый 28.09.2015, 21:52   #15
Тоба
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 86
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А можно просто шаблон того кармана иметь, или двух - вертикального и горизонтального
Шаблон в данном случае не спасёт
Ширина и высота ведь будет менятся, в зависимости от выбора сложности
т.е. при лёгком уровне(сложности) изображение(допустим квадратное (просто для примера))разобъётся на 5 частей по вертикали и соответственно по горизонтали, а при сложном уровне это же изображение разобъётся уже где-то на 10 частей по Vert и Horz и соответственно размеры 1 пазлика изменятся
Представь, сколько нам шаблонов надо иметь под каждый конкретный случай. Всё рёбра должны меняться и рисоваться пропорционально.
Тоба вне форума Ответить с цитированием
Старый 28.09.2015, 22:16   #16
Тоба
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 86
По умолчанию

Посмотрите мой пример:
При изменении размеров сетки - пропорционально изменяется и элипс
Только вместо этого элипса надо нарисовать это выпендрёжное ребро.
Ширина элипса при изменении размеров сетки изменяется относительно 1/4 высоты
ребра и её же(ширину элипса) можно использовать в качестве диаметра внутреннего круга(точнее сказать арки).
Тоба вне форума Ответить с цитированием
Старый 28.09.2015, 22:29   #17
Тоба
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 86
По умолчанию

Проще ИМХО надо создавать маленький битмап по ширине и высоте прямоугольника в который вписан элипс, в нём рисовать это грёбанное ребро(мать его..),
а потом bitmap.drawto в наш большой битмап по нужным координатам,
ну а там уже рандомить в цикле отражение.
Но это всё мелочи, главное нарисовать всего лиш одно это ребро.
Тоба вне форума Ответить с цитированием
Старый 29.09.2015, 01:10   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

На правах идеи:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  row, col, i, tmp: integer;
  arr: array of tpoint;
  Xr, Yr, len: integer;
  vert, invert: boolean;
begin
  InValidateRect(Canvas.Handle, nil, true);
  Canvas.FillRect(Canvas.ClipRect);
  setlength(arr, 13);
  for row := 0 to 2 * (Height div 100) do
    for col := 0 to Width div 100 do
    begin
      Xr := 100 * col;
      Yr := 100 * (row div 2);
      len := 100;
      arr[0].X := 0;
      arr[0].Y := 0;
      arr[1].X := -len div 10 - len div 20;
      arr[1].Y := 4 * (len div 10) - len div 20;
      arr[2] := arr[1];
      arr[3].X := -len div 10;
      arr[3].Y := 4 * (len div 10);
      arr[4].X := -len div 10 + len div 20;
      arr[4].Y := 4 * (len div 10) + len div 20;
      arr[5].X := len div 5;
      arr[5].Y := len div 4;
      arr[6].X := len div 5;
      arr[6].Y := len div 2;
      arr[7].X := len div 5;
      arr[7].Y := 3 * (len div 4);
      arr[8].X := -len div 10 + len div 20;
      arr[8].Y := 6 * (len div 10) - len div 20;
      arr[9].X := -len div 10;
      arr[9].Y := 6 * (len div 10);
      arr[10].X := -len div 10 - len div 20;
      arr[10].Y := 6 * (len div 10) + len div 20;
      arr[11] := arr[10];
      arr[12].X := 0;
      arr[12].Y := len;
      vert := row mod 2 = 1;
      invert := random(2) = 1;
      for i := low(arr) to high(arr) do
        with arr[i] do
        begin
          if invert then
            X := -X;
          if vert then
          begin
            tmp := X;
            X := Y;
            Y := tmp;
          end;
          inc(X, Xr);
          inc(Y, Yr);
        end;
      Canvas.polybezier(arr);
    end;
  setlength(arr, 0);
end;
Изображения
Тип файла: jpg puzzle.jpg (34.9 Кб, 140 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.09.2015, 01:40   #19
Тоба
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 86
По умолчанию

как вариант - браво!
если менять значение(вместо100), то и пропорционально изменяются размеры пазликов, можно сделать больше, можно меньше - это то, что надо(уровень сложности).
Единственное но,
Границы должны ведь быть законтурены, надеюсь вы поняли о чём я.
................................... ................................... .............................
Смотрите, пользователь выбрал изображение - предположим 640х480
Создаём битмап такого-же размера и рисуем на нём.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  row, col, i, tmp: integer;
  arr: array of tpoint;
  Xr, Yr, len: integer;
  vert, invert: boolean;
  bmp : TBitmap;
begin
  bmp := TBitmap.Create;
  bmp.Width:= 640;
  bmp.Height:= 480;
  bmp.Canvas.Brush.Color:= $00c8f8d0;
  bmp.Canvas.FillRect(Canvas.ClipRect);
  bmp.Canvas.Rectangle(bmp.Canvas.ClipRect);
  setlength(arr, 13);
  for row := 0 to 2 * (bmp.Height div 110) do
    for col := 0 to bmp.Width div 110 do
    begin
      Xr := 110 * col;
      Yr := 110 * (row div 2);
      len := 110;
      arr[0].X := 0;
      arr[0].Y := 0;
      arr[1].X := -len div 10 - len div 20;
      arr[1].Y := 4 * (len div 10) - len div 20;
      arr[2] := arr[1];
      arr[3].X := -len div 10;
      arr[3].Y := 4 * (len div 10);
      arr[4].X := -len div 10 + len div 20;
      arr[4].Y := 4 * (len div 10) + len div 20;
      arr[5].X := len div 5;
      arr[5].Y := len div 4;
      arr[6].X := len div 5;
      arr[6].Y := len div 2;
      arr[7].X := len div 5;
      arr[7].Y := 3 * (len div 4);
      arr[8].X := -len div 10 + len div 20;
      arr[8].Y := 6 * (len div 10) - len div 20;
      arr[9].X := -len div 10;
      arr[9].Y := 6 * (len div 10);
      arr[10].X := -len div 10 - len div 20;
      arr[10].Y := 6 * (len div 10) + len div 20;
      arr[11] := arr[10];
      arr[12].X := 0;
      arr[12].Y := len;
      vert := row mod 2 = 1;
      invert := random(2) = 1;
      for i := low(arr) to high(arr) do
        with arr[i] do
        begin
          if invert then
            X := -X;
          if vert then
          begin
            tmp := X;
            X := Y;
            Y := tmp;
          end;
          inc(X, Xr);
          inc(Y, Yr);
        end;
      bmp.Canvas.polybezier(arr);
    end;
    bmp.SaveToFile('D:\Result.bmp');
    bmp.free;
    setlength(arr, 0);
end;
Получаем:


Последний раз редактировалось Тоба; 29.09.2015 в 02:34. Причина: Добавил
Тоба вне форума Ответить с цитированием
Старый 29.09.2015, 02:30   #20
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Если верно понял, что такое законтурены:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  psize = 100;
var
  row, col, i, tmp, Xr, Yr, len, Xoffset, Yoffset, colcount, rowcount: integer;
  arr: array of tpoint;
  horiz, invert: boolean;
  bmp: tbitmap;
begin
  bmp := tbitmap.Create;
  bmp.SetSize(400 + random(1000), 300 + random(1000));
  Xoffset := (bmp.Width mod psize) div 2;
  Yoffset := (bmp.Height mod psize) div 2;
  setlength(arr, 13);
  rowcount := bmp.Height div psize;
  colcount := bmp.Width div psize;
  for row := 0 to 2 * rowcount - 1 do
    for col := 0 to colcount - 1 do
    begin
      horiz := row mod 2 = 1;
      if (not horiz) and (col = 0) or horiz and (row = 1) then
        continue;
      invert := random(2) = 1;
      Xr := psize * col + Xoffset;
      Yr := psize * (row div 2) + Yoffset;
      len := psize;
      if row = 0 then
      begin
        Yr := 0;
        len := psize + Yoffset;
      end;
      if row = 2 * rowcount - 2 then
        len := psize + Yoffset;
      if (col = 0) and horiz then
      begin
        Xr := 0;
        len := psize + Xoffset;
      end;
      if (col = colcount - 1) and horiz then
        len := psize + Xoffset;
      arr[0].X := 0;
      arr[0].Y := 0;
      arr[1].X := -len div 10 - len div 20;
      arr[1].Y := 4 * (len div 10) - len div 20;
      arr[2] := arr[1];
      arr[3].X := -len div 10;
      arr[3].Y := 4 * (len div 10);
      arr[4].X := -len div 10 + len div 20;
      arr[4].Y := 4 * (len div 10) + len div 20;
      arr[5].X := len div 5;
      arr[5].Y := len div 4;
      arr[6].X := len div 5;
      arr[6].Y := len div 2;
      arr[7].X := len div 5;
      arr[7].Y := 3 * (len div 4);
      arr[8].X := -len div 10 + len div 20;
      arr[8].Y := 6 * (len div 10) - len div 20;
      arr[9].X := -len div 10;
      arr[9].Y := 6 * (len div 10);
      arr[10].X := -len div 10 - len div 20;
      arr[10].Y := 6 * (len div 10) + len div 20;
      arr[11] := arr[10];
      arr[12].X := 0;
      arr[12].Y := len;
      for i := low(arr) to high(arr) do
        with arr[i] do
        begin
          if invert then
            X := -X;
          if horiz then
          begin
            tmp := X;
            X := Y;
            Y := tmp;
          end;
          inc(X, Xr);
          inc(Y, Yr);
        end;
      bmp.Canvas.polybezier(arr);
    end;
  bmp.SaveToFile('tmp.bmp');
  bmp.Free;
  setlength(arr, 0);
end;
Не хватает, наверное, проверок каких-нибудь.
Изображения
Тип файла: jpg tmp.jpg (41.0 Кб, 150 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 29.09.2015 в 02:38.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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