Source code for rtgym.arena.arena_shapes.triangle

import numpy as np


[docs] def point_in_triangle(p, p0, p1, p2): # Barycentric coordinates A = 0.5 * (-p1[1] * p2[0] + p0[1] * (-p1[0] + p2[0]) + p0[0] * (p1[1] - p2[1]) + p1[0] * p2[1]) sign = -1 if A < 0 else 1 s = (p0[1] * p2[0] - p0[0] * p2[1] + (p2[1] - p0[1]) * p[0] + (p0[0] - p2[0]) * p[1]) * sign t = (p0[0] * p1[1] - p0[1] * p1[0] + (p0[1] - p1[1]) * p[0] + (p1[0] - p0[0]) * p[1]) * sign return s > 0 and t > 0 and (s + t) < 2 * A * sign
[docs] def generate_triangle_arena(sr, **kwargs): # arena_map size width = int(kwargs.get('length', 100) / sr) # pixel height = int(kwargs.get('length', 100) / sr / 2 * np.sqrt(3)) # pixel border = 5 # Triangle vertices p0 = np.array([0, 0]) p1 = np.array([width, 0]) p2 = np.array([width/2, height]) # Create empty arena_map arena_map = np.ones((width, height)) # Fill everything as wall # Fill in the triangle for x in range(width): for y in range(height): if point_in_triangle(np.array([x, y]), p0, p1, p2): arena_map[x, y] = 0 # Cut out the triangle arena_map = np.rot90(arena_map, 1) arena_map = np.pad(arena_map, border, 'constant', constant_values=1) # Add additional border return arena_map