📄 triangledrawer.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 + -