# Improve code for finding the coordinates of a triangular mesh?

Posted 1 month ago
298 Views
|
4 Replies
|
0 Total Likes
|
 Hello, The problem of finding the coordinates of a triangular (equilateral) mesh discussed earlier is solved. It also counts the number of equilateral triangles formed by the intersecting parallel lines. But the problem is that the code takes more time for larger values of n i.e. the size of the side of the triangle. Can the code be improved? The code is given here. Thanks for any suggestion. n = 4; Print["Number of lines/size of triangle = ", n] h = Sqrt[3] /2; Array[x, n]; Array[s, n]; x[0] = {{n/2, n h}}; For[i = 1, i <= n, i++, x[i] = Table[{x[0][[1, 1]] - i/2 + j, n h - i h}, {j, 0, i}]]; set = Apply[Union, Table[x[i], {i, 0, n}]]; Print["Number of vertices = ", Length[set]] cond := (EuclideanDistance[#[[1]], #[[2]]] == EuclideanDistance[#[[2]], #[[3]]] == EuclideanDistance[#[[1]], #[[3]]] && #[[1]] != #[[2]] != #[[ 3]] && #[[1, 1]] < #[[2, 1]] < #[[3, 1]] && (#[[1, 2]] == #[[2, 2]] || #[[2, 2]] == #[[3, 2]] || #[[ 3, 2]] == #[[1, 2]]) &) tr0 = Tuples[set, 3]; tr1 = Select[tr0, cond]; Print["Number of Triangles = ", Length[tr1]] 
4 Replies
Sort By:
Posted 6 days ago
 This is in co-ordinate system \[Alpha] {[0, 0}, {1, 0}} \[CirclePlus] \[Beta] {{0, 0}, {1/2, Srqt[3]/2}}, \[Alpha] >= 0, \[Beta] >= 0, 0 <= \[Alpha] + \[Beta] \<= n; only equilateral triangles are considered, so one computes the number of all equilateral triangles directly: In[44]:= (* number of vertices *) Clear[v] RSolve[v[n + 1] - v[n] - n == 2, v[n], n] Out[45]= {{v[n] -> -(1/2) (-2 - n) (1 + n) + C[1]}} In[46]:= Clear[v] v[n_Integer?NonNegative] := (n + 1) (n + 2)/2 In[48]:= v[83] Out[48]= 3570 In[57]:= (* number of length 1 edges *) Clear[ed] RSolve[ed[n + 1] - ed[n] == 3 (n + 1), ed[n], n] Out[58]= {{ed[n] -> -(3/2) (-1 - n) n + C[1]}} In[59]:= Clear[ed] ed[n_Integer?NonNegative] := 3 n (n + 1)/2 In[64]:= ed[4] Out[64]= 30 In[85]:= (* number of edge length 1 equilateral triangles *) Clear[t] t[n_Integer?NonNegative] := n^2 In[87]:= (* number of all equilateral triangles *) Clear[tt] tt[n_Integer?NonNegative] := t[n] + Sum[v[n - m], {m, 2, n}] + Sum[v[n - 2 m], {m, 2, Floor[n/2]}] In[89]:= tt /@ Range[0, 7] Out[89]= {0, 1, 5, 13, 27, 48, 78, 118} 
Posted 5 days ago
 Thank you Sir for the suggestion but I am sorry the steps are not very much clear to me. A little more elaboration will be helpful .
 The border of points in set is itself an equilateral triangle. So one should count: the equilateral triangles of edge length 1 by their leftmost corner In[28]:= FindInstance[t[p] == v[p - 1] + v[p - 2], p, Integers, 3] Out[28]= {{p -> 226}, {p -> 31}, {p -> 675}} this is an identity and of course v[p-1] is the number of upright ( $\Delta$) triangles and v[p-2] is the number of downright ( $\nabla$) triangles. Then here (* number of all equilateral triangles *) Clear[tt] tt[n_Integer?NonNegative] := t[n] + Sum[v[n - m], {m, 2, n}] + Sum[v[n - 2 m], {m, 2, Floor[n/2]}] gives the second summand the number of upright triangles with edge length m and the third summand is the number of downright triangles with edge length m.
 Thank you Sir for the nice explanation. By taking small values for n (The maximum edge length) and studying the pattern I have formulated the number of equilateral triangles as follows: 1. Number of Upward triangles = 1.n+2.(n-1)+3.(n-2)+…+n.1 = n(n+1)(n+2)/6 after simplification 2. Number of Downward triangles = (i) (1+2)+(1+2+3+4)+(1+2+3+4+5+6)+…up to (n-1)/2 terms, when n is ODD = (n-1)(n+1)(2 n+3)/24 after simplification And (ii) 1+(1+2+3)+(1+2+3+4+5)+….up to n/2 terms, when n is EVEN = n(n+2)(2 n-1)/24 after simplification , (*n = NUmber of Parallel lines = Maximum edge length*) uptr[n_] := n (n + 1) (n + 2)/6; dntr[n_] := If[EvenQ[n], n (n + 2) (2 n - 1)/24, (n - 1) (n + 1) (2 n + 3)/24]; (uptr[#] + dntr[#] &) /@ Range[0, 10]