Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 456
1

Масштабирование

09.03.2014, 18:35. Просмотров 1831. Ответов 2
Метки нет (Все метки)


Всем доброго времени суток!
В общем, затупил с одной проблемкой (сижу третий день и уже, что называется, "глаз затерся"). И меется игровое поле размерностью (n x n) его необходимо вывести на TImage произвольного размера (m x m). Проблема заключается в масштабировании каждого квадрата игрового поля. Сейчас я использую дискретные значения, то есть TImage имеет размерность 500х500, а все доступные юзеру размеры игрового поля без остатка делятся на 500 (5,10,20,50). Не могу понять, как сделать универсальный алгоритм для получения размера квадрата игрового поля при произвольной размерности TImage... Round(); все портит [408 строка пректа]... В прилагаемом архиве проекта этим занимается процедура CreateConnectorFieldData();. Сам проект полностью отлажен и работает, если кому скучно - может немного поиграть Очень жду идей!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2014, 18:35
Ответы с готовыми решениями:

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

Масштабирование формы
Не могу разобраться, почему при запуске программы, я не могу масштабировать форму.. scaled = true....

Масштабирование графика
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Масштабирование окна
Еще раз, добрый вечер. Замучилась в инете искать как масштабировать изображение, помогите,...

2
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 456
09.03.2014, 18:36  [ТС] 2
Архив с программой:
0
Вложения
Тип файла: rar Connect_It.rar (661.3 Кб, 23 просмотров)
Модератор
3475 / 2599 / 740
Регистрация: 19.09.2012
Сообщений: 7,965
10.03.2014, 11:25 3
Лучший ответ Сообщение было отмечено Vabos как решение

Решение

Для произвольного размера игрового поля:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TMainForm.CreateConnectorFieldData();
var i,j: Integer;
    Scale: Real; //Integer;      <---
begin
   FieldSize:=Get_FieldSize();
   ClearConnectorFieldData();
   SetLength(ConnectorFieldData,FieldSize,FieldSize);
 
//------------------------------------------------------------------------------
   if Image1.Picture.Width < Image1.Picture.Height then
     Scale := Image1.Picture.Width / FieldSize
   else
     Scale := Image1.Picture.Height / FieldSize;
//------------------------------------------------------------------------------
 
   for i := 0 to FieldSize-1 do
      for j := 0 to FieldSize-1 do
      begin
         ConnectorFieldData[i,j].Rect.Top:= Round(i*Scale+i*0);           //<---
         ConnectorFieldData[i,j].Rect.Left:=Round(j*Scale+j*0);           //<---
         ConnectorFieldData[i,j].Rect.Bottom:=Round((i+1)*Scale+i*0);     //<---
         ConnectorFieldData[i,j].Rect.Right:=Round((j+1)*Scale+j*0);      //<---
      end;
end;
Добавлено через 5 минут
Чтобы можно было произвольно растягивать окно игры:
- св-ва Имаги Center, Proportional, Stretch установить в True;
- добавить пересчет координат при клике мыши:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TMainForm.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
...
begin
//------------------------------------------------------------------------------
  with Image1 do
    if Width > Height then
    begin
      X := Round((X - (Width - Height) / 2) * Picture.Height / Height);
      Y := Round(Y * Picture.Height / Height);
    end else
    begin
      X := Round(X * Picture.Width / Width);
      Y := Round((Y - (Height - Width) / 2) * Picture.Width / Width);
    end;
//------------------------------------------------------------------------------
Добавлено через 16 минут
Подправил первый код.

и еще:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TMainForm.FormCreate(Sender: TObject);
begin
  Image1.Picture.Bitmap.Width := Image1.Width;
  Image1.Picture.Bitmap.Height := Image1.Height;
 
   Load_cbFieldSize();
   Randomize();
 
   cbFieldSizeChange(nil);
{
   ClearConnectorFieldData();
   CreateConnectorFieldData();
 
   GenerateConnectorFieldData();
   PrepareCreatedFieldForGame();
}
end;
Добавлено через 14 часов 55 минут
А еще лучше самому задать размер ячейки, нужный для нормальной отрисовки изображения:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TMainForm.CreateConnectorFieldData();
const
  Scale = 10;
var
  i,j: Integer;
begin
   FieldSize:=Get_FieldSize();
   ClearConnectorFieldData();
   SetLength(ConnectorFieldData,FieldSize,FieldSize);
 
  Image1.Picture.Bitmap.Width := Scale * FieldSize;
  Image1.Picture.Bitmap.Height := Scale * FieldSize;
 
   for i := 0 to FieldSize-1 do
      for j := 0 to FieldSize-1 do
      begin
         ConnectorFieldData[i,j].Rect.Top:= i*Scale;
         ConnectorFieldData[i,j].Rect.Left:=j*Scale;
         ConnectorFieldData[i,j].Rect.Bottom:=(i+1)*Scale;
         ConnectorFieldData[i,j].Rect.Right:=(j+1)*Scale;
      end;
end;
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2014, 11:25

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

Масштабирование формы
Есть форма на которой два объекта Image которые изображают, например, вертолет: Image1 : вертушка...

Масштабирование картинки
Ребята помогите есть процедура рандомной картинки, помогите сделать масштабирование картинки под...

Масштабирование элементов
Привет всем, уже 3 день по гуглу ищу как масштабировать компоненты на форме, anchors не работает,...

Масштабирование по центру
Здравствуйте! У меня не получается масштабирование по центру Delphi. Помогите исправить. unit...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.