import { Vector3 } from "three"; import { Curve } from "../DatabaseServices/Entity/Curve"; import { Route, Stand } from "./RegionParse"; import { ToFixed } from "../Common/Utils"; /** * 曲线地图,使用站点连接. */ export class CurveMap { constructor(public fractionDigits = 4) { } /* 节点图. 每个节点对应下一个路口的路线表. 路口表使用逆时针排序,起始角度使用正x轴. */ m_NodeMap = new Map(); /** * 得到节点图的所有站点列表 * * @readonly * @type {Stand[]} * @memberof CurveMap */ get Stands(): Stand[] { let stands = []; this.m_NodeMap.forEach(s => stands.push(s)); return stands; } addCurveToMap(cu: Curve) { let startS = this.GetStand(cu.StartPoint); let endS = this.GetStand(cu.EndPoint); let routeS2E: Route = { curve: cu, to: endS }; let routeE2S: Route = { curve: cu, to: startS }; startS.routes.push(routeS2E); endS.routes.push(routeE2S); } /** * 获得指定点的站台. * * @private * @param {Vector3} p * @returns {Stand} * @memberof RegionAlg */ GetStand(p: Vector3): Stand { let gp = this.GenerateP(p); if (this.m_NodeMap.has(gp)) return this.m_NodeMap.get(gp); let stand = { position: gp, routes: [] }; this.m_NodeMap.set(p, stand); return stand; } private m_vecMap = new Map(); /** * 生成一个唯一的向量. * * @param {Vector3} v * @returns {Vector3} * @memberof RegionAlg */ private GenerateP(v: Vector3): Vector3 { let str = v.toArray().map(v => ToFixed(v, this.fractionDigits)).join(","); if (this.m_vecMap.has(str)) return this.m_vecMap.get(str); this.m_vecMap.set(str, v); return v; } }