From 4b4f6ae2ce34662269e37912c19c856ebf0cde17 Mon Sep 17 00:00:00 2001 From: "Maxime Chupin (Ceremade)" Date: Tue, 22 Nov 2016 16:55:34 +0100 Subject: [PATCH] bbox color --- luamesh.lua | 83 ++++++++++++++++++++++++++++++++-------------- luamesh.sty | 49 +++++++++++++-------------- test/delaunay.pdf | Bin 20068 -> 21469 bytes test/delaunay.tex | 11 +++--- 4 files changed, 90 insertions(+), 53 deletions(-) diff --git a/luamesh.lua b/luamesh.lua index 28e61db..de0c274 100644 --- a/luamesh.lua +++ b/luamesh.lua @@ -6,9 +6,9 @@ function BowyerWatson (listPoints,bbox) -- add four points to listPoints to have a bounding box listPoints = buildBoundingBox(listPoints) -- the first triangle - triangulation[1] = {lgth+1, lgth+2, lgth+3} + triangulation[1] = {lgth+1, lgth+2, lgth+3,type="bbox"} -- the second triangle - triangulation[2] = {lgth+1, lgth+3, lgth+4} + triangulation[2] = {lgth+1, lgth+3, lgth+4,type="bbox"} -- add points one by one for i=1,lgth do -- find the triangles which the circumcircle contained the point to add @@ -21,7 +21,11 @@ function BowyerWatson (listPoints,bbox) end -- build the new triangles and add them to triangulation for j=1,#polygon do - table.insert(triangulation,{polygon[j][1],polygon[j][2],i}) + if((polygon[j][1]>lgth) or (polygon[j][2]>lgth) or (i>lgth)) then + table.insert(triangulation,{polygon[j][1],polygon[j][2],i,type="bbox"}) + else + table.insert(triangulation,{polygon[j][1],polygon[j][2],i,type="in"}) + end end end -- end adding points of the listPoints -- remove bounding box @@ -64,10 +68,10 @@ function buildBoundingBox(listPoints) ymin = ymin - eps ymax = ymax + eps -- add points of the bounding box in last positions - table.insert(listPoints,{x=xmin,y=ymin}) - table.insert(listPoints,{x=xmin,y=ymax}) - table.insert(listPoints,{x=xmax,y=ymax}) - table.insert(listPoints,{x=xmax,y=ymin}) + table.insert(listPoints,{x=xmin,y=ymin,type="bbox"}) + table.insert(listPoints,{x=xmin,y=ymax,type="bbox"}) + table.insert(listPoints,{x=xmax,y=ymax,type="bbox"}) + table.insert(listPoints,{x=xmax,y=ymin,type="bbox"}) return listPoints end @@ -267,7 +271,7 @@ end -- trace a triangulation with MP -function traceMeshMP(listPoints, triangulation,points,color) +function traceMeshMP(listPoints, triangulation,points) output = ""; output = output .. " pair MeshPoints[];" for i=1,#listPoints do @@ -278,11 +282,19 @@ function traceMeshMP(listPoints, triangulation,points,color) PointI = listPoints[triangulation[i][1]] PointJ = listPoints[triangulation[i][2]] PointK = listPoints[triangulation[i][3]] - output = output .. "draw (".. PointI.x ..",".. PointI.y ..")*u--("..PointJ.x..",".. PointJ.y ..")*u--("..PointK.x..",".. PointK.y ..")*u--cycle withcolor \\mpcolor{"..color.. "};" + 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 if(points=="points") then for i=1,#listPoints do - output = output .. "dotlabel.llft( btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u) withcolor \\mpcolor{"..color.. "};" + if(listPoints[i].type == "bbox") then + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolorBbox ;" + else + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + end end end return output @@ -303,15 +315,11 @@ end -- buildMesh with MP -function buildMeshMPBW(chaine,mode,points,bbox,full,scale,color) +function buildMeshMPBW(chaine,mode,points,bbox,scale) listPoints = buildList(chaine, mode) triangulation = BowyerWatson(listPoints,bbox) - output = traceMeshMP(listPoints, triangulation,points,color) - if(full=="full") then - output = "\\leavevmode\\begin{mplibcode}beginfig(0);u:="..scale.. ";" .. output .."endfig;\\end{mplibcode}" - else - output = "u:="..scale.. ";".. output - end + output = traceMeshMP(listPoints, triangulation,points) + output = "\\leavevmode\\begin{mplibcode}beginfig(0);u:="..scale.. ";" .. output .."endfig;\\end{mplibcode}" tex.sprint(output) end @@ -450,6 +458,7 @@ function TeXaddOnePointTikZ(chaine,point,step,color,colorBack, colorNew, colorCi end function TeXaddOnePointMPBW(listPoints,P,step,bbox) + print(bbox) output = ""; output = output .. "pair MeshPoints[];" -- build the triangulation @@ -464,7 +473,11 @@ function TeXaddOnePointMPBW(listPoints,P,step,bbox) PointI = listPoints[triangulation[i][1]] PointJ = listPoints[triangulation[i][2]] PointK = listPoints[triangulation[i][3]] - output = output .. "draw (".. PointI.x ..",".. PointI.y ..")*u--("..PointJ.x..",".. PointJ.y ..")*u--("..PointK.x..",".. PointK.y ..")*u--cycle withcolor \\luameshmpcolor;" + 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 -- draw and fill the bad triangle for i=1,#badTriangles do @@ -484,7 +497,11 @@ function TeXaddOnePointMPBW(listPoints,P,step,bbox) end -- mark the points for i=1,#listPoints do - output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor;" + if(listPoints[i].type == "bbox") then + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolorBbox ;" + else + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + end end -- mark the point to add output = output .. "dotlabel.llft (btex $\\NewPoint$ etex,(" .. P.x ..",".. P.y .. ")*u) withcolor \\luameshmpcolorNew;" @@ -500,7 +517,11 @@ function TeXaddOnePointMPBW(listPoints,P,step,bbox) PointI = listPoints[triangulation[i][1]] PointJ = listPoints[triangulation[i][2]] PointK = listPoints[triangulation[i][3]] - output = output .. "draw (".. PointI.x ..",".. PointI.y ..")*u--("..PointJ.x..",".. PointJ.y ..")*u--("..PointK.x..",".. PointK.y ..")*u--cycle withcolor \\luameshmpcolor;" + 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 -- fill and draw the cavity path = "" @@ -512,7 +533,11 @@ function TeXaddOnePointMPBW(listPoints,P,step,bbox) output = output .. "draw " .. path .. "cycle withcolor \\luameshmpcolorNew withpen pencircle scaled 1pt;" -- mark the points of the mesh for i=1,#listPoints do - output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + if(listPoints[i].type == "bbox") then + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolorBbox ;" + else + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + end end -- mark the adding point output = output .. "dotlabel.llft (btex $\\NewPoint$ etex,(" .. P.x ..",".. P.y .. ")*u) withcolor \\luameshmpcolorNew ;" @@ -528,7 +553,11 @@ function TeXaddOnePointMPBW(listPoints,P,step,bbox) PointI = listPoints[triangulation[i][1]] PointJ = listPoints[triangulation[i][2]] PointK = listPoints[triangulation[i][3]] - output = output .. "draw (".. PointI.x ..",".. PointI.y ..")*u--("..PointJ.x..",".. PointJ.y ..")*u--("..PointK.x..",".. PointK.y ..")*u--cycle withcolor \\luameshmpcolor ;" + 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 -- fill the cavity path = "" @@ -545,7 +574,11 @@ function TeXaddOnePointMPBW(listPoints,P,step,bbox) end -- mark points for i=1,#listPoints do - output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + if(listPoints[i].type == "bbox") then + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolorBbox ;" + else + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + end end -- mark the added point output = output .. "dotlabel.llft (btex $\\NewPoint$ etex,(" .. P.x ..",".. P.y .. ")*u) withcolor \\luameshmpcolorNew ;" @@ -576,7 +609,7 @@ function TeXOnePointTikZ(chaine,point,step,color,colorBack,colorNew,colorCircle, tex.sprint(output) end -function TeXOnePointMPBW(chaine,point,step,scale,mode,picture,bbox) +function TeXOnePointMPBW(chaine,point,step,scale,mode,bbox) if(mode=="int") then Sx,Sy=string.match(point,"%((.+),(.+)%)") P = {x=Sx, y=Sy} @@ -590,7 +623,7 @@ function TeXOnePointMPBW(chaine,point,step,scale,mode,picture,bbox) tex.sprint(output) end -function TeXOnePointMPBWinc(chaine,point,beginning,ending,step,scale,mode,picture,bbox) +function TeXOnePointMPBWinc(chaine,point,beginning,ending,step,scale,mode,bbox) if(mode=="int") then Sx,Sy=string.match(point,"%((.+),(.+)%)") P = {x=Sx, y=Sy} diff --git a/luamesh.sty b/luamesh.sty index 9d394d9..82e3214 100644 --- a/luamesh.sty +++ b/luamesh.sty @@ -42,45 +42,39 @@ %% show the bounding box for delaunay \define@choicekey*{buildMesh}{bbox}[\val\nr]{none, show}{% \ifcase\nr\relax% - \def\luameshval@bbox{none}% + \def\luameshval@bm@bbox{none}% \or% - \def\luameshval@bbox{bbox}% + \def\luameshval@bm@bbox{bbox}% \fi% }% %% the scale -\define@key{buildMesh}{scale}[1cm]{\def\luameshval@scale{#1}}% +\define@key{buildMesh}{scale}[1cm]{\def\luameshval@bm@scale{#1}}% %% print ponits ? \define@choicekey*{buildMesh}{print}[\val\nr]{none, points}{% \ifcase\nr\relax% - \def\luameshval@print{none}% + \def\luameshval@bm@print{none}% \or% - \def\luameshval@print{points}% + \def\luameshval@bm@print{points}% \fi% }% %% the name of the point -\define@key{buildMesh}{meshpoint}[P]{\def\luameshval@meshpoint{#1}}% +\define@key{buildMesh}{meshpoint}[P]{\def\luameshval@bm@meshpoint{#1}}% %% the mode for reading the points \define@choicekey*{buildMesh}{mode}[\val\nr]{int, ext}{% \ifcase\nr\relax% - \def\luameshval@mode{int}% + \def\luameshval@bm@mode{int}% \or% - \def\luameshval@mode{ext}% + \def\luameshval@bm@mode{ext}% \fi% }% % -%% a complete picture or some code of the engine -\define@choicekey*{buildMesh}{picture}[\val\nr]{full, embedded}{% - \ifcase\nr\relax% - \def\luameshval@picture{full}% - \or% - \def\luameshval@picture{embedded}% - \fi% -}% %color %% the name of the color of drawing -\define@key{buildMesh}{color}[black]{\def\luameshval@color{#1}}% - -\presetkeys{buildMesh}{tikz=false,bbox=none,scale, meshpoint,mode=int,print=none,picture=full,color}{}% +\define@key{buildMesh}{color}[black]{\def\luameshval@bm@color{#1}}% +%% the name of the color of drawing the bbox +\define@key{buildMesh}{colorBbox}[black]{\def\luameshval@bm@colorbbox{#1}}% +% +\presetkeys{buildMesh}{tikz=false,bbox=none,scale, meshpoint,mode=int,print=none,color,colorBbox}{}% % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % the difinition BW Bowyer and Watson algo @@ -88,14 +82,16 @@ % #1 : the string containing the list of points % (x1,y1);(x2,y2);... or the name file containing the points \setkeys{buildMesh}{#1} % - \def\MeshPoint{\luameshval@meshpoint}% + \def\MeshPoint{\luameshval@bm@meshpoint}% \ifKV@buildMesh@tikz% if we are using tikz \directlua{% - buildMeshTikZ("#2","\luameshval@mode","\luameshval@print","\luameshval@bbox","full","\luameshval@scale","\luameshval@color")% + buildMeshTikZ("#2","\luameshval@bm@mode","\luameshval@bm@print","\luameshval@bm@bbox","full","\luameshval@bm@scale","\luameshval@bm@color")% }% \else % we are using MP + \mplibcolor{\luameshmpcolor}{\luameshval@bm@color} + \mplibcolor{\luameshmpcolorBbox}{\luameshval@bm@colorbbox} \directlua{% - buildMeshMPBW("#2","\luameshval@mode","\luameshval@print","\luameshval@bbox","full","\luameshval@scale","\luameshval@color")% + buildMeshMPBW("#2","\luameshval@bm@mode","\luameshval@bm@print","\luameshval@bm@bbox","\luameshval@bm@scale")% }% % \fi% @@ -132,6 +128,8 @@ \define@key{MeshAddOne}{colorNew}[red]{\def\luameshval@colornew{#1}}% %% the color of circoncircle \define@key{MeshAddOne}{colorCircle}[green]{\def\luameshval@colorcircle{#1}}% +%% the name of the color of drawing the bbox +\define@key{MeshAddOne}{colorBbox}[black]{\def\luameshval@colorbbox{#1}}% % %% a complete picture or some code of the engine \define@choicekey*{MeshAddOne}{mode}[\val\nr]{int, ext}{% @@ -148,7 +146,7 @@ \def\luameshval@bbox{bbox}% \fi% }% -\presetkeys{MeshAddOne}{tikz=false,scale, meshpoint,newpoint,color,colorBack,colorNew,colorCircle,step=badtriangles,mode=int,bbox=none}{}% +\presetkeys{MeshAddOne}{tikz=false,scale, meshpoint,newpoint,color,colorBack,colorNew,colorCircle,step=badtriangles,mode=int,bbox=none,colorBbox}{}% % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % the difinition BW Bowyer and Watson algo @@ -167,6 +165,7 @@ \mplibcolor{\luameshmpcolorBack}{\luameshval@colorback} \mplibcolor{\luameshmpcolorNew}{\luameshval@colornew} \mplibcolor{\luameshmpcolorCircle}{\luameshval@colorcircle} + \mplibcolor{\luameshmpcolorBbox}{\luameshval@colorbbox} \directlua{% TeXOnePointMPBW("#2","#3","\luameshval@step","\luameshval@scale","\luameshval@mode","\luameshval@bbox")% }% @@ -202,6 +201,7 @@ \define@key{MeshAddOneBWinc}{colorNew}[red]{\def\luameshval@colornew{#1}}% %% the color of circoncircle \define@key{MeshAddOneBWinc}{colorCircle}[green]{\def\luameshval@colorcircle{#1}}% +\define@key{MeshAddOneBWinc}{colorBbox}[black]{\def\luameshval@colorbbox{#1}}% % %% a complete picture or some code of the engine \define@choicekey*{MeshAddOneBWinc}{mode}[\val\nr]{int, ext}{% @@ -218,7 +218,7 @@ \def\luameshval@bbox{bbox}% \fi% }% -\presetkeys{MeshAddOneBWinc}{tikz=false,scale, meshpoint,newpoint,color,colorBack,colorNew,colorCircle,step=badtriangles,mode=int,bbox=none}{}% +\presetkeys{MeshAddOneBWinc}{tikz=false,scale, meshpoint,newpoint,color,colorBack,colorNew,colorCircle,step=badtriangles,mode=int,bbox=none,colorBbox}{}% % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % the difinition BW embedded code between the 2 last arguments @@ -237,6 +237,7 @@ \mplibcolor{\luameshmpcolorBack}{\luameshval@colorback} \mplibcolor{\luameshmpcolorNew}{\luameshval@colornew} \mplibcolor{\luameshmpcolorCircle}{\luameshval@colorcircle} + \mplibcolor{\luameshmpcolorBbox}{\luameshval@colorbbox} \directlua{% TeXOnePointMPBWinc("#2","#3","#4","#5","\luameshval@step","\luameshval@scale","\luameshval@mode","\luameshval@bbox")% }% diff --git a/test/delaunay.pdf b/test/delaunay.pdf index acecd55e5a67cc779f17101b46b747094339a103..05c518f874c01dd43b284c773f92dafa2bc56183 100644 GIT binary patch delta 13173 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