Files
kam-mobile/code/ProbeCamera.pas
T
2026-09-11 18:19:50 +05:00

34 lines
1.1 KiB
ObjectPascal
Executable File

unit ProbeCamera;
{$mode delphi}{$H+}
{$ASSERTIONS ON}{$R+}{$Q+}{$B-}
interface
uses Math;
type
TProbeCamera = record
OffsetX, OffsetY, PixelsPerCell: Double;
procedure Reset;
procedure Pan(DX,DY: Double);
procedure ZoomAt(Factor,SX,SY: Double);
function CellAt(SX,SY: Double;Cols,Rows:Integer;out X,Y:Integer):Boolean;
end;
implementation
procedure TProbeCamera.Reset;
begin OffsetX:=20;OffsetY:=20;PixelsPerCell:=10;end;
procedure TProbeCamera.Pan(DX,DY:Double);
begin OffsetX:=OffsetX+DX;OffsetY:=OffsetY+DY;end;
procedure TProbeCamera.ZoomAt(Factor,SX,SY:Double);
var WX,WY,NewScale:Double;
begin
if (Factor<=0) or IsNan(Factor) or IsInfinite(Factor) then Exit;
WX:=(SX-OffsetX)/PixelsPerCell;WY:=(SY-OffsetY)/PixelsPerCell;
NewScale:=EnsureRange(PixelsPerCell*Factor,2.0,128.0);
PixelsPerCell:=NewScale;OffsetX:=SX-WX*NewScale;OffsetY:=SY-WY*NewScale;
end;
function TProbeCamera.CellAt(SX,SY:Double;Cols,Rows:Integer;out X,Y:Integer):Boolean;
begin
X:=Floor((SX-OffsetX)/PixelsPerCell)+1;
Y:=Rows-Floor((SY-OffsetY)/PixelsPerCell);
Result:=(X>=1) and (X<=Cols) and (Y>=1) and (Y<=Rows);
end;
end.