using StgSharp.Math; using System; using System.Collections.Generic; using System.Text; namespace StgSharp.Geometries { public class Rectangle : IGeometry { internal Point _basePoint; internal Point _center; internal Point _centerToCorner1; internal Point _centerToCorner2; internal RenderMode _renderMode; internal readonly uint bornTick; public override sealed Point BasePoint => _basePoint; public override sealed Point RefPoint=>_center; public override sealed Point RefVec01 => _centerToCorner1; public override sealed Point RefVec02 => _centerToCorner2; public override RenderMode renderMode => _renderMode; public Rectangle(uint bornTime) : base(bornTime) { bornTick = bornTime; } public Rectangle(Counter tickCounter) : base(tickCounter) { bornTick = tickCounter._value; } internal override sealed void OnRender(uint tick) { tick-=bornTick; CalcVec01(tick); switch (renderMode) { case RenderMode.BasePoint: CalcVec02(_basePoint._position,tick); CalcVec03(_basePoint._position,tick); break; case RenderMode.RefPoint: CalcVec02(_center._position, tick); CalcVec03(_center._position, tick); break; default: break; } } public override sealed float SetArrayX() { throw new NotImplementedException(); } public override sealed float SetArrayY() { throw new NotImplementedException(); } internal override void CalcVec01(uint tick) { _center._position = _basePoint._position + MovCenter(tick); } /// /// 计算长方形第一条对角线的一半的矢量表示 /// /// 作为参考的矢量,根据计算模式可以分为参考原点 /// 和参考中心点两种 /// 当前游戏刻 internal override void CalcVec02(vec3d vec, uint tick) { _centerToCorner1._position = vec + UpdateCTC1(tick); } /// /// 计算长方形第二条对角线一半的矢量表示 /// /// 作为参考的矢量,根据计算模式可以分为参考原点 /// 和参考中心点两种 /// 当前游戏刻 /// 计算出的第二条对角线长与第一条不相等 internal override void CalcVec03(vec3d vec, uint tick) { _centerToCorner2._position = vec + UpdateCTC2(tick); if (_centerToCorner1._position.GetLength() == _centerToCorner2._position.GetLength()) { throw new ArgumentException("Cannot form a triangle, " + "two crossing lines are not equal!"); } } /// /// 计算中心点相对于参考原点的位移 /// /// 当前游戏刻 /// public virtual vec3d MovCenter(uint tick)=>default(vec3d); /// /// 计算一个顶点相对于 /// /// /// public virtual vec3d UpdateCTC1(uint tick) => default(vec3d); public virtual vec3d UpdateCTC2(uint tick) => default(vec3d); public override Line[] GetAllSides() { throw new NotImplementedException(); } } }