You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
WebCAD/src/Geometry/CurveMap.ts

84 lines
1.9 KiB

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<Vector3, Stand>();
/**
* 得到节点图的所有站点列表
*
* @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<string, Vector3>();
/**
* 生成一个唯一的向量.
*
* @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;
}
}