转载

从锦囊妙计想到的27–多次叠加操作绘制复杂图形

前面26介绍了采用应用中间一个辅助数组的办法, 来辅助缓存中间结果, 然后可以绘制复杂的图形, 今天继续这个话题, 看一个在略微复杂一点的输出

先看一下, 输出的图形

如上图, 若是输出这个图形不采用中间缓存的办法, 直接写, 要写大量的if语句, 并且没办法扩展

若是采用上面26中的方法, 就会简单很多

一。 功能分析

图中输出的图形可以为如下情况

从锦囊妙计想到的27–多次叠加操作绘制复杂图形

如上图, 可以看到一共有3个图形, 最外面的*号构成的图形, 里面蓝色的由空白构成的三角形

最后是一个红色的小矩形。

这三图形叠加到一起构成了一个完整的图形

二。 实现方法研究

1. 采用主函数启动一个功能函数, 在功能函数里面传入必须的参数进行显示

这样当需要扩展时, 仅仅调整参数就可以扩大或者调整输出

2. 采用二维数组存储中间输出的结果

3. 采用一个专用函数输出最外层的带*的大矩形

4. 采用专用函数在中间的输出结果中输出空白函数的三角形

5.采用函数在前面的中间结果的基础上输出小的空白符号的矩形

6. 最后直接输出中间结果的最终结果到计算机屏幕

参考过程如下

main    {             调用  图形输出                }
                             ||
                            /  / 
                             //
图形输出{
                      准备二维数组构成的缓存区
                             ||
                            /  / 
                             //
                      输出最外层的带*的矩形到中间缓存(二维数组中)
                             ||
                            /  / 
                             //
                      在中间缓存中输出空白图形组成的三角形
                             ||
                            /  / 
                             //
                      在中间缓存中输出空白图形组成的小矩形
                             ||
                            /  / 
                             //
                      最后整体将全部图形输出到计算机屏幕上
          }

三。 采用java代码实现上述的功能

1. 启动easyeclipse程序创建一个java的工程

2. 编写程序实现功能

具体代码参考:

public class SanTuXing {

	/**
	 * 输出三个图形叠加的效果
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// 调用图形输出函数
		TuXing(11, 11);

	}
	/**
	 * 这个函数输出 要打印的图形
	 * @param x    图形的行数
	 * @param y    图形的列数
	 */
	public static void TuXing(int x, int y)
	{
		// 准备一个 临时的缓存区, 系统在初始时, 给每个元素一个默认值了
		char[][]  tmpTuXing = new char[x][y];

		// 输出最外面大的 * 的图形  到 临时缓冲区
		ShuDaDuXing(tmpTuXing, x, y);

		// 输出中间的三角形 到 临时缓冲区
		ShuSanJiaoXing(tmpTuXing, 2, 2, 6);

		// 输出小的矩形到  临时缓冲区
		ShuXiaoJuXing(tmpTuXing, 5, 2, 8, 2);

		// 最后输出全部的数据
		// 优先编写  最后输出的函数, 这样可以检验前面的代码的 正确与否
		ShuChuAll(tmpTuXing, 11, 11);
	}


	/**
	 * 输出中间的小矩形
	 * @param t     缓冲区
	 * @param left  矩形开始的左边
	 * @param top   矩形开始的 上面行数
	 * @param line  矩形有的行数
	 * @param count 矩形每行的个数(空白)
	 */
	public static void ShuXiaoJuXing(char[][] t, int left, int top, int line, int Count){
		for(int i = 0; i < line; i++)
		{
			ShuXiaoJuXingLine(t[i + top], left, Count);
		}
	}

	/**
	 * 输出小矩形的行
	 * @param t     行缓存
	 * @param left  左边开始的
	 * @param Count 每行的个数
	 */
	public static void ShuXiaoJuXingLine(char[] t, int left, int Count){
		for(int i = 0; i < Count; i++)
		{
			t[left + i] = ' ';
		}

	}

	/**
	 * 输出中间的三角形
	 * @param t   缓冲区
	 * @param left  三角形开始的 左边列数
	 * @param top   三级星开始的 上面行数
	 * @param line  三角形有的 行数
	 */
	public static void ShuSanJiaoXing(char[][] t, int left, int top, int line){

		// 输出没一行
		for(int i = 0; i < line; i++)
		{
			ShuSanJiaoXingLine(t[i + top], left, i+1);
		}
	}

	/**
	 * 输出三角形的一行
	 * @param t         行缓存
	 * @param left      开始的左边
	 * @param line      第几行, 其实就是这行的 空白的个数
	 */
	public static void ShuSanJiaoXingLine(char[] t, int left, int line){
		for(int i = 0; i < line; i++)
		{
			t[left + i ] = ' ';
		}
	}

	/**
	 * 输出大的 最外层的矩形
	 * @param t   临时缓冲区
	 * @param x   行数
	 * @param y   每行的  *的个数
	 */
	public static void ShuDaDuXing(char[][] t, int x, int y){
		for(int i = 0; i < x; i++)
		{
			ShuDaDuXingHang(t[i], y);
		}
	}

	/**
	 * 输出 一行的*
	 * @param t   行的缓存
	 * @param y   行的个数
	 */
	public static void ShuDaDuXingHang(char[] t,int y){
		for(int i = 0; i < y; i++)
		{
			t[i] = '*';
		}
	}

	/**
	 *
	 * 输出全部的 符号到计算机屏幕
	 * @param t   缓冲区
	 * @param x   行数
	 * @param y   每行的个数
	 */
	public static void ShuChuAll(char[][] t, int x, int y)
	{
		// 行循环
		for(int i = 0; i < x; i++)
		{
			// 列循环
			for(int j = 0; j < y; j++)
			{
				// 输出行里面的 一个列的数据
				System.out.print(t[i][j]);
			}
			// 这个行完成后, 打印一个换行符号
			System.out.println();
		}
	}

}

fda

原文  http://www.iigrowing.cn/cong_jin_nang_miao_ji_xiang_dao_de_27_duo_ci_die_jia_cao_zuo_hui_zhi_fu_za_tu_xing.html
正文到此结束
Loading...