二维平面覆盖算法(SolidWorks中PhotoView 360 的图块渲染顺序)

这个需求就是要在一个正方形矩阵中,写入连续的自然数,且矩阵中任意两个差为1的自然数位置要相邻。

一切都是从一个[ 0 ]开始的。

然后选择一个增长方向。可以向右或向下。我以向右为例,第一次增长后得到如下矩阵:   

01
32

这个矩阵很简单,可以直接手工填写。但我们需要让尽可能多的自然数以连续的方式填充到正方形矩阵中。

也就是达到这个效果:

01141516192021234235236239240241254255
32131217182322233232237238243242253252
4781130292425230231226225244247248251
5691031282726229228227224245246249250
5857545332353637218219220223202201198197
5956555233343938217216221222203200199196
6061505146454041214215210209204205194195
6362494847444342213212211208207206193192
64676869122123124127128131132133186187188191
65667170121120125126129130135134185184189190
78777273118119114113142141136137182183178177
79767574117116115112143140139138181180179176
808194959697110111144145158159160161174175
838293929998109108147146157156163162173172
84878891100103104107148151152155164167168171
85868990101102105106149150153154165166169170

它的规律就是把一个正方形矩阵放大成2×2倍的正方形矩阵,其中左上角是原来的矩阵,另外三个角是新的子矩阵。

对角位置和相邻位置的其中一个子矩阵的增长方式和方向与原矩阵的转置矩阵相同。另一个相邻的子矩阵的增长方式是原矩阵方向相反后再对称处理的。

由于新的子矩阵是以转置和对称方式创建的,新生成的子矩阵会保留原矩阵的连续性。

以下是生成这种矩阵的代码:

	/**
	 * @param size
	 *                      边长,自动修正成2的整数次幂
	 * @param startVertical
	 *                      起始方向: true 1在0的下方,false 1在0的右方
	 * @return
	 */
	public static int[][] mazeCoverMatrix(int size, boolean startVertical) {
		UnaryOperator<int[][]> generateA = (int[][] a) -> {
			int[][] b = new int[a.length * 2][];
			for (int i = 0; i < b.length; ++i) {
				b[i] = new int[b.length];
			}
			int blockAddition = a.length * a.length;
			for (int i = 0; i < a.length; ++i) {
				for (int j = 0; j < a.length; ++j) {
					b[i][j] = a[i][j];// 复制
					b[i + a.length][j] = a[j][i] + blockAddition;// 转置
					b[i + a.length][j + a.length] = a[j][i] + blockAddition * 2;// 转置
					b[i][j + a.length] = a[a.length - 1 - i][a.length - 1 - j] + blockAddition * 3;// 对称
				}
			}
			return b;
		};
		UnaryOperator<int[][]> generateB = (int[][] a) -> {
			int[][] b = new int[a.length * 2][];
			for (int i = 0; i < b.length; ++i) {
				b[i] = new int[b.length];
			}
			int blockAddition = a.length * a.length;
			for (int i = 0; i < a.length; ++i) {
				for (int j = 0; j < a.length; ++j) {
					b[i][j] = a[i][j];// 复制
					b[i][j + a.length] = a[j][i] + blockAddition;// 转置
					b[i + a.length][j + a.length] = a[j][i] + blockAddition * 2;// 转置
					b[i + a.length][j] = a[a.length - 1 - i][a.length - 1 - j] + blockAddition * 3;// 对称
				}
			}
			return b;
		};
		if (size < 1) {
			size = 1;
		}
		int[][] matrix = new int[][] { { 0 } };
		boolean operatorA = startVertical;
		for (; matrix.length < size;) {
			if (operatorA) {
				matrix = generateA.apply(matrix);
			} else {
				matrix = generateB.apply(matrix);
			}
			operatorA = !operatorA;
		}
		return matrix;
	}

在Solidworks中,界面常不是正方形的。多余的矩阵部分将被裁减。

按这种顺序进行图像处理似乎并不能提高性能,也不会提高画面质量。只是使工作人员在生成图片的时候不会感到无聊而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值