1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-01-17 14:18:13 +01:00
dotSCAD/docs/lib3x-mz_theta_cells.md
2021-03-07 21:18:02 +08:00

2.4 KiB

mz_theta_cells

This function returns cell data of a theta maze. The data is a two-dimensional list with different row lengths. A cell has the data structure [ri, ci, type]. ri and ci are 0-based. ri means the ri-th ring and ci means the ci-th (counter-clockwise) cell of the ring.

mz_theta_cells

The value of type is the wall type of the cell. It can be 0, 1, 2 or 3. Setting them to constants is convenient.

NO_WALL = 0;           // the cell has no wall
INWARD_WALL = 1;       // the cell has an inward wall
CCW_WALL = 2;          // the cell has a counter-clockwise wall
INWARD_CCW_WALL = 3;   // the cell has an inward wall and a clockwise wall

mz_theta_cells

Since: 3.0

Parameters

rows, begining_columns

  • rows : The number of rings.
  • beginning_number : The number of cells in the first row.
  • start : The start point to travel the maze. Default to [0, 0].
  • seed : The maze is traveling randomly. Use seed to initialize the pseudorandom number generator.

Examples

use <maze/mz_theta_cells.scad>;
use <hull_polyline2d.scad>;

rows = 8;
beginning_number = 8;
cell_width = 10;
wall_thickness = 2;

NO_WALL = 0;           
INWARD_WALL = 1;      
CCW_WALL = 2;         
INWARD_CCW_WALL = 3;   

function vt_from_angle(theta, r) = [r * cos(theta), r * sin(theta)];

maze = mz_theta_cells(rows, beginning_number);

// draw cell walls
for(rows = maze) {
	for(cell = rows) {
		ri = cell[0];
		ci = cell[1];
		type = cell[2];
		thetaStep = 360 / len(maze[ri]);
		innerR = (ri + 1) * cell_width;
		outerR = (ri + 2) * cell_width;
		theta1 = thetaStep * ci;
		theta2 = thetaStep * (ci + 1);
		
		innerVt1 = vt_from_angle(theta1, innerR);
		innerVt2 = vt_from_angle(theta2, innerR);
		outerVt2 = vt_from_angle(theta2, outerR);
		
		if(type == INWARD_WALL || type == INWARD_CCW_WALL) {
			hull_polyline2d([innerVt1, innerVt2], width = wall_thickness);
		}

		if(type == CCW_WALL || type == INWARD_CCW_WALL) {
			hull_polyline2d([innerVt2, outerVt2], width = wall_thickness);
		}
	} 
}

// outmost walls
thetaStep = 360 / len(maze[rows - 1]);
r = cell_width * (rows + 1);
for(theta = [0:thetaStep:360 - thetaStep]) {
	vt1 = vt_from_angle(theta, r);
	vt2 = vt_from_angle(theta + thetaStep, r);
	hull_polyline2d([vt1, vt2], width = wall_thickness);
} 

mz_theta_cells