Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.10.2016, 16:35
ctyz ctyz вне форума
Прохожий
 
Регистрация: 28.10.2016
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Визуализация матрицы значений

Уважаемые форумчане, я не программист, но судьба вынудила встретиться с delphi. Совершенно не понимаю как можно визуализировать матрицу значений в delphi.

Предположим есть такая матрица значений:
-19715 17495 -9090 -5335
-19545 14235 -1420 -630
-17725 18535 -2590 230
-13290 21705 1325 195

Мне нужно визуализировать эту матрицу, как это делается в matlab с помощью функции imagsc, которая интерпретирует матрицу как прямоугольное изображение и каждый элемент матрицы представляется в виде квадратика, цвет которого соответствует величене элемента.

На картинке пример того как это происходит в matlab.


Помогите пожалуйста понять, как получить такую же картинку по матрице в delphi.
Ответить с цитированием
  #2  
Старый 28.10.2016, 19:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

не знаю как делает это матлаб, но можно просто попробовать значение ячейки матрицы просто отконвертировать в TColor и отрисовать точку соотв. цветом. Вот типа простейший пример (не оптимальный по скорости и без масштабирования):
Код:
function DrawImageByMatrix(A : Array Of Array Of Integer) : TBitmap;
var
  I, J : Integer;
begin
  Result := TBitmat.Create;
  Result.Height := Length(A);
  Result.With :=  Length(A[Low(A)]);
  Result.PixelFormat  := pf24bit;
  Result.Canvas.Brush.Color := clWhite;
  Result.Canvas.FillRect(Rect(0,0,Result.Width,Result.Height));

  For I := Low(A) To High(A) Do
    For J := Low(A[i]) To High(A[i]) Do
      Result.Canvas.Pixels[J,I] := TColor(A[I,J]);
end;

В примере в матрице считаем, что первой координатой идет Y, второй - Х (т.е. обратное экранным).
Ответить с цитированием
  #3  
Старый 28.10.2016, 20:17
ctyz ctyz вне форума
Прохожий
 
Регистрация: 28.10.2016
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Извините, я от программирования очень далёк, и почти ничего не понял из примера. Почему то при компиляции этого кода, программа жалуется на A : Array Of Array Of Integer и на Result := TBitmat.Create;
Ответить с цитированием
  #4  
Старый 29.10.2016, 06:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну очепятался местами.
Вот полный пример (Delphi 10.1 Berlin) со случайным заполнением массива:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TInt2dArray = Array Of Array Of Integer;

function DrawImageByMatrix(A : TInt2dArray) : TBitmap;
var
  I, J : Integer;
begin
  Result := TBitmap.Create;
  Result.Height := Length(A);
  Result.Width :=  Length(A[Low(A)]);
  Result.PixelFormat  := pf24bit;
  Result.Canvas.Brush.Color := clWhite;
  Result.Canvas.FillRect(Rect(0,0,Result.Width,Result.Height));

  For I := Low(A) To High(A) Do
    For J := Low(A[i]) To High(A[i]) Do
      Result.Canvas.Pixels[J,I] := TColor(A[I,J]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I, J : Integer;
  A : TInt2dArray;
  B : TBitmap;
begin
  SetLength(A,Image1.Height,Image1.Width);
  For I := Low(A) To High(A) Do
    For J := Low(A[i]) To High(A[i]) Do
      A[I,J] := Random(MaxInt);

  B := DrawImageByMatrix(A);
  If Not Assigned(Image1.Picture.Graphic)
    Then Image1.Picture.Graphic := B
    Else
      Begin
        Image1.Picture.Graphic.Assign(B);
        B.Free;
      End;
end;

end.
На форму просто "бросил" TImage и TButton.
Ответить с цитированием
  #5  
Старый 29.10.2016, 09:44
ctyz ctyz вне форума
Прохожий
 
Регистрация: 28.10.2016
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо большое!
Не подскажете ещё, а цвет случайным образом задаётся каждому значению?
Ответить с цитированием
  #6  
Старый 29.10.2016, 20:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это пример. Просто в начале случайным образом заполняю матрицу. К отрисовке это не имеет отношение. У тебя матрица должна заполняться как-то по другому. Более того, в зависимости от дизайна интерфейса и размера матрицы, тебе скорее всего потребуется рисовать не точки, а прямоугольники/квадраты, что бы компенсировать различия в размераз матрицы и картинки. В примере я просто взял размеры картинки и создал такого же размера матрицу.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Admin (29.10.2016)
  #7  
Старый 30.10.2016, 09:22
ctyz ctyz вне форума
Прохожий
 
Регистрация: 28.10.2016
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо! Понятно, буду пробовать для своей матрицы.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter