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.