Isovists & Viewshed
Isovist Fields & Spatial Visibility: First formalized by Michael Benedikt in 1979, an isovist is the set of all spatial points visible from a single vantage point in space. By casting radial 360-degree sightlines until striking walls or columns, computational architects quantify human visual perception, measuring spatial openness, perimeter occlusivity, and surveillance sightlines.
Isovist Geometric Metrics:
1import numpy as np23def compute_isovist_polygon(viewpoint, obstacles, max_radius=10.0, num_rays=360):4 """5 Computes Benedikt (1979) 2D isovist polygon from a viewpoint.6 Casts radial rays in 360 degrees and finds the nearest intersection with room obstacles.7 Key metrics: Area, Perimeter, Compactness (Circularity), and Occlusivity.8 """9 isovist_vertices = []10 angles = np.linspace(0, 2 * np.pi, num_rays, endpoint=False)1112 for theta in angles:13 ray_dir = np.array([np.cos(theta), np.sin(theta)])14 closest_t = max_radius1516 for segment in obstacles:17 t = ray_segment_intersect(viewpoint, ray_dir, segment)18 if t is not None and t < closest_t:19 closest_t = t2021 isovist_vertices.append(viewpoint + ray_dir * closest_t)2223 return isovist_vertices
Cumulative Viewshed & Urban Sightlines: In regional master planning and skyline design, a viewshed identifies terrain and building zones visible from critical landmark viewpoints (such as historic monuments or observation decks). Computing mutual line-of-sight (LOS) across 3D city blocks highlights blind spots, public surveillance zones, and protected view corridors.
Viewshed Invariant:
1def compute_cumulative_viewshed(dem_grid, observer_points):2 """3 Computes Digital Elevation Model (DEM) cumulative viewshed.4 For each cell (x, y) on terrain, counts how many observers have unobstructed Line-of-Sight (LOS).5 Uses Bresenham ray traversal or radial elevation profile slope comparisons:6 tan(elevation_angle) = (z_target - z_obs) / horizontal_dist.7 """8 return "Cumulative Visibility Matrix (Heatmap)"