![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Спасибо! Понятно, буду пробовать для своей матрицы.
|