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。

示例

具体的示例可见:

最后更新于

这有帮助吗?