31
Визуализации / Visualizations / Re: OpenSpectrumLazarus Спектрум (исходник на Lazarus)
« on: February 23, 2014, 22:02:35 »
на версию с message box
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Win8x64к сожалению нет технической возможности проверить
высота палки[i] := значение полосы[i] / значение матрицы максимума[i]
procedure SP_CalculateBarConfig(const Theme: TTheme; var BarConfig: TSP_BarConfig);
var i, maxSP, totalSP: integer; stepSP: single;
begin
if BarConfig.BarCount <> Theme.SPBarCount then begin
with BarConfig do begin
BarCount:= Theme.SPBarCount;
// единичный отступ 15%
// нужен для того чтобы "БАСЫ" отображались максимально точно
Offset:=round( BarCount * 0.15 );
BarCount:=Theme.SPBarCount;
maxSP:=Length(vSP_MATRIX)-1;
// длина vSP_MATRIX = 207
if BarCount<50 then maxSP:= Length(vSP_MATRIX) - trunc( Length(vSP_MATRIX) * 0.05 );
if BarCount<30 then maxSP:= Length(vSP_MATRIX) - trunc( Length(vSP_MATRIX) * 0.1 );
if BarCount<15 then maxSP:= Length(vSP_MATRIX) - trunc( Length(vSP_MATRIX) * 0.2 );
Step:=0;
// Рассчет шага
repeat
totalSP:=Offset;
stepSP:=1;
for i:=1 to BarCount-Offset do begin
stepSP:= stepSP + Step;
totalSP:= totalSP + round( stepSP );
end;
Step:=Step + 0.01;
until totalSP>=maxSP;
Step:=Step - 0.01;
Step:=abs(Step);
end; // end with
end; // end if
end;
TSP_BarConfig = record
BarCount: integer; // количество отображаемых полос
Offset: integer; // единичный отступ
Step: single; // шаг
end;
Например спектр состоит из 20 полосprocedure SP_CalculateSpectrum(const Theme: TTheme; var BarConfig: TSP_BarConfig;
const DATA: TSP_SingleArray;
var OUTData: TSP_SingleArray
);
var i,z,k: integer; stepSP, hmax: single;
begin
with BarConfig do begin
z:=0;
k:=0;
for z:=0 to Offset-1 do begin
// единичный отступ
OUTData[k]:=DATA[z];
inc(k);
end;
z:=Offset-1;
stepSP:=1;
repeat
hmax:=0;
stepSP:=stepSP+Step;
for i:=z+1 to z+round(stepSP) do begin
// ищем максимум из диапазона заданного шагом
hmax:=MAX(DATA[i],hmax);
end;
// записываем результат в OUTData
OUTData[k]:=hmax;
inc(k);
z:=z+round(stepSP);
until k>=BarCount;
end;
end;