سلام.
راهی که به ذهنم میرسه اینکه اول باید مقدار نمودار رو از تصویر بدست بیارید. (اگر این کامپوننت مقادیر رو نمیده. چون آشنا نیستم باهاش). بعد که مقادیر رو بدست آوردید (مثلا تو یک آرایه از اعداد) با مقادیر شیفت شده از خودش تفریق میکنید. هر جا اختلاف کمتر از اپسیلن مورد نظرتون شد یعنی جواب مساله.
برای مثال میتونید در یک حلقه مقدار شیفت شدن رو تغییر بدید. نمودار رو به چپ حرکت بدید و از خودش کم کنید و با اپسیلون مقایسه کنید.
مثال:
یک فرم خالی بسازید (متغیر arr و متغیر bitm رو در قسمت public تعریف کردم) و OnCreate و OnMouseMove رو به این شکل تعریف کنید:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VclTee.TeeGDIPlus, VCLTee.TeEngine,
Vcl.ExtCtrls, VCLTee.TeeProcs, VCLTee.Chart, Vcl.StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
arr : array of Integer;
bitm : TBitmap;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
const
RAND_DIFF : Integer = 1000;
var
I, X: Integer;
S : Single;
begin
SetLength(arr, 1500);
X := 0;
for I := 0 to High(arr) do
begin
S := (1.0 + (X / 20000.0)) * 750.0 * Sin(I / 10.0);
arr[I] := Trunc(S);
X := X + (Random(RAND_DIFF * 2 + 2) - RAND_DIFF) ;
end;
bitm := TBitmap.Create;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
function Maxi(const X, Y: Integer):Integer;
begin
if (X > Y) then
Result := X
else
Result := Y;
end;
var
I, K: Integer;
arr_B: array of Integer;
begin
SetLength(arr_B, Length(arr));
for I := 0 to High(arr) do
begin
K := X + I;
if (K > High(arr)) then
K := K - High(arr);
arr_B[I] := arr[I] - arr[K];
end;
bitm.SetSize(Self.Width, Self.Height);
bitm.Canvas.FillRect(Self.ClientRect);
bitm.Canvas.Pen.Width := 1;
bitm.Canvas.Pen.Color := clBlack;
bitm.Canvas.MoveTo(0, bitm.Height div 2);
bitm.Canvas.LineTo(bitm.Width, bitm.Height div 2);
bitm.Canvas.Pen.Color := clBlue;
bitm.Canvas.MoveTo(0, bitm.Height div 2);
for I := 0 to High(arr) do
begin
bitm.Canvas.LineTo(I, bitm.Height div 2 + arr[I] div 10);
end;
bitm.Canvas.Pen.Color := clRed;
bitm.Canvas.Pen.Width := 1;
bitm.Canvas.MoveTo(0, bitm.Height div 2);
for I := 0 to High(arr) do
begin
K := X + I;
if (K > High(arr)) then
K := K - High(arr);
bitm.Canvas.LineTo(I, bitm.Height div 2 + arr[K] div 10);
end;
bitm.Canvas.MoveTo(0, bitm.Height div 2);
bitm.Canvas.Pen.Width := 4;
for I := 0 to High(arr) do
begin
bitm.Canvas.Pen.Color := (Maxi(0, 255 - Abs(arr_B[I]) div 4)) Shl 8;
bitm.Canvas.LineTo(I, bitm.Height div 2 + arr_B[I] div 10);
end;
Self.Canvas.Draw(0, 0, bitm);
end;
end.
نمودار اصلی با رنگ آبی و نمودار شیفت داده شده با رنگ قرمز هست. و اختلاف دو نمودار با رنگ سبز هست. هر چی اختلاف دو نمودار مقدارش به صفر نزدیک تر باشه به جواب نزدیک تر میشیم و رنگ نمودار سبز تر میشه و هر چی مقدار اختلاف بیشتر باشه رنگ نمودار سیاه تر و از جوا فاصله میگیریم.