Drawing convex polyiamonds

Ruby, 202 bytes

->n{(r=[*0..n]).product(r,r,r).map{|i|p,b,c,d=i;b>c||c>d||b+c+d>p||p*p-b*b-c*c-d*d!=n||0.upto(p-d<<1){|j|s=" "*j+"*---\\ / "[j%2*4,4]*p*2;(k=b*4-j)>0&&s[0,k]=" "*k;puts s[0,[p*4+1-j,p*4+1-c*4+j].min]}}}

Try it online!

Uses formula per the OEIS sequence: search for solutions where n = p**2 - b**2 -c**2 - d**2.

n =the number of triangular tiles

p =the side length of a large equilateral triangle (pointing downwards)

b,c,d =the side length of three smaller equilateral triangles, which are removed from the corners of the large equilateral triangle to get the required shape.

Some additional conditions (per OEIS) are needed to avoid duplicates: b<=c<=d and b+c+d<=p

Charcoal, 89 bytes

NθF⊕θF⊕ιF⊕κF⊕λ¿∧¬‹ι⁺⁺κλμ⁼⁻×ιιθΣE⟦κλμ⟧×νν«⸿G↙⊕⊗μ↘⊕⊗⁻ι⁺κμ→⊕×⁴κ↗⊕⊗⁻ι⁺κλ↖⊕⊗λ“⌈∨¿ZH↖↖⸿T u≡9”D⎚

Try it online! Link is to verbose version of code. Thanks to @LevelRiverSt for explaining the OEIS formula. Explanation:


Input n. (Using the OEIS formula names rather than the Charcol names here.)


Loop p from 0 to n, d from 0 to p, c from 0 to d and b from 0 to c inclusive. This satisfies the condition b<=c<=d<=p.


Check the other two conditions: b+c+d<=p and n=p*p-b*b-c*c-d*d. Sadly the power function doesn't vectorise yet otherwise that would save 2 bytes.


Leave a blank line between polyiamonds.

G↙⊕⊗μ↘⊕⊗⁻ι⁺κμ→⊕×⁴κ↗⊕⊗⁻ι⁺κλ↖⊕⊗λ“⌈∨¿ZH↖↖⸿T u≡9”

Draw the polyiamond. Five of the sides are calculated, and the sixth is inferred and the polygon filled using the compressed string / \ *--- \ / --*-, which results in the desired pattern. (The pattern doesn't start with *--- because the blank line causes the pattern to be offset.)


Output and clear the canvas ready for the next polyiamond. This is quicker than positioning the cursor.