summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua')
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua315
1 files changed, 315 insertions, 0 deletions
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua
new file mode 100644
index 0000000000..b4e41104d1
--- /dev/null
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua
@@ -0,0 +1,315 @@
+-- tkz_elements_functions_triangles.lua
+-- date 2023/10/20
+-- version 1.00b
+-- Copyright 2023 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.
+
+---------------------------------------------------------------------------
+ -- triangle center with circle
+---------------------------------------------------------------------------
+------------------------
+-- Points --
+------------------------
+function circum_center_ ( a,b,c )
+ local ka = math.sin (2 * get_angle_ ( a,b,c ))
+ local kb = math.sin (2 * get_angle_ ( b,c,a ))
+ local kc = math.sin (2 * get_angle_ ( c,a,b ))
+ return barycenter_ ( {a,ka} , {b,kb} , {c,kc} )
+end
+
+function in_center_ ( a,b,c )
+ local ka = point.abs (b-c)
+ local kc = point.abs (b-a)
+ local kb = point.abs (c-a)
+ return barycenter_ ( {a,ka} , {b,kb} , {c,kc} )
+end
+
+function ex_center_ ( a,b,c )
+ local ka = point.abs (b-c)
+ local kc = point.abs (b-a)
+ local kb = point.abs (c-a)
+ return barycenter_ ( {a,-ka} , {b,kb} , {c,kc} )
+ end
+
+-- N,G,H,O
+function centroid_ (a,b,c)
+ return barycenter_ ( {a,1} , {b,1} , {c,1} )
+end
+centroid_center_ = centroid_
+
+function ortho_center_ (a,b,c)
+ local ka = math.tan (get_angle_ ( a,b,c ))
+ local kb = math.tan (get_angle_ ( b,c,a ))
+ local kc = math.tan (get_angle_ ( c,a,b ))
+ return barycenter_ ( {a,ka} , {b,kb} , {c,kc} )
+end
+
+function euler_center_ (a,b,c)
+ local ma,mb,mc = medial_tr_ ( a,b,c)
+ return circum_center_ (ma,mb,mc)
+end
+
+function gergonne_point_ (a,b,c)
+ local u,v,w
+ u,v,w = intouch_tr_ (a,b,c)
+ return intersection_ll_ ( a,u , b,v)
+end
+
+function lemoine_point_(a,b,c)
+local ma,mb,mc,ha,hb,hc,u,v,w
+u = point.abs(c-b)
+v = point.abs(a-c)
+w = point.abs(b-a)
+ return barycenter_ ({a,u*u},{b,v*v},{c,w*w})
+end
+
+function nagel_point_ (a,b,c)
+ local u,v,w
+ u,v,w = extouch_tr_ ( a,b,c )
+return intersection_ll_ (a,u,b,v)
+end
+
+function feuerbach_point_ (a,b,c)
+ local i,h,e,ma
+ i,h = in_circle_ (a,b,c)
+ e = euler_center_ (a,b,c)
+ ma = (b+c)/2
+return intersection_cc_ (i,h,e,ma)
+end
+
+function spieker_center_ (a,b,c)
+return in_center_ (medial_tr_ ( a,b,c))
+end
+
+function euler_points_ (a,b,c)
+ local H
+ H = ortho_center_ ( a , b , c )
+ return midpoint_ ( H,a ), midpoint_ ( H,b ), midpoint_ ( H,c )
+end
+--------------------
+-- lines --
+--------------------
+function euler_line_ (a,b,c)
+ check_equilateral_ (a,b,c)
+ local A = math.tan( get_angle_ ( a,b,c ))
+ local B = math.tan( get_angle_ ( b,c,a ))
+ local C = math.tan( get_angle_ ( c,a,b ))
+
+ return euler_center_ (a,b,c),
+ barycenter_ ( {a,1} , {b,1} , {c,1} ) ,
+ barycenter_ ( {a,A} , {b,B} , {c,C} ) ,
+ barycenter_ ( {a,B+C} , {b,A+C} , {c,A+B} )
+end
+
+function bisector_ (a,b,c) -- possible intersection bisector with side
+ return in_center_ (a,b,c)
+end
+
+function bisector_ext_ (a,b,c)
+ local i
+ i = in_center_ (a,b,c)
+ return rotation_ (a,math.pi/2,i)
+end
+
+function mediators_ (a,b,c)
+ local o = circum_center (a,b,c)
+ return o ,
+ projection_ (b,c,o) ,
+ projection_ (a,c,o) ,
+ projection_ (a,b,o)
+end
+--------------------
+-- circles --
+--------------------
+function circum_circle_ ( a,b,c )
+ local ka = math.sin (2 * get_angle_ ( a,b,c ))
+ local kb = math.sin (2 * get_angle_ ( b,c,a ))
+ local kc = math.sin (2 * get_angle_ ( c,a,b ))
+ return barycenter_ ( {a,ka} , {b,kb} , {c,kc} )
+end
+
+function in_circle_ ( a,b,c )
+ local ka,kb,kc,o
+ ka = point.abs (b-c)
+ kc = point.abs (b-a)
+ kb = point.abs (c-a)
+ o = barycenter_ ( {a,ka} , {b,kb} , {c,kc} )
+ return o ,
+ projection_ (a,b,o) ,
+ projection_ (b,c,o) ,
+ projection_ (c,a,o)
+end
+
+function ex_circle_ ( a,b,c )
+ local ka,kb,kc,o
+ ka = point.abs (b-c)
+ kc = point.abs (b-a)
+ kb = point.abs (c-a)
+ o = barycenter_ ( {a,-ka} , {b,kb} , {c,kc} )
+ return o ,
+ projection_ (b,c,o) ,
+ projection_ (a,c,o) ,
+ projection_ (b,a,o)
+end
+
+function euler_circle_ (a,b,c)
+ local o,ma,mb,mc,H,ha,hb,hc
+ o = euler_center_ (a,b,c)
+ ma,mb,mc = medial_tr_ ( a,b,c)
+ ha,hb,hc = orthic_tr_ ( a,b,c)
+ local _,_,H,_ = euler_line_ (a,b,c)
+ return
+ o,ma,mb,mc,ha,hb,hc,
+ midpoint_ ( H,a ),
+ midpoint_ ( H,b ),
+ midpoint_ ( H,c )
+end
+--------------------
+-- triangles --
+--------------------
+function orthic_tr_ (a,b,c)
+ local o = ortho_center_ (a,b,c)
+ return projection_ (b,c,o) ,
+ projection_ (a,c,o) ,
+ projection_ (b,a,o)
+end
+
+function medial_tr_ (a,b,c)
+ return barycenter_ ( {a,0} , {b,1} , {c,1} ) ,
+ barycenter_ ( {a,1} , {b,0} , {c,1} ) ,
+ barycenter_ ( {a,1} , {b,1} , {c,0} )
+end
+
+function anti_tr_(a,b,c)
+ return barycenter_ ( {a,-1} , {b,1} , {c,1} ) ,
+ barycenter_ ( {a,1} , {b,-1} , {c,1} ) ,
+ barycenter_ ( {a,1} , {b,1} , {c,-1} )
+end
+
+function incentral_tr_ (a,b,c)
+ local i,r,s,t
+ i = in_center (a , b , c)
+ r = intersection_ll_ ( a,i , b,c)
+ s = intersection_ll_ ( b,i , a,c)
+ t = intersection_ll_ ( c,i , a,b)
+return i,r,s,t
+end
+
+function excentral_tr_ (a,b,c)
+ local r,s,t,ka,kb,kc
+ ka = point.abs (b-c)
+ kc = point.abs (b-a)
+ kb = point.abs (c-a)
+ r = barycenter_ ( {a,-ka} , {b,kb} , {c,kc} )
+ s = barycenter_ ( {a,ka} , {b,-kb} , {c,kc} )
+ t = barycenter_ ( {a,ka} , {b,kb} , {c,-kc} )
+ return r,s,t
+end
+
+function intouch_tr_ (a,b,c)
+ local i
+ i = in_center_ (a , b , c)
+ return projection_ (b,c,i),
+ projection_ (a,c,i),
+ projection_ (a,b,i)
+end
+
+function cevian_ (a,b,c,p)
+ return intersection_ll_ (a,p,b,c),
+ intersection_ll_ (b,p,a,c),
+ intersection_ll_ (c,p,a,b)
+end
+
+function extouch_tr_ (a,b,c)
+ local u,v,w
+ u,v,w = excentral_tr_ (a,b,c)
+ return projection_ (b,c,u) ,
+ projection_ (a,c,v) ,
+ projection_ (a,b,w)
+end
+
+function tangential_tr_ (a,b,c)
+ local u,v,w,x,y,z,xx,yy,zz
+ u,v,w = orthic_tr_ (a,b,c)
+ x = ll_from_ ( a , v , w )
+ y = ll_from_ ( b , u , w )
+ z = ll_from_ ( c , u , v )
+ xx = intersection_ll_ (c,z,b,y)
+ yy = intersection_ll_ (a,x,c,z)
+ zz = intersection_ll_ (a,x,b,y)
+return xx,yy,zz
+end
+
+function feuerbach_tr_ (a,b,c)
+ local e,m,ja,ha,jb,hb,jc,hc
+ e = euler_center_ (a,b,c)
+ m = midpoint_( b , c )
+ ja,ha = ex_circle_ ( a , b , c )
+ jb,hb = ex_circle_ ( b , c , a )
+ jc,hc = ex_circle_ ( c , a , b )
+ return intersection_cc_ (e,m,ja,ha),
+ intersection_cc_ (e,m,jb,hb),
+ intersection_cc_ (e,m,jc,hc)
+end
+--------------------
+-- miscellanous --
+--------------------
+
+function area_ (a,b,c)
+ return point.mod(a - projection_(b,c,a))*point.mod (b - c)/2
+end
+
+function check_equilateral_ (a,b,c)
+ local A,B,C,epsilon
+ epsilon = 10 ^(-8)
+ A = b - c
+ B = a - c
+ C = a - b
+ if (point.abs(A)-point.abs(B) < epsilon) and (point.abs(B)-point.abs(C) < epsilon)
+ then
+ tex.print("equilateral !!")
+ error("something went wrong!")
+ end
+end
+
+function parallelogram_ (a,b,c)
+ local x = c + a - b
+ return x
+end
+
+function barycentric_coordinates_ (a,b,c,pt)
+ local AT,AA,AB,AC,x,y,z
+ AT = area_(a,b,c)
+ AA = area_(pt,b,c)
+ AB = area_(a,pt,c)
+ AC = area_(a,b,pt)
+ x = AA/AT
+ y = AB/AT
+ z = AC/AT
+ return x,y,z
+end
+
+function in_out_ (a,b,c,pt)
+ local cba,cbb,cbc,TT,AT,AA,AB,AC
+ AT = area_(a,b,c)
+ AA = area_(pt,b,c)
+ AB = area_(a,pt,c)
+ AC = area_(a,b,pt)
+ cba = AA/AT
+ cbb = AB/AT
+ cbc = AC/AT
+ if (cba >= 0 and cba <= 1) and (cbb >= 0 and cbb <= 1) and (cbc >= 0 and cbc <= 1)
+ then
+ return true
+ else
+ return false
+ end
+end \ No newline at end of file