Suppose this easy class for shape - triangle:
TShape = class( TObject )
p1 : TPoint;
p2 : TPoint;
p3 : TPoint;
procedure Moving( _iDeltaX, _iDeltaY : integer );
procedure Rotation( _iAngle : integer );
procedure RotationAroundXY( _x, _y : integer; _iAngle : integer );
end;
And initialization:
pShape := TShape.Create;
pShape.p1.X := 300; pShape.p1.Y := 250;
pShape.p2.X := 250; pShape.p2.Y := 280;
pShape.p3.X := 350; pShape.p3.Y := 330;
For rotation shape around point use this code:
procedure TShape.RotationAroundXY( _x, _y : integer; _iAngle : integer );
var
iNewX, iNewY : integer;
dCos, dSin : double;
dRadian : double;
p1x, p1y, p2x, p2y, p3x, p3y : integer;
begin
{ -- angle }
dRadian := ( 2 * pi ) / ( 360 / _iAngle );
dCos := cos( dRadian );
dSin := sin( dRadian );
{ -- point for rotation around (in other case the rotation is around start of coords) }
p1x := p1.x - _x;
p1y := p1.y - _y;
p2x := p2.x - _x;
p2y := p2.y - _y;
p3x := p3.x - _x;
p3y := p3.y - _y;
{ -- calculation of the positions }
iNewX := round( ( p1x * dCos ) - ( p1y * dSin ) );
iNewY := round( ( p1y * dCos ) + ( p1x * dSin ) );
p1.X := iNewX + _x;
p1.Y := iNewY + _y;
iNewX := round( ( p2x * dCos ) - ( p2y * dSin ) );
iNewY := round( ( p2y * dCos ) + ( p2x * dSin ) );
p2.X := iNewX + _x;
p2.Y := iNewY + _y;
iNewX := round( ( p3x * dCos ) - ( p3y * dSin ) );
iNewY := round( ( p3y * dCos ) + ( p3x * dSin ) );
p3.X := iNewX + _x;
p3.Y := iNewY + _y;
end;
Output:
No comments:
Post a Comment