diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua | 265 |
1 files changed, 132 insertions, 133 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua index 997a452399f..e007e9b59b7 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua @@ -14,10 +14,10 @@ -- An arc is a light-weight object representing an arc from a vertex -- in a graph to another vertex. You may not create an |Arc| by -- yourself, which is why there is no |new| method, arc creation is --- done by the Digraph class. +-- done by the Digraph class. -- -- Every arc belongs to exactly one graph. If you want the same arc in --- another graph, you need to newly connect two vertices in the other graph. +-- another graph, you need to newly connect two vertices in the other graph. -- -- You may read the |head| and |tail| fields, but you may not write -- them. In order to store data for an arc, use |Storage| objects. @@ -28,7 +28,7 @@ -- be multiple edges between two vertices. This means, in particular, -- that an arc has no |options| field. Rather, it has several -- |optionsXxxx| functions, that will search for options in all of the --- synactic edges that ``belong'' to an edge. +-- syntactic edges that ``belong'' to an edge. -- -- In order to \emph{set} options of the edges, you can set the -- |generated_options| field of an arc (which is |nil| by default), see @@ -72,7 +72,7 @@ -- @field animations If non-nil, some animations to be passed back -- to the original syntactic edges. See the description of the -- |animations| field for |Vertex| for details on the syntax. --- @field syntactic_edges In case this arc is an arc in the syntatic +-- @field syntactic_edges In case this arc is an arc in the syntactic -- digraph (and only then), this field contains an array containing -- syntactic edges (``real'' edges in the syntactic digraph) that -- underly this arc. Otherwise, the field will be empty or |nil|. @@ -106,15 +106,17 @@ local lib = require 'pgf.gd.lib' -- If your algorithm gets confused by multiple edges, try saying -- |a:options(your_option)|. This will always give the ``most -- sensible'' choice of the option if there are multiple edges --- corresponding to the same arc. +-- corresponding to the same arc. -- -- @param option A string option like |"length"|. -- --- @return A table with the following contents: +-- @return A table with the following contents: +-- % -- \begin{enumerate} --- \item It is an array of all values the option has for edges --- corresponding to |self| in the syntactic digraph. Suppose, for --- instance, you write the following: +-- \item It is an array of all values the option has for edges +-- corresponding to |self| in the syntactic digraph. Suppose, for +-- instance, you write the following: +-- % --\begin{codeexample}[code only] --graph { -- tail -- [length=1] head, % multi edge 1 @@ -125,31 +127,32 @@ local lib = require 'pgf.gd.lib' -- tail -- [length=2] head, % multi edge 6 --} --\end{codeexample} --- Suppose, furthermore, that |length| has been setup as an edge --- option. Now suppose that |a| is the arc from the vertex |tail| to --- the vertex |head|. Calling |a:optionsArray('length')| will --- yield the array part |{1,3,2,8,7}|. The reason for the ordering is --- as follows: First come all values |length| had for syntactic edges --- going from |self.tail| to |self.head| in the order they appear in the graph --- description. Then come all values the options has for syntactic --- edges going from |self.head| to |self.tail|. The reason for this --- slightly strange behaviour is that many algorithms do not really --- care whether someone writes |a --[length=1] b| or --- |b --[length=1] a|; in both cases they would ``just'' like to know --- that the length is~|1|. --- --- \item There is field called |aligned|, which is an array storing --- the actual syntactic edge objects whose values can be found in the --- array part of the returned table. However, |aligned| contains only --- the syntactic edges pointing ``in the same direction'' as the arc, --- that is, the tail and head of the syntactic edge are the same as --- those of the arc. In the above example, this array would contain --- the edges with the comment numbers |1|, |2|, and |6|. --- --- Using the length of this array and the fact that the ``aligned'' --- values come first in the table, you can easily iterate over the --- |option|'s values of only those edges that are aligned with the arc: --- +-- % +-- Suppose, furthermore, that |length| has been setup as an edge +-- option. Now suppose that |a| is the arc from the vertex |tail| to +-- the vertex |head|. Calling |a:optionsArray('length')| will +-- yield the array part |{1,3,2,8,7}|. The reason for the ordering is +-- as follows: First come all values |length| had for syntactic edges +-- going from |self.tail| to |self.head| in the order they appear in the +-- graph description. Then come all values the options has for syntactic +-- edges going from |self.head| to |self.tail|. The reason for this +-- slightly strange behavior is that many algorithms do not really +-- care whether someone writes |a --[length=1] b| or +-- |b --[length=1] a|; in both cases they would ``just'' like to know +-- that the length is~|1|. +-- +-- \item There is field called |aligned|, which is an array storing +-- the actual syntactic edge objects whose values can be found in the +-- array part of the returned table. However, |aligned| contains only +-- the syntactic edges pointing ``in the same direction'' as the arc, +-- that is, the tail and head of the syntactic edge are the same as +-- those of the arc. In the above example, this array would contain +-- the edges with the comment numbers |1|, |2|, and |6|. +-- +-- Using the length of this array and the fact that the ``aligned'' +-- values come first in the table, you can easily iterate over the +-- |option|'s values of only those edges that are aligned with the arc: +-- % --\begin{codeexample}[code only, tikz syntax=false] --local a = g:arc(tail.head) -- some arc --local opt = a:optionsArray('length') @@ -158,17 +161,16 @@ local lib = require 'pgf.gd.lib' -- sum = sum + opt[i] --end --\end{codeexample} --- ---\item There is a field called |anti_aligned|, which is an array --- containing exactly the edges in the array part of the table not --- aligned with the arc. The numbering start at |1| as usual, so the --- $i$th entry of this table corresponds to the entry at position $i + --- \verb!#opt.aligned!$ of the table. --- ---\end{enumerate} +-- % +-- \item There is a field called |anti_aligned|, which is an array +-- containing exactly the edges in the array part of the table not +-- aligned with the arc. The numbering start at |1| as usual, so the +-- $i$th entry of this table corresponds to the entry at position $i + +-- \verb!#opt.aligned!$ of the table. +-- \end{enumerate} -- function Arc:optionsArray(option) - + local cache = self.option_cache local t = cache[option] if t then @@ -185,23 +187,23 @@ function Arc:optionsArray(option) if arc then for _,m in ipairs(arc.syntactic_edges) do if m.options[option] ~= nil then - aligned[#aligned + 1] = m + aligned[#aligned + 1] = m end end table.sort(aligned, function (a,b) return a.event.index < b.event.index end) end - + local arc = head ~= tail and s_graph:arc(head, tail) local anti_aligned = {} if arc then for _,m in ipairs(arc.syntactic_edges) do if m.options[option] ~= nil then - anti_aligned[#anti_aligned + 1] = m + anti_aligned[#anti_aligned + 1] = m end end table.sort(anti_aligned, function (a,b) return a.event.index < b.event.index end) end - + -- Now merge them together local t = { aligned = aligned, anti_aligned = anti_aligned } for i=1,#aligned do @@ -211,7 +213,7 @@ function Arc:optionsArray(option) t[#t+1] = anti_aligned[i].options[option] end cache[option] = t - + return t end @@ -221,11 +223,11 @@ end -- Returns the first option, that is, the first entry of -- |Arc:optionsArray(option)|. However, if the |only_aligned| -- parameter is set to true and there is no option with any aligned --- synactic edge, |nil| is returned. +-- syntactic edge, |nil| is returned. -- -- @param option An option -- @param only_aligned If true, only aligned syntactic edges will be --- considered. +-- considered. -- @return The first entry of the |optionsArray| function Arc:options(option, only_aligned) if only_aligned then @@ -256,7 +258,7 @@ end -- edges will be considered. -- -- @return If the option is not set for any (aligned) syntactic edges --- corresponding to |self|, |nil| is returned. If there is exectly one +-- corresponding to |self|, |nil| is returned. If there is exactly one -- edge, the value of this edge is returned. Otherwise, the result of -- repeatedly applying the |accumulator| function as described -- above. @@ -265,6 +267,7 @@ end -- |accumulator| function again. -- -- @usage Here is typical usage: +-- % --\begin{codeexample}[code only, tikz syntax=false] --local total_length = a:optionsAccumulated('length', function (a,b) return a+b end) or 0 --\end{codeexample} @@ -277,7 +280,7 @@ function Arc:optionsAccumulated(option, accumulator, only_aligned) if v == nil then v = opt[1] for i=2,#aligned do - v = accumulator(v, opt[i]) + v = accumulator(v, opt[i]) end align[accumulator] = v end @@ -287,7 +290,7 @@ function Arc:optionsAccumulated(option, accumulator, only_aligned) if v == nil then v = opt[1] for i=2,#opt do - v = accumulator(v, opt[i]) + v = accumulator(v, opt[i]) end opt[accumulator] = v end @@ -301,7 +304,7 @@ end -- Compute the syntactic head and tail of an arc. For this, we have a -- look at the syntactic digraph underlying the arc. If there is at -- least once syntactic edge going from the arc's tail to the arc's --- head, the arc's tail and head are returned. Otherweise, we test +-- head, the arc's tail and head are returned. Otherwise, we test -- whether there is a syntactic edge in the other direction and, if -- so, return head and tail in reverse order. Finally, if there is no -- syntactic edge at all corresponding to the arc in either direction, @@ -338,15 +341,15 @@ function Arc:pointCloud () if a then for _,e in ipairs(a.syntactic_edges) do for _,p in ipairs(e.path) do - if type(p) == "table" then - cloud[#cloud + 1] = p - end + if type(p) == "table" then + cloud[#cloud + 1] = p + end end end end self.cached_point_cloud = cloud return cloud -end +end @@ -377,7 +380,7 @@ function Arc:eventIndex () end self.cached_event_index = e return e -end +end @@ -389,21 +392,16 @@ end -- edge involved in the arc. -- -- The priority of an edge is computed as follows: --- +-- % -- \begin{enumerate} --- \item If the option |"span priority"| is set, this number --- will be used. --- --- \item If the edge has the same head as the arc, we lookup the key\\ --- |"span priority " .. edge.direction|. If set, we use --- this value. --- --- \item If the edge has a different head from the arc (the arc is --- ``reversed'' with respect to the syntactic edge), we lookup the key --- |"span priority reversed " .. edge.direction|. If set, --- we use this value. --- --- \item Otherwise, we use priority 5. +-- \item If the option |"span priority"| is set, this number +-- will be used. +-- \item If the edge has the same head as the arc, we lookup the key\\ +-- |"span priority " .. edge.direction|. If set, we use this value. +-- \item If the edge has a different head from the arc (the arc is +-- ``reversed'' with respect to the syntactic edge), we lookup the key +-- |"span priority reversed " .. edge.direction|. If set, we use this value. +-- \item Otherwise, we use priority 5. -- \end{enumerate} -- -- @return The priority of the arc, as described above. @@ -412,7 +410,7 @@ function Arc:spanPriority() if self.cached_span_priority then return self.cached_span_priority end - + local head = self.head local tail = self.tail local min @@ -422,8 +420,8 @@ function Arc:spanPriority() if a then for _,m in ipairs(a.syntactic_edges) do local p = - m.options["span priority"] or - lib.lookup_option("span priority " .. m.direction, m, g) + m.options["span priority"] or + lib.lookup_option("span priority " .. m.direction, m, g) min = math.min(p or 5, min or math.huge) end @@ -433,15 +431,15 @@ function Arc:spanPriority() if a then for _,m in ipairs(a.syntactic_edges) do local p = - m.options["span priority"] or - lib.lookup_option("span priority reversed " .. m.direction, m, g) - + m.options["span priority"] or + lib.lookup_option("span priority reversed " .. m.direction, m, g) + min = math.min(p or 5, min or math.huge) end end - + self.cached_span_priority = min or 5 - + return min or 5 end @@ -461,6 +459,7 @@ end -- which will replace the function in the |Path|. -- -- You use this method like this: +-- % --\begin{codeexample}[code only, tikz syntax=false] --... --local arc = g:connect(s,t) @@ -485,34 +484,34 @@ function Arc:sync() local a = self.syntactic_digraph:arc(tail,head) if a and #a.syntactic_edges>0 then for _,e in ipairs(a.syntactic_edges) do - local clone = path:clone() - for i=1,#clone do - local p = clone[i] - if type(p) == "function" then - clone[i] = p(e) - if type(clone[i]) == "table" then - clone[i] = clone[i]:clone() - end - end - end - e.path = clone + local clone = path:clone() + for i=1,#clone do + local p = clone[i] + if type(p) == "function" then + clone[i] = p(e) + if type(clone[i]) == "table" then + clone[i] = clone[i]:clone() + end + end + end + e.path = clone end end local a = head ~= tail and self.syntactic_digraph:arc(head,tail) if a and #a.syntactic_edges>0 then for _,e in ipairs(a.syntactic_edges) do - local clone = path:reversed() - for i=1,#clone do - local p = clone[i] - if type(p) == "function" then - clone[i] = p(e) - if type(clone[i]) == "table" then - clone[i] = clone[i]:clone() - end - end - end - e.path = clone - end + local clone = path:reversed() + for i=1,#clone do + local p = clone[i] + if type(p) == "function" then + clone[i] = p(e) + if type(clone[i]) == "table" then + clone[i] = clone[i]:clone() + end + end + end + e.path = clone + end end end if self.generated_options then @@ -521,19 +520,19 @@ function Arc:sync() local a = self.syntactic_digraph:arc(tail,head) if a and #a.syntactic_edges>0 then for _,e in ipairs(a.syntactic_edges) do - for _,o in ipairs(self.generated_options) do - e.generated_options[#e.generated_options+1] = o - end + for _,o in ipairs(self.generated_options) do + e.generated_options[#e.generated_options+1] = o + end end end local a = head ~= tail and self.syntactic_digraph:arc(head,tail) if a and #a.syntactic_edges>0 then for _,e in ipairs(a.syntactic_edges) do - for _,o in ipairs(self.generated_options) do - e.generated_options[#e.generated_options+1] = o - end + for _,o in ipairs(self.generated_options) do + e.generated_options[#e.generated_options+1] = o + end end - end + end end if self.animations then local head = self.head @@ -541,17 +540,17 @@ function Arc:sync() local a = self.syntactic_digraph:arc(tail,head) if a and #a.syntactic_edges>0 then for _,e in ipairs(a.syntactic_edges) do - for _,o in ipairs(self.animations) do - e.animations[#e.animations+1] = o - end + for _,o in ipairs(self.animations) do + e.animations[#e.animations+1] = o + end end end local a = head ~= tail and self.syntactic_digraph:arc(head,tail) if a and #a.syntactic_edges>0 then for _,e in ipairs(a.syntactic_edges) do - for _,o in ipairs(self.animations) do - e.animations[#e.animations+1] = o - end + for _,o in ipairs(self.animations) do + e.animations[#e.animations+1] = o + end end end end @@ -572,8 +571,8 @@ end -- method to get a function that will, later on, compute the correct -- position of the anchor as needed. -- --- Here is the code you would use to create the abovementioned path: --- +-- Here is the code you would use to create the above-mentioned path: +-- % --\begin{codeexample}[code only, tikz syntax=false] --local a = g:connect(tail,head) --... @@ -585,19 +584,19 @@ end -- -- Normally, however, you will not write code as detailed as the above -- and you would just write instead of the last three lines: --- +-- % --\begin{codeexample}[code only, tikz syntax=false] --arc:setPolylinePath { Coordinate.new (10, 10) } --\end{codeexample} function Arc:tailAnchorForArcPath() return function (edge) - local a = edge.options['tail anchor'] - if a == "" then - a = "center" - end - return self.tail:anchor(a) + self.tail.pos - end + local a = edge.options['tail anchor'] + if a == "" then + a = "center" + end + return self.tail:anchor(a) + self.tail.pos + end end --- @@ -605,12 +604,12 @@ end function Arc:headAnchorForArcPath() return function (edge) - local a = edge.options['head anchor'] - if a == "" then - a = "center" - end - return self.head:anchor(a) + self.head.pos - end + local a = edge.options['head anchor'] + if a == "" then + a = "center" + end + return self.head:anchor(a) + self.head.pos + end end @@ -633,7 +632,7 @@ function Arc:setPolylinePath(coordinates) end p:appendLineto(self:headAnchorForArcPath()) - + self.path = p end |