79 lines
1.5 KiB
ObjectPascal
79 lines
1.5 KiB
ObjectPascal
program RotateSingle;
|
|
uses
|
|
Math;
|
|
|
|
function LinearTrans(arr: array of array of Real; x: array of Real): array of Real;
|
|
var
|
|
result: array[0..1] of Real;
|
|
i, j: Integer;
|
|
begin
|
|
result[0] := x[0]*arr[0][0] + x[1]*arr[0][1];
|
|
result[1] := x[0]*arr[1][0] + x[1]*arr[1][1];
|
|
|
|
LinearTrans := result;
|
|
end;
|
|
|
|
function RotateLine(line: array of Real; p: array of Real; dgr: Real): array of Real;
|
|
var
|
|
k, b: Real;
|
|
arr: array[0..1, 0..1] of Real;
|
|
kvec, rkvec: array[0..1] of Real;
|
|
rk: Real;
|
|
p1: array[0..1] of Real;
|
|
pvec, rpvec: array[0..1] of Real;
|
|
rp1: array[0..1] of Real;
|
|
result: array[0..1] of Real;
|
|
begin
|
|
{
|
|
Rotate y=kx+b with p for dgr.
|
|
dgr measured in radians.
|
|
line: [k, b] => y = kx + b
|
|
}
|
|
|
|
k := line[0];
|
|
b := line[1];
|
|
|
|
arr[0][0] := Cos(dgr);
|
|
arr[0][1] := -Sin(dgr);
|
|
arr[1][0] := Sin(dgr);
|
|
arr[1][1] := Cos(dgr);
|
|
|
|
kvec[0] := 1;
|
|
kvec[1] := k;
|
|
|
|
rkvec := LinearTrans(arr, kvec);
|
|
rk := rkvec[1] / rkvec[0]; // (a,b) => (1,b/a)
|
|
|
|
p1[0] := 0;
|
|
p1[1] := b;
|
|
|
|
pvec[0] := p1[0] - p[0];
|
|
pvec[1] := p1[1] - p[1];
|
|
|
|
rpvec := LinearTrans(arr, pvec);
|
|
|
|
rp1[0] := p[0] + rpvec[0];
|
|
rp1[1] := p[1] + rpvec[1];
|
|
|
|
result[0] := rk;
|
|
result[1] := rp1[1] - rk * rp1[0];
|
|
|
|
RotateLine := result;
|
|
end;
|
|
|
|
var
|
|
line, p, result: array[0..1] of Real;
|
|
dgr: Real;
|
|
begin
|
|
line[0] := 3;
|
|
line[1] := 4;
|
|
|
|
p[0] := 2;
|
|
p[1] := 1;
|
|
|
|
dgr := Pi / 4;
|
|
|
|
result := RotateLine(line, p, dgr);
|
|
|
|
WriteLn('Rotated line: k=', result[0]:0:6, ', b=', result[1]:0:6);
|
|
end. |