34 lines
1.1 KiB
ObjectPascal
Executable File
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.
|