?? 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 + -