UNPKG

plotboilerplate

Version:

A simple javascript plotting boilerplate for 2d stuff.

156 lines (127 loc) 5.17 kB
/** * @classdesc The bow tie tile from the Girih set. * * @requires Bounds * @requires GirihTile * @requires Polygon * @requires TileType * @requires Vertex * * @author Ikaros Kappler * @modified 2013-11-28 * @modified 2014-04-05 Ikaros Kappler (member array outerTilePolygons added). * @modified 2015-03-19 Ikaros Kappler (added toSVG()). * @modified 2020-10-31 Refactored to work with PlotBoilerplate. * @modified 2020-11-13 Ported from vanilla JS to TypeScript. * @version 2.0.1-alpha * @file GirihBowtie * @public **/ import { GirihTile, TileType } from "./GirihTile"; import { Polygon } from "../../Polygon"; import { Vertex } from "../../Vertex"; export class GirihBowtie extends GirihTile { /** * @constructor * @extends GirihTile * @name GirihBowtie * @param {Vertex} position * @param {number} edgeLength */ constructor( position:Vertex, edgeLength?:number ) { super( position, edgeLength, TileType.BOW_TIE ); // Overwrite the default symmetries: // the bow-tie tile has a 180° symmetry (5/10 * 360°) this.uniqueSymmetries = 5; // Init the actual decahedron shape with the passed size let pointA = new Vertex(0,0); let pointB = pointA; const startPoint = pointA; let oppositePoint = null; this.addVertex( pointB ); // TODO: notate in radians var angles = [ 0.0, 72.0, 72.0, 216.0, 72.0 ]; var theta = 0.0; for( var i = 0; i < angles.length; i++ ) { theta += (180.0 - angles[i]); pointA = pointB; // center of rotation pointB = pointB.clone(); pointB.x -= this.edgeLength; pointB.rotate( theta * (Math.PI/180.0), pointA ); this.addVertex( pointB ); if( i == 2 ) oppositePoint = pointB; } // END for // Move to center and position const move:Vertex = new Vertex( (oppositePoint.x - startPoint.x)/2.0, (oppositePoint.y - startPoint.y)/2.0 ); for( var i = 0; i < this.vertices.length; i++ ) { this.vertices[i].add( position ).sub( move ); } this.textureSource.min.x = 288/500.0; this.textureSource.min.y = 7/460.0; this.textureSource.max.x = this.textureSource.min.x + 206/500.0; this.textureSource.max.y = this.textureSource.min.y + 150/460.0; this.baseBounds = this.getBounds(); this._buildInnerPolygons( this.edgeLength ); this._buildOuterPolygons( this.edgeLength ); // Only call AFTER the inner polygons were created! }; /** * @override */ clone() : GirihTile { return new GirihBowtie( this.position.clone(), this.edgeLength ).rotate( this.rotation ); }; private _buildInnerPolygons( edgeLength:number ) : void { const indices:Array<number> = [ 1, 4 ]; for( var i = 0; i < indices.length; i++ ) { const index:number = indices[i]; const middlePoint:Vertex = this.getVertexAt( index ).clone().scale( 0.5, this.getVertexAt(index+1) ); const leftPoint:Vertex = this.getVertexAt( index-1 ).clone().scale( 0.5, this.getVertexAt(index) ); const rightPoint:Vertex = this.getVertexAt( index+1 ).clone().scale( 0.5, this.getVertexAt(index+2) ); const innerPoint:Vertex = middlePoint.clone().scale( 0.38, this.position ); // multiplyScalar( 0.38 ); const innerTile:Polygon = new Polygon( [] ); innerTile.addVertex( middlePoint ); innerTile.addVertex( rightPoint ); innerTile.addVertex( innerPoint ); innerTile.addVertex( leftPoint ); this.innerTilePolygons.push( innerTile ); } }; private _buildOuterPolygons( edgeLength:number ) : void { // Add the outer four 'edges' const indices:Array<number> = [ 0, 3 ]; for( var i = 0; i < indices.length; i++ ) { const index:number = indices[i]; // The first/third triangle const outerTileA:Polygon = new Polygon(); outerTileA.addVertex( this.innerTilePolygons[i].getVertexAt(0).clone() ); outerTileA.addVertex( this.getVertexAt(index+2).clone() ); outerTileA.addVertex( this.innerTilePolygons[i].getVertexAt(1).clone()) ; this.outerTilePolygons.push( outerTileA ); // The second/fourth triangle const outerTileB:Polygon = new Polygon(); outerTileB.addVertex( this.innerTilePolygons[i].getVertexAt(0).clone() ); outerTileB.addVertex( this.getVertexAt(index+1).clone() ); outerTileB.addVertex( this.innerTilePolygons[i].getVertexAt(3).clone()) ; this.outerTilePolygons.push( outerTileB ); } // Add the center polygon const centerTile:Polygon = new Polygon(); centerTile.addVertex( this.getVertexAt(0).clone() ); centerTile.addVertex( this.innerTilePolygons[0].getVertexAt(3).clone() ); centerTile.addVertex( this.innerTilePolygons[0].getVertexAt(2).clone() ); centerTile.addVertex( this.innerTilePolygons[0].getVertexAt(1).clone() ); centerTile.addVertex( this.getVertexAt(3).clone() ); centerTile.addVertex( this.innerTilePolygons[1].getVertexAt(3).clone() ); centerTile.addVertex( this.innerTilePolygons[1].getVertexAt(2).clone() ); centerTile.addVertex( this.innerTilePolygons[1].getVertexAt(1).clone() ); this.outerTilePolygons.push( centerTile ); }; }