K维立方体
概要
框架将整数范围(RangeInteger)、浮点数范围(RangeFloat)、整数的矩形范围(RectangleInteger)、浮点数的矩形范围(RectangleFloat)、整数的立方体范围(CubeInteger)、浮点数的立方体范围(CubeFloat)、浮点数的四维立方体范围(TesseractFloat)、颜色范围(ColorRange)统一抽象到了一个接口下面,即K维立方体,IKCube<TPoint>。
IKCube<TPoint>里的TPoint表示点的类型,比如普通的浮点数范围从3.2到5.6这样,就是IKCube<float>,再比如一个从(0, 0)到(2.3, 5.0)的这样一个二维矩形,就是IKCube<Vector2>,其他以此类推。
以下是框架内对IKCube<TPoint>的具体实现结构(注意下面这些为了运行效率,都是结构体struct,并非类class):
RangeInteger(代表整数的范围,比如从1到5的整数,实现了IKCube<int>)
RangeFloat(代表浮点数的范围,也就是数学里的区间,比如[2.3, 5],实现了IKCube<float>)
RectangleInteger(代表只包含整数的矩形范围,实现了IKCube<Vector2Int>)
RectangleFloat(代表矩形,实现了IKCube<Vector2>)
CubeInteger(代表只包含整数的三维立方体,实现了IKCube<Vector3Int>)
CubeFloat(三维立方体,实现了IKCube<Vector3>)
TesseractFloat(四维立方体,用得少,实现了IKCube<Vector4>)
ColorRange(代表从某个颜色到某个颜色的范围,其实就是一种四维的立方体,实现了IKCube<Color>)
公有的属性和函数
所有这些结构体都有一些共同的属性和函数:
因为是表示范围,所有都有最小点和最大点:
/// K维立方体的最小点
public TPoint min { get; init; }
/// K维立方体的最大点
public TPoint max { get; init; }有了最小点和最大点,就会有尺寸(一维就是长度,二维就是长宽,三维就是长宽高等等)和中心点:
/// K维立方体的大小
public TPoint size { get; }
/// K维立方体的中心点
public TPoint pivot { get; }而对于浮点数类型K维立方体,比如RangeFloat、RectangleFloat、CubeFloat、TesseractFloat和ColorRange,还会有中心点到边界的距离这个属性:
/// K维立方体中心到边界的距离,或者说是半径
public TPoint extents { get; }同样他们都有下面这些函数(只列出来最常用的几个):
// 判断一个点是否在K维立方体内
public bool Contains(TPoint pos);
// 返回一个点相对于K维立方体的位置
public TPoint GetRelativePos(TPoint pos);
// 以此K维立方体为基础,截断一个点,确保这个点在K维立方体内
public TPoint Clamp(TPoint pos);
// 确保这个点比K维立方体的最小点大
public TPoint ClampMin(TPoint pos);
// 确保这个点比K维立方体的最大点小
public TPoint ClampMax(TPoint pos);
// 返回一个此K维立方体内的随机点
public TPoint GetRandomPoint();
// 返回特定数量的此K维立方体内的随机点,保证不重复
public IEnumerable<TPoint> GetRandomUniquePoints(int count);对于整数类型的K维立方体,还会有额外下面的函数:
// 返回此K维立方体内的所有点
public IEnumerable<TPoint> GetAllPoints();
// 返回此K维立方体内的点的数量
public int GetPointsCount();
// 判断一个点是否在K维立方体的边界上
public bool IsOnBoundary(TPoint point);
// 返回此K维立方体的边界上的所有点
public IEnumerable<TPoint> GetAllBoundaryPoints();K维立方体的数学运算
在此框架中,只有整数类型的K维立方体才能与整数进行四则运算,相应的浮点数类型的K维立方体才能与浮点数进行四则运算。
例如RangeFloat可以与float加减乘除,RectangleInteger可以与int进行四则运算,CubeFloat可以与float等等,其他结构以此类推。
同时IKCube<TPoint>也可以与TPoint进行四则运算,比如RectangleInteger可以与Vector2Int四则运算,CubeFloat可以与Vector3加减乘除,ColorRange可以与Color等等..
加法/减法
K维立方体的加减法运算代表着偏移。
比如代表[2.5, 4.5]的RangeFloat与3相加,结果为[5.5, 7.5],即往右偏移3,减法即往左偏移。
比如代表从坐标(3, 5)到(7, 8)的RectangleInteger与Vector2Int(2, -1)相加,结果为从坐标(5, 4)到(9, 7)的RectangleInteger,相对于对整数矩形的整体往向量(2, -1)的方向进行了一个位移。
至于RectangleInteger与整数的加减法,比如RectangleInteger加3,相当于加Vector2Int(3, 3)。
其他结构以此类推。
乘法/除法
K维立方体的乘除法代表着缩放,和Unity里Transform的Scale是一回事。
比如代表[5, 7]的RangeInteger与2相乘,结果为[10, 14]。
需要注意的是如果与一个负数相乘,则会相对坐标系原点作一个镜像翻转。
比如代表[5, 7]的RangeInteger与-2相乘,结果为[-7, -5]的RangeInteger。
比如代表坐标(1, 1)到(3, 5)的RectangleFloat与Vector2(1, -1)相乘,结果为从坐标(1, -5)到坐标(3, -1)的RectangleFloat,注意这里Vector2(1, -1)中只有y值为负数,所以仅对RectangleFloat相对于x轴进行了翻转,同理如果想对x轴进行翻转,可以乘上Vector2(-1, 1);如果想相对于坐标原点进行翻转,可以乘上Vector2(-1, -1)或者直接乘上-1。
加负号
相当于乘上-1。
比如-[3, 5]等于[-5, -3]。
笛卡尔积
用笛卡尔积可以很方便地用低维的立方体得到更高维的立方体。
比如两个RangeInteger分别为[2, 3]、[4, 5],它们相乘可以得到从坐标(2, 4)到(3, 5)的RectangleInteger。
再比如三个RangeFloat分别为[0, 1]、[2, 3]、[4.5, 5.5],它们相乘可以得到从坐标(0, 2, 4.5)到坐标(1, 3, 5.5)的CubeFloat。
示例
具体的示例可见:
最后更新于
这有帮助吗?