-- tkz_elements_functions_lines.lua
-- date 2025/02/26
-- version 3.32
-- Copyright 2025  Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
-- of this license or (at your option) any later version.
-- The latest version of this license is in
--   http://www.latex-project.org/lppl.txt
-- and version 1.3 or later is part of all distributions of LaTeX
-- version 2005/12/01 or later.
-- This work has the LPPL maintenance status “maintained”.
-- The Current Maintainer of this work is Alain Matthes.

---------------------------------------------------------------------------
--                 Lines
---------------------------------------------------------------------------
function normalize_(a, b)
    return a + (b - a) / point.mod(b - a)
end


function ortho_from_(p, a, b)
    return p + (b - a) * point(0, 1)
end

function ll_from_ ( p , a , b )
	return  p + b - a
end

function slope_ (a,b)
  return angle_normalize_ (point.arg(b-a))
end

function gold_segment_ (a,b)
  return a + (b - a) * tkzinvphi
end

function online_ (a,b,t)
   return barycenter_({a,(1-t)},{b,t})
 end
 
 function mediator_ (a,b) 
   local m = midpoint_ (a,b)
   return m , rotation_ (m,math.pi/2,b)
 end
 
 function midpoint_ (z1 , z2)	
   return (z1+z2)/2
 end
-- triangle specific
function equilateral_tr_ (a,b)
   return rotation_ (a,math.pi/3,b)
end

function isosceles_right_tr(a, b)
    local pt = rotation_(a, math.pi / 4, b)
    return a + (pt - a) * math.sin(math.pi / 4)
end


function gold_tr(a, b)
    local pt = rotation_(a, math.pi / 2, b)
    return a + (pt - a) * tkzinvphi
end


function euclide_tr (a,b)
     return rotation_ (a,math.pi/5,b)
end

function golden_tr (a,b)
   local  pt = rotation_ (a,2*math.pi/5,b)
   return a + (pt-a) * tkzphi
end

function div_harmonic_int_(a,b,n)
  local k = point.abs(a-n)/point.abs(b-n)
  return barycenter_ ( {a,1} , {b,k} )
end

function div_harmonic_ext_(a,b,n)
  local k = point.abs(a-n)/point.abs(b-n)
  return barycenter_ ( {a,1} , {b,-k} )
end

function div_harmonic_both_(a,b,k)
  return barycenter_ ( {a,1} , {b,k} ) , barycenter_ ( {a,1} , {b,-k} )
end

function golden_ratio_(a,b)
   local invphi = ( math.sqrt(5) - 1 )/2
   return   a  + (b-a) * invphi
end
-- projection
function projection ( Dt,pt )
  return projection_ ( Dt.pa,Dt.pb,pt )
end

function projection_(pa, pb, pt)
    if aligned(pa, pb, pt) then
        return pt
    else
        local v = pb - pa
        local z = ((pt - pa) .. v) / point.norm(v)  -- .. dot product
        return pa + z * v
    end
end

function projection_ll ( Dt1,Dt2,pt )
  return projection_ll_ ( Dt1.pa,Dt1.pb,Dt2.pa,Dt2.pb,pt )
end

function projection_ll_(pa, pb, pc, pd, pt)
    if aligned(pa, pb, pt) then
        return pt
    else
    local m = ll_from_ (pt, pc, pd)
    return intersection_ll_(pt,m,pa,pb)
    end
end

function affinity_(pa, pb, pc, pd, k, pt)
  local p = projection_ll_(pa, pb, pc, pd, pt)
   return homothety_(p,k,pt)
end


function symmetry_axial_(pa,pb,pt)
    local p = projection_ (pa,pb,pt)
    return symmetry_(p,pt)
end

function set_symmetry_axial_(u, v, ...)
    local t = {}
    for _, value in ipairs({...}) do
        table.insert(t, symmetry_axial_(u, v, value))
    end
    return table.unpack(t)
end


function square_ (a,b)
    return rotation_ (b,-math.pi/2,a), rotation_ (a,math.pi/2,b)
end

function in_segment_(a, b, pt)
    return point.mod(pt - a) + point.mod(pt - b) - point.mod(b - a) <= tkz_epsilon
end

function report_(za, zb, d, pt)
    local len = point.mod(zb - za)
    local t = d / len
    local result = barycenter_({za, 1 - t}, {zb, t})
    
    if pt then
        return result + pt - za
    else
        return result
    end
end

function colinear_at_(za, zb, pt, k)
    if k then
        return pt + k * (zb - za)
    else
        return pt + (zb - za)
    end
end
-- orthonormal cartesian coordinate system 
-- function occs_(p,za,zb)
--   local x = report_(za,zb,1,p)
--   local y = ortho_from_(p,p,x)
--   return x,y
-- end
