I have a list of vertices from a polygon and I'm trying to create an equilateral triangular grid inside a larger triangle centered around the current vertex from the input polygon.
The size of the internal triangle's sides is determined by L which divides the container side to L equal parts. Finally I'd like to store the coordinates of the vertices of all these triangles (including the original larger triangle) in a list in Python.
One approach I have come up with is the following:
- Find equidistant points with respect to
Lon each side of the large triangle - Connect these points to the adjacent larger side
- Create a Shapely
LineStringfrom each of corresponding points - Run a for loop that utilizes Shapely's
object.intersection()function that returns the coordinates
However I'm open to ideas and other approaches possibly more efficient ones.
Here's my code so far:
import math
import sys
# Constructs the larger, container triangle given the centroid (a vertex from the input polygon)
def construct_eq_triangle(centroid, radius):
side_length = radius * math.sqrt(3)
# Calculate three vertices of the container triangle
a = [centroid[0], centroid[1] + (math.sqrt(3) / 3) * side_length] # Top vertex
b = [centroid[0] - (side_length / 2), centroid[1] - (math.sqrt(3) / 6) * side_length] # Bottom left vertex
c = [centroid[0] + (side_length / 2), centroid[1] - (math.sqrt(3) / 6) * side_length] # Bottom right vertex
return a, b, c
def draw_triangular_grid(vertex, radius, L):
grid_x = []
grid_y = []
# contruct the container equilateral triangler around this vertex
a, b, c = construct_eq_triangle(vertex, radius)
# Draw the grid here inside a,b,c and fill 'grid_x' and 'grid_y'
# but for now just print the mother triangle
print("\n Equilateral triangle for vertex " + str(vertex) + ":")
print((a, b, c))
return grid_x, grid_y
def main(args):
# demo data, 4 vertices of a simple square with a length of 8
vertices = [(2.0, 10.0), (10.0, 10.10), (10.0, 2.0), (2.0, 2.0)]
radius = 2
L = 7
i = 0
while i <= len(vertices) - 1:
grid_x, grid_y = draw_triangular_grid(vertices[i], radius, L)
# process the grid coordinates
i += 1
# Main entry point
if __name__ == "__main__":
main(sys.argv[1:])
