Display the rotated text
procedure AngleTextOut(ACanvas: TCanvas; Angle, X, Y: Integer; Str: string);
var
LogRec: TLogFont;
OldFontHandle,
NewFontHandle: hFont;
begin
GetObject(ACanvas.Font.Handle, SizeOf(LogRec), Addr(LogRec));
LogRec.lfEscapement := Angle*10;
NewFontHandle := CreateFontIndirect(LogRec);
OldFontHandle := SelectObject(ACanvas.Handle, NewFontHandle);
ACanvas.TextOut(X, Y, Str);
NewFontHandle := SelectObject(ACanvas.Handle, OldFontHandle);
DeleteObject(NewFontHandle);
end;
-----------------------------------------------------------------------------
Rotating text on a canvas
// Use this procedure to rotate text on any canvas:
procedure RotateText(CV: TCanvas; const s: string; x, y, d: integer);
var
lf: TLogFont;
newFont, oldFont: HFONT;
begin
GetObject(CV.Font.Handle, SizeOf(lf), @lf);
lf.lfEscapement := d * 10;
lf.lfOrientation := lf.lfEscapement;
lf.lfPitchAndFamily := FIXED_PITCH or FF_DONTCARE;
lf.lfOutPrecision := OUT_TT_PRECIS;
lf.lfQuality := PROOF_QUALITY;
newFont := CreateFontIndirect(lf);
oldFont := SelectObject(CV.Handle, newFont);
SetBkMode(CV.Handle, TRANSPARENT);
CV.TextOut(x, y, s);
SelectObject(CV.Handle, oldFont);
DeleteObject(newFont);
end;
// d is the number of degrees to rotate. -----------------------------------------------------------------------------
Output text at any angle on canvas
Procedure CanvasTextOutAngle(C:TCanvas; X,Y:Integer; Angle:Word; S:String);
Var
LogRec: TLOGFONT;
OldFontHandle,
NewFontHandle: HFONT;
Begin
GetObject(C.Font.Handle,SizeOf(LogRec),Addr(LogRec));
LogRec.lfEscapement:=Angle*10; {10th of a degree}
LogRec.lfOrientation:=Angle*10;
NewFontHandle := CreateFontIndirect(LogRec);
OldFontHandle := SelectObject(C.Handle,NewFontHandle);
C.Brush.Style := bsClear;
C.TextOut(X,Y,S);
NewFontHandle := SelectObject(C.Handle,OldFontHandle);
DeleteObject(NewFontHandle);
End;
----------------------------------------------------------------------
determine the 3rd point of an Equilateral Triangle from the other 2 points
procedure CreateEquilateralTriangle(x1, y1, x2, y2: Double; var x3, y3: Double);
const
Sin60 = 0.86602540378443864676372317075294;
const
Cos60 = 0.50000000000000000000000000000000;
begin
{ Translate for x1,y1 to be origin }
x2 := x2 - x1;
y2 := y2 - y1;
{ Rotate 60 degrees and translate back }
x3 := ((x2 * Cos60) - (y2 * Sin60)) + x1;
y3 := ((y2 * Cos60) + (x2 * Sin60)) + y1;
end;
(* End Of Create Equilateral Triangle *)
---------------------------------------------------------------------------
find true angle of a vector or complex number (Arctan)
{
A simple but usefull tiny tip.
This version of Arctan is valid throughout the
interval [-PI/2;3/2*PI] unlike normally only ]-PI/2;PI/2[.
It is of use when you need to convert a given vector from rectangular to
polar format. It is quite handy when you do complex numbers.
}
function ArcTan2(x, y: Double): Double;
var
retur: Double;
begin
Retur := 0.0;
if ABS(x) < 0.000000001 then //Close to zero! We declare it to be zero!
begin //The small margin gives a slight error, but improves reliability.
if y > 0 then
begin
Retur := PI / 2; //90 degrees
end
else
begin
Retur := PI / (-2); //-90 degrees
end;
end
else
begin
if x > 0 then // 1. or 4. quadrant
begin
Retur := ArcTan(Y / X); // Easy stuff. Normal ArcTan is valid for 1. and 4.
end
else // 2. or 3. quadrant
begin
Retur := PI - ArcTan(-Y / X);
end;
end;
ArcTan2 := Retur;
end;