PDA

View Full Version : سوال: رسم تابع سینوس بین دو نقطه



sajioo
شنبه 02 شهریور 1392, 09:55 صبح
سلام دوستان یک image بر روی فرم دارم که می خوام با تعیین دو نقطه ی اون ایمیج یک تابع سینوسی از نقطه ی اول به نقطه ی دوم رسم بشه.
زیاد گشتم ولی فقط رسم ساده تابع سینوس دستم اومد. دوستان کسی راهنمایی می کنه؟

یوسف زالی
شنبه 02 شهریور 1392, 12:32 عصر
سلام.
خب با همون رسم ساده می تونستی همین کار رو انجام بدی.
برای رسم یک سینوس بین دو نقطه باید فاصله اون دو نقطه رو برابر با طول موج بگیری.
ارتفاع تصویر هم می شه دامنه موج.
تابع موج رو هم که تو فیزیک سوم دبیرستان خوندیم.
:چشمک:



F(x) := A * sin(2*PI/L*x + B)

A = wave height
L = wave length
B = phase diffrence

Ananas
شنبه 02 شهریور 1392, 15:36 عصر
unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
pA, pB : TPoint;
procedure Display();
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function Sin_A_to_B(
pA : TPoint;
pB : TPoint;
x : Single;
frequenc : Single = 1.0;
multiply : Single = 10.0):TPoint;
var
sin_, cos_, invLength : Single;
vec : TPoint;
s_X, s_Y, p_X, p_Y : Single;
begin
vec := Point(pB.X - pA.X, pB.Y - pA.Y);
invLength := 1.0 / Sqrt(vec.X * vec.X + vec.Y * vec.Y);
cos_ := vec.X * invLength;
sin_ := vec.Y * invLength;
s_X := x / (Pi * 2.0 * invLength);
s_Y := Sin(x * frequenc) * multiply;
p_X := cos_ * s_X - sin_ * s_Y;
p_Y := sin_ * s_X + cos_ * s_Y;
Result := Point(Trunc(p_X) + pA.X, Trunc(p_Y) + pA.Y);
end;

procedure TForm1.Display();
var
I: Integer;
Count : Integer;
p : TPoint;
begin
Count := 200;
Self.Canvas.Rectangle(0, 0, Self.ClientWidth, Self.ClientHeight);
Self.Canvas.MoveTo(pA.X, pA.Y);
for I := 0 to Count do
begin
p := Sin_A_to_B(pA, pB, I / Count * Pi * 2.0, 6.0, 20.0);
Self.Canvas.LineTo(p.X, p.Y);
end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (mbLeft = Button) then
pA := Point(X, Y)
else
pB := Point(X, Y);
Display();
end;

end.