UNPKG

plotboilerplate

Version:

A simple javascript plotting boilerplate for 2d stuff.

131 lines (109 loc) 3.9 kB
/** * @classdesc The decagon tile from the Girih set. * * @requires GirihTile * @requires Polygon * @requires TileType * @requires Vertex * * @author Ikaros Kappler * @date 2013-11-27 * @date 2014-04-05 Ikaros Kappler (member array outerTilePolygons added). * @date 2015-03-19 Ikaros Kappler (added toSVG()). * @modified 2020-10-30 Refactored to work with PlotBoilerplate. * @modified 2020-11-13 Ported from vanilla JS to TypeScript. * @version 2.0.1-alpha * @file GirihDecacon * @public **/ import { GirihTile, TileType } from "./GirihTile"; import { Polygon } from "../../Polygon"; import { Vertex } from "../../Vertex"; export class GirihDecagon extends GirihTile { /** * @constructor * @extends GirihTile * @name GirihDecagon * @param {Vertex} position * @param {number} edgeLength */ constructor( position:Vertex, edgeLength?:number ) { super( position, edgeLength, TileType.DECAGON ); // Overwrite the default symmetries: // the decagon tile has a 36° symmetry (1/10 * 360°) this.uniqueSymmetries = 1; // Init the actual decahedron shape with the passed size: // Divide the full circle into 10 sections (we want to make a regular decagon). const theta = (Math.PI*2) / 10.0; // Compute the 'radius' using pythagoras const radius = Math.sqrt( Math.pow(this.edgeLength/2,2) + Math.pow( 1/Math.tan(theta/2) * this.edgeLength/2, 2 ) ); for( var i = 0; i < 10; i++ ) { this.addVertex( position.clone().addY( -radius ).rotate( theta/2 + i*theta, position ) ); } this.textureSource.min.x = 169/500.0; this.textureSource.min.y = 140/460.0; this.textureSource.max.x = this.textureSource.min.x + 313/500.0; this.textureSource.max.y = this.textureSource.min.y + 297/460.0; this.baseBounds = this.getBounds(); this._buildInnerPolygons( this.edgeLength ); this._buildOuterPolygons( this.edgeLength ); // Important: call AFTER inner polygons were created! }; /** * @override */ clone() : GirihTile { return new GirihDecagon( this.position.clone(), this.edgeLength ).rotate( this.rotation ); }; /** * Build the inner polygons. * * @name _buildInnerPolygons * @memberof GirihDecagon * @private * @param {number} edgeLength */ private _buildInnerPolygons( edgeLength:number ) { const centralStar = new Polygon(); for( var i = 0; i < 10; i++ ) { const innerTile = new Polygon(); // Make polygon const topPoint = this.getVertexAt( i ).clone().scale( 0.5, this.getVertexAt(i+1) ); const bottomPoint = topPoint.clone().scale( 0.615, this.position ); const leftPoint = this.getVertexAt( i ).clone().scale( 0.69, this.position ); const rightPoint = this.getVertexAt( i+1 ).clone().scale( 0.69, this.position ); innerTile.addVertex( topPoint ); innerTile.addVertex( rightPoint ); innerTile.addVertex( bottomPoint ); innerTile.addVertex( leftPoint ); this.innerTilePolygons.push( innerTile ); centralStar.addVertex( leftPoint.clone() ); centralStar.addVertex( bottomPoint.clone() ); } this.innerTilePolygons.push( centralStar ); }; /** * Build the outer polygons. * * @name _buildOuterPolygons * @memberof GirihDecagon * @private * @param {number} edgeLength */ private _buildOuterPolygons( edgeLength:number ) { // DON'T include the inner star here! for( var i = 0; i < 10; i++ ) { const outerTile = new Polygon(); outerTile.addVertex( this.getVertexAt(i).clone() ); outerTile.addVertex( this.innerTilePolygons[i].vertices[0].clone() ); outerTile.addVertex( this.innerTilePolygons[i].vertices[3].clone() ); outerTile.addVertex( this.getInnerTilePolygonAt( i==0 ? 9 : i-1 ).vertices[0].clone() ); this.outerTilePolygons.push( outerTile ); } }; };