From a00e38bda1dd258080ec6a649d61b1f577ccb71a Mon Sep 17 00:00:00 2001 From: "Maxime Chupin (escudo)" Date: Tue, 29 Nov 2016 17:11:34 +0100 Subject: [PATCH] =?utf8?q?Premi=C3=A8re=20version=20Voronoi=20avec=20MetaP?= =?utf8?q?ost?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- luamesh.lua | 150 ++++++++++++++++++++++++++++++++++++++++++++++ luamesh.sty | 132 ++++++++++++++++++++++++++++++++++++++++ test/delaunay.pdf | Bin 45045 -> 47864 bytes test/delaunay.tex | 10 ++++ test/test.lua | 20 +++++++ 5 files changed, 312 insertions(+) create mode 100644 test/test.lua diff --git a/luamesh.lua b/luamesh.lua index 26a3cbf..4d255a1 100644 --- a/luamesh.lua +++ b/luamesh.lua @@ -207,6 +207,81 @@ function circoncircle(M, N, P) return Out, rad -- (center [Point], R [float]) end +-- compute the list of the circumcircle of a triangulation +function listCircumCenter(listPoints,triangulation) + list = {} + for j=1,#triangulation do + A = listPoints[triangulation[j][1]] + B = listPoints[triangulation[j][2]] + C = listPoints[triangulation[j][3]] + center, radius = circoncircle(A,B,C) + table.insert(list,{x=center.x,y=center.y,r=radius}) + end + return list +end + +-- find the three neighbour triangles of T +function findNeighbour(T,i,triangulation) + -- T : triangle + -- i : index of T in triangualation + -- triangulation + + list = {} + -- define the three edge + e1 = {T[1],T[2]} + e2 = {T[2],T[3]} + e3 = {T[3],T[1]} + for j=1,#triangulation do + if j~= i then + if(edgeInTriangle(e1,triangulation[j])) then + table.insert(list,j) + end + if(edgeInTriangle(e2,triangulation[j])) then + table.insert(list,j) + end + if(edgeInTriangle(e3,triangulation[j])) then + table.insert(list,j) + end + end + end + return list +end + +-- test if edge are the same (reverse) +function equalEdge(e1,e2) + if(((e1[1] == e2[1]) and (e1[2] == e2[2])) or ((e1[1] == e2[2]) and (e1[2] == e2[1]))) then + return true + else + return false + end +end + +-- test if the edge belongs to the list +function edgeInList(e,listE) + output = false + for i=1,#listE do + if(equalEdge(e,listE[i])) then + output = true + end + end + return output +end + +-- build the edges of the Voronoi diagram with a given triangulation +function buildVoronoi(listPoints, triangulation) + listCircumCircle = listCircumCenter(listPoints, triangulation) + listVoronoi = {} + for i=1,#listCircumCircle do + listN = findNeighbour(triangulation[i],i,triangulation) + for j=1,#listN do + edge = {i,listN[j]} + if( not edgeInList(edge, listVoronoi)) then + table.insert(listVoronoi, edge) + end + end + end + return listVoronoi +end -------------------------- TeX -- build the list of points @@ -252,6 +327,81 @@ function rectangleList(a,b,nbrA,nbrB) return listPoints end + +-- trace Voronoi with MP +function traceVoronoiMP(listPoints, triangulation,listVoronoi, points, tri) + listCircumC = listCircumCenter(listPoints,triangulation) + output = ""; + output = output .. " pair MeshPoints[];" + for i=1,#listPoints do + output = output .. "MeshPoints[".. i .. "] = (" .. listPoints[i].x .. "," .. listPoints[i].y .. ")*u;" + end + output = output .. " pair CircumCenters[];" + for i=1,#listCircumC do + output = output .. "CircumCenters[".. i .. "] = (" .. listCircumC[i].x .. "," .. listCircumC[i].y .. ")*u;" + end + if(tri=="show") then + for i=1,#triangulation do + PointI = listPoints[triangulation[i][1]] + PointJ = listPoints[triangulation[i][2]] + PointK = listPoints[triangulation[i][3]] + if(triangulation[i].type == "bbox") then + output = output .. "draw (".. PointI.x ..",".. PointI.y ..")*u--("..PointJ.x..",".. PointJ.y ..")*u--("..PointK.x..",".. PointK.y ..")*u--cycle withcolor \\luameshmpcolorBbox;" + else + output = output .. "draw (".. PointI.x ..",".. PointI.y ..")*u--("..PointJ.x..",".. PointJ.y ..")*u--("..PointK.x..",".. PointK.y ..")*u--cycle withcolor \\luameshmpcolor;" + end + end + end + for i=1,#listVoronoi do + PointI = listCircumC[listVoronoi[i][1]] + PointJ = listCircumC[listVoronoi[i][2]] + output = output .. "draw (".. PointI.x ..",".. PointI.y ..")*u--("..PointJ.x..",".. PointJ.y ..")*u withcolor \\luameshmpcolorVoronoi;" + end + if(points=="points") then + j=1 + for i=1,#listPoints do + if(listPoints[i].type == "bbox") then + output = output .. "dotlabel.llft (btex $\\MeshPoint^{*}_{"..j.."}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolorBbox ;" + j=j+1 + else + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + end + end + for i=1,#listCircumC do + output = output .. "dotlabel.llft (btex $\\CircumPoint_{" .. i .. "}$ etex, (" .. listCircumC[i].x ..",".. listCircumC[i].y .. ")*u ) withcolor \\luameshmpcolorVoronoi ;" + end + else + j=1 + for i=1,#listPoints do + if(listPoints[i].type == "bbox") then + output = output .. "drawdot (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u withcolor \\luameshmpcolorBbox withpen pencircle scaled 3;" + j=j+1 + else + output = output .. "drawdot (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u withcolor \\luameshmpcolor withpen pencircle scaled 3;" + end + end + for i=1,#listCircumC do + output = output .. "drawdot (" .. listCircumC[i].x ..",".. listCircumC[i].y .. ")*u withcolor \\luameshmpcolorVoronoi withpen pencircle scaled 3;" + end + end + + return output +end + + + +-- buildVoronoi with MP +function buildVoronoiMPBW(chaine,mode,points,bbox,scale,tri) + listPoints = buildList(chaine, mode) + triangulation = BowyerWatson(listPoints,bbox) + listVoronoi = buildVoronoi(listPoints, triangulation) + output = traceVoronoiMP(listPoints,triangulation,listVoronoi,points,tri) + output = "\\leavevmode\\begin{mplibcode}beginfig(0);u:="..scale.. ";" .. output .."endfig;\\end{mplibcode}" + tex.sprint(output) +end + + + -- trace a triangulation with TikZ function traceMeshTikZ(listPoints, triangulation,points,color,colorBbox) output = "" diff --git a/luamesh.sty b/luamesh.sty index ae3db83..de6d9e7 100644 --- a/luamesh.sty +++ b/luamesh.sty @@ -153,6 +153,138 @@ % \fi% }% +%%%%%%%%%%%%%%%% the buildVoronoi command +%% the user can write code (tikz or MP) +%% before and after the generated code +\define@boolkey{buildVoronoiInc}{tikz}[true]{}% +%% show the bounding box for delaunay +\define@choicekey*{buildVoronoiInc}{bbox}[\val\nr]{none, show}{% + \ifcase\nr\relax% + \def\luameshval@bvi@bbox{none}% + \or% + \def\luameshval@bvi@bbox{bbox}% + \fi% +}% +%% the scale +\define@key{buildVoronoiInc}{scale}[1cm]{\def\luameshval@bvi@scale{#1}}% +%% print ponits ? +\define@choicekey*{buildVoronoiInc}{print}[\val\nr]{none, points}{% + \ifcase\nr\relax% + \def\luameshval@bvi@print{none}% + \or% + \def\luameshval@bvi@print{points}% + \fi% +}% +%% the name of the point +\define@key{buildVoronoiInc}{meshpoint}[P]{\def\luameshval@bvi@meshpoint{#1}}% +%% the mode for reading the points +\define@choicekey*{buildVoronoiInc}{mode}[\val\nr]{int, ext}{% + \ifcase\nr\relax% + \def\luameshval@bvi@mode{int}% + \or% + \def\luameshval@bvi@mode{ext}% + \fi% +}% +%% the name of the color of drawing +\define@key{buildVoronoiInc}{color}[black]{\def\luameshval@bvi@color{#1}}% +%% the name of the color of drawing the bbox +\define@key{buildVoronoiInc}{colorBbox}[black]{\def\luameshval@bvi@colorbbox{#1}}% +% +\presetkeys{buildVoronoiInc}{tikz=false,bbox=none,scale, meshpoint,mode=int,print=none,color,colorBbox}{}% +% +\newcommand*{\buildVoronoiBWinc}[4][]{% + % #1 : optionnal arguments + % #2 : the string containing the list of points + % (x1,y1);(x2,y2);... or the name file containing the points + % #3 : the code to place before the generated one + % #4 : the code to place after the generated one + \setkeys{buildVoronoiInc}{#1} % + \def\MeshPoint{\luameshval@bvi@meshpoint}% + \ifKV@buildVoronoiInc@tikz% if we are using tikz + \directlua{% + buildVoronoiTikZBWinc("#2","\luaescapestring{\unexpanded{#3}}","\luaescapestring{\unexpanded{#4}}","\luameshval@bvi@mode","\luameshval@bvi@print","\luameshval@bvi@bbox","\luameshval@bvi@scale","\luameshval@bvi@color","\luameshval@bvi@colorbbox")% + }% + \else % we are using MP + \mplibcolor{\luameshmpcolor}{\luameshval@bvi@color}% + \mplibcolor{\luameshmpcolorBbox}{\luameshval@bvi@colorbbox}% + \directlua{% + buildVoronoiMPBWinc("#2","\luaescapestring{\unexpanded{#3}}","\luaescapestring{\unexpanded{#4}}","\luameshval@bvi@mode","\luameshval@bvi@print","\luameshval@bvi@bbox","\luameshval@bvi@scale")% + }% + % + \fi% +}% +% +%%%%%%%%%%%%%%%% the buildVoronoiBW command +%% the code is complete and we don't have any callbacks +\define@boolkey{buildVoronoi}{tikz}[true]{}% +%% show the bounding box for delaunay +\define@choicekey*{buildVoronoi}{bbox}[\val\nr]{none, show}{% + \ifcase\nr\relax% + \def\luameshval@bv@bbox{none}% + \or% + \def\luameshval@bv@bbox{bbox}% + \fi% +}% +%% the scale +\define@key{buildVoronoi}{scale}[1cm]{\def\luameshval@bv@scale{#1}}% +%% print points +\define@choicekey*{buildVoronoi}{print}[\val\nr]{none, points}{% + \ifcase\nr\relax% + \def\luameshval@bv@print{none}% + \or% + \def\luameshval@bv@print{points}% + \fi% +}% +%% the name of the point +\define@key{buildVoronoi}{meshpoint}[P]{\def\luameshval@bv@meshpoint{#1}}% +%% the name of the circum point +\define@key{buildVoronoi}{circumpoint}[P]{\def\luameshval@bv@circumpoint{#1}}% +%% the mode for reading the points +\define@choicekey*{buildVoronoi}{mode}[\val\nr]{int, ext}{% + \ifcase\nr\relax% + \def\luameshval@bv@mode{int}% + \or% + \def\luameshval@bv@mode{ext}% + \fi% +}% +%% the mode for reading the points +\define@choicekey*{buildVoronoi}{delaunay}[\val\nr]{none, show}{% + \ifcase\nr\relax% + \def\luameshval@bv@delaunay{none}% + \or% + \def\luameshval@bv@delaunay{show}% + \fi% +}% +%% the name of the color of drawing +\define@key{buildVoronoi}{color}[black]{\def\luameshval@bv@color{#1}}% +%% the name of the color of drawing Voronoi +\define@key{buildVoronoi}{colorVoronoi}[red]{\def\luameshval@bv@colorVoronoi{#1}}% +%% the name of the color of drawing the bbox +\define@key{buildVoronoi}{colorBbox}[black]{\def\luameshval@bv@colorbbox{#1}}% +% +\presetkeys{buildVoronoi}{tikz=false,bbox=none,scale, meshpoint,circumpoint,mode=int,print=none,color,colorVoronoi,colorBbox,delaunay=none}{}% +% +\newcommand{\buildVoronoiBW}[2][]{% + % #1 : optionnal arguments + % #2 : the string containing the list of points + % (x1,y1);(x2,y2);... or the name file containing the points + \setkeys{buildVoronoi}{#1} % + \def\MeshPoint{\luameshval@bv@meshpoint}% + \def\CircumPoint{\luameshval@bv@circumpoint}% + \ifKV@buildVoronoi@tikz% if we are using tikz + \directlua{% + buildVoronoiTikZBW("#2","\luameshval@bv@mode","\luameshval@bv@print","\luameshval@bv@bbox","\luameshval@bv@scale","\luameshval@bv@color","\luameshval@bv@colorbbox")% + }% + \else % we are using MP + \mplibcolor{\luameshmpcolor}{\luameshval@bv@color}% + \mplibcolor{\luameshmpcolorBbox}{\luameshval@bv@colorbbox}% + \mplibcolor{\luameshmpcolorVoronoi}{\luameshval@bv@colorVoronoi}% + \directlua{% + buildVoronoiMPBW("#2","\luameshval@bv@mode","\luameshval@bv@print","\luameshval@bv@bbox","\luameshval@bv@scale","\luameshval@bv@delaunay")% + }% + % + \fi% +}% % % %%%%%%%%%%%%%%%%% the draw Points macro diff --git a/test/delaunay.pdf b/test/delaunay.pdf index 33fcbbe9651da80a21f0373fa727ef08aef12925..f2089436a3864b2f0eadc1c868f49fa2e3cefb9c 100644 GIT binary patch delta 13069 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⪙BR6p+UFZ^5zT&EdnulB##zDknmIsI z5%A-)dyVzw1BG7I8sS+Id$L5Gvfqb*!W$EK_&tZmd}(MV@BrE+@N}yuf`Io>#RQ33iFJwAZjvjc4dh~P*L1L1Xs4;L zuwFAVrLJdNd1$Swi-^+J4(P&jU%qM$xV3qD`nN$K5*zU5V1gZo)?gS!dTC&PDTGg( zrOb*tGLECR4XxM9;_>e|+<~?5L6w2;J){7TKZ%iXrr2s$)pgqA0j~>125-!0Y1g#+S4M_;(%*$v};}dRjh1gYd-X8RyLu zXmi;ZdMWnQTF_W79iON2JlZ)pl9B#T0Ljl#h&f(DBz!$xdMc+?`G%Vd_2nmHa*p=A4ea;CMuK zTfn$YlVfc#2d|bG0vmf8Q)vs!uQ~#GDW$+vsA>KIlZ?m9aR5qwXes*j3U|Vjk6L$T zAUm?Khv6AbP2_eozX(;gySNF{NF|=xQ6s+3)lyZX5BCG#_{7Zaooge~rayy4Tw88Q z?HfKfiap2(HqE0P)lbIJTg0tc@%`*#^eMnvtVWUaUVXBSsec6M$S zIWv0;S4&bh*8kops6mq&I*O~BsQ!l<6BKG#Q*XugS z2Zp`<%h?rSPW3=IudHPBVLxQw^yP42RuT~n+V7!sv<`sZLi=hiqKqUL97F2}lWB7X z+y4V$7t0X>Ef(34aS)qW0tzxz1gT89KQN1w$uWAaFcc0q2^$0jJ;VtcxEl%x=uZZ~ zijfr#+0Qd&qM;cVB8>*Pn28p;C@YBs<69Wj&PK$~Wo~_0X|W6{c#|fQ2J`>~Js;w9 z1(=C=6%XU?qSo5iH1ZQ3(_{41*3wioj8KDwoEsSh>D1XI)i{u;ci^WOofKGOOyc5a z$@2>&l@wBs=RssvwlIYIoeVCBk~LihPvA(!&ac1iaY+Hs>|2)2Fa(B}=g(Qk+Nz7`pC0G(6V8S#@Q%eoSSSM+QH9>_e z9??eHGM32UsvXrzT8Vk|@zj_k*wT~j6Y%JxqyH4s zNEZzg(lZ6y3mNd_o9?WyQ!&fSynAN`Kw0OD{&s{M@UHn6=En#t0K>J=vM);guqZ@Z z5SsY#)Rb=al#OT+k?}MXPt~6GvjS11k%)3RbG4dM!fRwrn z>Kgh${_DTj-;4LC7n*dJabyxIig&;b9TdARQ04ms7rw6LbiVOZcszq4ftXO})+gAX zF%7{3M@%k0o2w?fsabhvH_8WRhTm;wOU+rU z$e<*}WlrBL-CpTSE+)2&a8v22(Wv~7>0_7zoxU}xeBnPQpw}3vq0&LW4y)?*&oKO8 zd&rXoOPo(F%I{J8IPSqbC?;C8Q9yU4_&D-bG+|9&Nte{HH)lMfBgU(fJFL4kKJzmr9Lf;ji(>gCC&p|r5SHHlK znEJ0g{xSQ)$M4;y^n?4V<_nu172WGpz1=Nob?4gljOj!8{(lrq&Gx_2tzZDIq`)>p5P(~cMa9b7j1<7lqM^e^%1+9r$D-`u;7SSrkg}30v&h(+JCFi6 z|F0~eBOt-W&Bh@i#m+0r!6_!e!OP7hDhlA?VU^^NV3QEzWD_F&|C{LjZ(aM!!9n^z z!yC~U9eSS#X2|wMPaSoL-x3ma+z!lIfC}jk%v5?)O4!J4X