|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Визуализация матрицы значений
Уважаемые форумчане, я не программист, но судьба вынудила встретиться с delphi. Совершенно не понимаю как можно визуализировать матрицу значений в delphi.
Предположим есть такая матрица значений: -19715 17495 -9090 -5335 -19545 14235 -1420 -630 -17725 18535 -2590 230 -13290 21705 1325 195 Мне нужно визуализировать эту матрицу, как это делается в matlab с помощью функции imagsc, которая интерпретирует матрицу как прямоугольное изображение и каждый элемент матрицы представляется в виде квадратика, цвет которого соответствует величене элемента. На картинке пример того как это происходит в matlab. Помогите пожалуйста понять, как получить такую же картинку по матрице в delphi. |
#2
|
|||
|
|||
не знаю как делает это матлаб, но можно просто попробовать значение ячейки матрицы просто отконвертировать в 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
|
|||
|
|||
Извините, я от программирования очень далёк, и почти ничего не понял из примера. Почему то при компиляции этого кода, программа жалуется на A : Array Of Array Of Integer и на Result := TBitmat.Create;
|
#4
|
|||
|
|||
Ну очепятался местами.
Вот полный пример (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. |
#5
|
|||
|
|||
Спасибо большое!
Не подскажете ещё, а цвет случайным образом задаётся каждому значению? |
#6
|
|||
|
|||
Это пример. Просто в начале случайным образом заполняю матрицу. К отрисовке это не имеет отношение. У тебя матрица должна заполняться как-то по другому. Более того, в зависимости от дизайна интерфейса и размера матрицы, тебе скорее всего потребуется рисовать не точки, а прямоугольники/квадраты, что бы компенсировать различия в размераз матрицы и картинки. В примере я просто взял размеры картинки и создал такого же размера матрицу.
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Admin (29.10.2016)
|
#7
|
|||
|
|||
Спасибо! Понятно, буду пробовать для своей матрицы.
|