⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 triangledrawer.cs

📁 网上流传的5个面试题目
💻 CS
字号:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace Triangle
{
	/// <summary>
	/// TriangleDrawer 用于绘制三角形。
	/// </summary>
	public class TriangleDrawer
	{
		/// <summary>
		/// 构造函数,应传入绘制三角形的窗体。
		/// </summary>
		/// <param name="form">绘制三角形的窗体。</param>
		public TriangleDrawer(Form form)
		{
			this.form = form;
			aTimer = new System.Timers.Timer(10);
			aTimer.Stop();
			aTimer.Elapsed += new System.Timers.ElapsedEventHandler(DrawTrangle);
		}

		private Form form;
		private System.Timers.Timer aTimer;
		private int drawTime;
		private Triangle currentTriangle = null;

		/// <summary>
		/// 绘制下落的三角形。
		/// </summary>
		public void Draw()
		{
			aTimer.Stop();
			drawTime = -1;
			aTimer.Start();
		}

		/// <summary>
		/// 停止绘制三角形。
		/// </summary>
		public void Stop()
		{
			aTimer.Stop();
		}

		/// <summary>
		/// 绘制当前的三角形。
		/// </summary>
		public void DrawCurrentTriangle()
		{
			if (currentTriangle == null)
				return;
			Graphics dc = form.CreateGraphics();
			Pen pen = new Pen(form.ForeColor, 1);
			currentTriangle.Draw(dc, pen);
		}

		/// <summary>
		/// 绘制新三角形并抹去旧三角形。
		/// </summary>
		/// <param name="source"></param>
		/// <param name="e"></param>
		private void DrawTrangle(object source, System.Timers.ElapsedEventArgs e)
		{
			//设置三角数数据。
			const int height = 30;										//准备绘制高为30的等边三角形。
			const int circleTimes = 5;									//三角形旋转的次数。
			const int cidaOffset = 5;									//每次重绘时旋转的角度。
			int drawTimes = GetDrawTimes(circleTimes, cidaOffset);		//三角形重绘的次数。
			Point startCenter = GetStartCenter(height);					//三角形的起始外心。
			float XStep = GetXStep(height, drawTimes);					//外心的横坐标每次重绘偏移量。
			float YStep = GetYStep(height, drawTimes);					//外心的纵坐标每次重绘偏移量。
			Graphics dc = form.CreateGraphics();
			
			++drawTime;
			if (drawTime == drawTimes)
				aTimer.Stop();
			Point center = new Point((int)(startCenter.X + XStep * drawTime + 0.5), 
				(int)(startCenter.Y + YStep * drawTime + 0.5));			//三角形的外心坐标。
			int cida = 0 - drawTime * cidaOffset;						//三角形的高与垂直线的角度。
			Triangle tri = GetTriangle(height, center, cida);

			//抹去旧三角形。
			Pen pen = new Pen(form.BackColor, 1);
			if (currentTriangle != null)
				currentTriangle.Draw(dc, pen);
			//绘制新三角形。
			pen.Color = form.ForeColor;
			tri.Draw(dc, pen);
			currentTriangle = tri;
			if (drawTime == drawTimes)
				aTimer.Stop();
		}

		#region 一些关于三角形重绘的数据计算。
		/// <summary>
		/// 根据三角形的高获得初始的外心。
		/// </summary>
		/// <param name="height">三角形的高。</param>
		/// <returns>初始的外心。</returns>
		private Point GetStartCenter(int height)
		{
			return new Point((int)(height / Math.Sqrt(3) + 0.5), (int)(height * 2 / 3F + 0.5));
		}

		/// <summary>
		/// 计算三角形重绘的次数。
		/// </summary>
		/// <param name="circleTimes">三角形旋转的次数。</param>
		/// <param name="cidaOffset">每次重绘时旋转的角度。</param>
		/// <returns>三角形重绘的次数。</returns>
		private int GetDrawTimes(int circleTimes, int cidaOffset)
		{
			return 360 * circleTimes / cidaOffset;
		}

		/// <summary>
		/// 计算三角形每次重绘时外心的横坐标偏移量。
		/// </summary>
		/// <param name="height">三角形的高。</param>
		/// <param name="drawTimes">重绘次数。</param>
		/// <returns>三角形每次重绘时外心的横坐标偏移量。</returns>
		private float GetXStep(int height, int drawTimes)
		{
			Point startCenter = GetStartCenter(height);
			return (float)(form.ClientRectangle.Width - startCenter.X * 2) / drawTimes;
		}

		/// <summary>
		/// 计算三角形每次重绘时外心的纵坐标偏移量。
		/// </summary>
		/// <param name="height">三角形的高。</param>
		/// <param name="drawTimes">重绘次数。</param>
		/// <returns>三角形每次重绘时外心的横坐标偏移量。</returns>
		private float GetYStep(int height, int drawTimes)
		{
			return (float)(form.ClientRectangle.Height - height) / drawTimes;
		}
		#endregion

		#region 计算三角形数据的方法。
		/// <summary>
		/// 根据三角形的高、重心、高与垂线的角度获得等边三角形。
		/// </summary>
		/// <param name="height">三角形的高。</param>
		/// <param name="center">三角形的重心。</param>
		/// <param name="cida">高与垂线的角度</param>
		/// <returns>符合要求的三角形。</returns>
		private Triangle GetTriangle(int height, Point center, int cida)
		{
			Point pt1 = GetLineEndPoint(height * 2 / 3F, center, cida);
			Point pt2 = GetLineEndPoint(height * 2 / 3F, center, cida + 120);
			Point pt3 = GetLineEndPoint(height * 2 / 3F, center, cida + 240);
			return new Triangle(pt1, pt2, pt3);
		}

		/// <summary>
		/// 根据线段的起点、起点到终点连接与垂线的角度、线段的长度获得线段的终点。
		/// </summary>
		/// <param name="distance">线段的长度。</param>
		/// <param name="center">线段的起点。</param>
		/// <param name="cida">起点到终点连接与垂线的角度。</param>
		/// <returns>线段的终点。</returns>
		private Point GetLineEndPoint(float distance, Point startPoint, int cida)
		{
			float x = startPoint.X + distance * (float)Math.Sin(cida * 3.142F / 180);
			float y = startPoint.Y - distance * (float)Math.Cos(cida * 3.142F / 180);
			return new Point((int)(x + 0.5), (int)(y + 0.5));
		}
		#endregion
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -