Skip to main content

src/transform2d.erl

%%%-------------------------------------------------------------------
%%% erlrithmetician - linear algebra library for Erlang
%%% Copyright (C) 2026 E. G. Bland
%%%
%%% This program is free software: you can redistribute it and/or modify
%%% it under the terms of the GNU General Public License as published by
%%% the Free Software Foundation, either version 3 of the License, or
%%% (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%%% GNU General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program.  If not, see <https://www.gnu.org/licenses/>.
%%%-------------------------------------------------------------------

-module(transform2d).

-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-endif.

-export([rotate/1, scale/2, translate/2]).

-spec rotate(number()) -> mat:mat(float()).
-spec scale(number(), number()) -> mat:mat(number()).
-spec translate(number(), number()) -> mat:mat(number()).

rotate(Theta) ->
  Cos = math:cos(Theta),
  Sin = math:sin(Theta),
  mat:new(array:from_list([vec:new2(Cos, Sin), vec:new2(-Sin, Cos)])).

scale(Sx, Sy) ->
  mat:new(array:from_list([vec:new2(Sx, 0), vec:new2(0, Sy)])).

translate(Tx, Ty) ->
  mat:new(array:from_list([vec:new3(1, 0, 0), vec:new3(0, 1, 0), vec:new3(Tx, Ty, 1)])).