latentspace.

Theater sightlines

C - Value 馃憖

When watching a performance in a theater, visual discomfort often occurs when the person seated in front blocks part of the stage. C-Value is a quantitative index used to evaluate this viewing quality. This project evaluates and optimizes viewing quality in theaters numerically using Galapagos and ghPython.

To evaluate the fitness, a state space was designed based on predefined parameters and constants. A state space is equivalent in concept to a parametric model. It is a parametric model in which the state of the model can be scored according to its current parameters.
Designing the state space From the left, C - Value 路 State space
Designing the state space
From the left, C - Value 路 State space

Set constraints

Optimization without constraints is rarely meaningful in architectural design, so constraints were introduced to specify the scope of the exploration. The aim was to derive the optimal C-Value within these limits by setting the ceiling height of the theater and the width of the stairs as constraints.

Set constraints From the left, Ceiling constraint 路 Step constraint
Set constraints
From the left, Ceiling constraintStep constraint

The C-Value is determined by the width and height of the stairs. Without the constraints described above, the optimizer tends to produce steep and narrow steps, since such geometry can easily improve the visibility score, even though these solutions would be unrealistic in terms of usability and safety. For this reason, an exception handling conditional statement is required within the state space. Since the purpose of this project is to maximize the C-Value, the state space was configured to return a very low score when the constraints are violated.


Evaluating the state space

Based on the predefined constraints and the penalty score returned when the constraints are violated, the C-Value, which serves as the fitness(or objective) of the project, was evaluated for each state space. The C-Value is evaluated by measuring the distance between two sight points, and Galapagos is used in place of an explicit genetic algorithm implementation.
Calculating the C-Value for each state space
Calculating the C-Value for each state space



    def calculate_cvalue(self):
        """calculating C-Value of current state space"""
        curr_ceil_height = self.calculate_ceil_height()
        curr_step_width = self.calculate_step_margin()
        
        sight_elements = self.generate_sight()
        cal_crv = sight_elements[0]
        cal_pt_1 = sight_elements[1]
        cal_vect = Point(0,0,1).generate_point()
        cal_line = gh.LineSDL(cal_pt_1, cal_vect, 30)
        cal_pt_2 = gh.CurveXLine(rs.coercecurve(cal_crv), cal_line)[0][1]
        
        if curr_ceil_height == 0 or curr_step_width == 0:
            cvalue = 0
        else:
            cvalue = rs.Distance(cal_pt_1, cal_pt_2) * self.SCALE
        
        return round(cvalue, 1)

Record & Result

The Galapagos record shown below illustrates how the C-Value increases with each generation.
C-Value at each generation
C-Value at each generation

In this project, the optimal value could be inferred intuitively. The primary aim was to verify whether it is possible to define the desired constraints and explore in the desired direction. For this reason, the exploration scope of the parameters was deliberately extended beyond what was strictly necessary. The source code for this project is available at this link.

C-Value standard
C-Value standard