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.