C#圆形转盘示例
??? 今天是10.24,周六,各位coder不用加班,祝天下程序員們寫碼無bug
?
1、首先需要一張轉盤圖片,這里使用visio制作。
????? 第一張圖片是中心透明的png圖,用于遮擋旋轉時周圍影響效果的圖像。
2、導入圖片為Image,然后轉換為bitmap位圖,最后導入到畫刷中
? ? ? 1) Image tmpImage = Image.FromFile(picSpinTablePath[0]);
????? 2)Bitmap tmpBitmap = new Bitmap(tmpImage);
????? 3)TextureBrush MyBrush = new TextureBrush(tmpBitmap);
3、旋轉與坐標變換
??? 接下來使用brush的旋轉函數,調用完會發現圖片旋轉了。
??? 1)但是,他不是圍繞中心點旋轉的。而是圍繞左上角的坐標原點旋轉的。如圖:
????? MyBrush.RotateTransform((float)dImageAngle);
???? 2)上圖設置的角度為45度。
???? 如果做一個按鈕,讓圖像左右平移,?MyBrush.TranslateTransform((float)dX, 0);
???? y軸置0,只沿x軸平移。理想上圖像應該是向右方平移。但實際上并不是。
???? 可以發現,此時圖像沿45度往右下方平移。很容易我們就猜到了,圖片旋轉的時候,不是單純的旋轉了圖片。
???? 而是整個坐標軸都跟著旋轉了。于是我們需要做一個坐標變換。由于變換需要的幾何我在電腦上畫圖不方便,
???? 就不給出具體過程了,只說下思路,高中知識就可以了:
??? ? 1)畫出正方形A,以A的左上角為原點(0,0)。設正方形邊長為L。
????? 2)旋轉角度a,這是得到正方形B。以B的邊為坐標軸,繪制直角坐標系。
?????????? 正方形A的中心點為Oa(0.5L,-0.5L),Ob(Xb, Yb)。
?????????? 接著就是需要根據幾何知識,求出Ob的坐標了。這里不給出具體求解過程了,有興趣自己算。
????? 3)轉換結果為:
??????????? double dL = tmpImage.Width;???????? ? ? ? ? ? ? ? ? ? ? //正方形邊長
??????????? double dA = dImageAngle / 180 * Math.PI;?????? ? //轉換為弧度
??????????? Double dA45 = (double)(45) / 180 * Math.PI;????? //45度角對應的弧度
??????????? double dX = Math.Sqrt(2) * dL * Math.Sin(dA / 2) * Math.Cos(dA45 + dA / 2);????????? //計算X軸平移量
??????????? double dY = (-1) * Math.Sqrt(2) * dL * Math.Sin(dA / 2) * Math.Sin(dA45 + dA / 2);? //計算Y軸平移量
?????? 4)調用平移函數平移
??????????? MyBrush.TranslateTransform((float)dX, (float)dY);
?4、接下來使用Graphics,調用畫刷把處理好的圖像畫到位圖上。其中picSpinTable是winform的picture控件
? ? Graphics g = Graphics.FromImage(tmpBitmap);
??? g.FillRectangle(MyBrush, 0, 0, picSpinTable.Width, picSpinTable.Height);???
??? g.DrawImage(tmpBitmap, new Point(0, 0));
???? picSpinTable.BackgroundImage = tmpBitmap;
?5、整個旋轉函數使用定時器實現,做為demo,沒有做過多封裝和層次化,下面貼主要代碼,整個完整程序考慮也會上傳上來,
鏈接為https://download.csdn.net/download/FHZZWZ/13033809
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace SpinTable {public partial class MainFrom : Form{public string[] picSpinTablePath = new string[9];double dImageAngle = 0;int nSpeed = 0;public MainFrom(){InitializeComponent();}private void btnSpin_Click(object sender, EventArgs e){if (timerSpin.Enabled){timerSpin.Enabled = false;btnSpin.Text = "旋轉";}else{timerSpin.Interval = 45;timerSpin.Enabled = true;btnSpin.Text = "停止";nSpeed = 0;dImageAngle = (int)dImageAngle % 360;} }private void MainFrom_Load(object sender, EventArgs e){ string strPath = System.Environment.CurrentDirectory + "/轉盤/";for(int i = 0; i < 9; i++)picSpinTablePath[i] = strPath + String.Format("ZP{0}.png", i + 1);picSpinTable.SizeMode = PictureBoxSizeMode.StretchImage;// picSpinTable.Width = Image.FromFile(picSpinTablePath[8]).Width;// picSpinTable.Height = picSpinTable.Width;picSpinTable.Image = Image.FromFile(picSpinTablePath[8]);}double mX = 0; double mY = 0;private void timerSpin_Tick(object sender, EventArgs e){Random ran = new Random();Image tmpImage = Image.FromFile(picSpinTablePath[0]);Bitmap tmpBitmap = new Bitmap(tmpImage);TextureBrush MyBrush = new TextureBrush(tmpBitmap);nSpeed++;if (nSpeed < 100){dImageAngle += nSpeed * 0.2; }else if(nSpeed < 201){dImageAngle += 20;}else if(nSpeed > 200){if (nSpeed < 270)dImageAngle += (300 - nSpeed) * 0.2;elsedImageAngle += 3;}if(nSpeed > 300 + ran.Next(0, 100)){timerSpin.Enabled = false;btnSpin.Text = "旋轉";}//dImageAngle = 45;MyBrush.RotateTransform((float)dImageAngle);double dL = tmpImage.Width;double dA = dImageAngle / 180 * Math.PI;Double dA45 = (double)(45) / 180 * Math.PI;double dX = Math.Sqrt(2) * dL * Math.Sin(dA / 2) * Math.Cos(dA45 + dA / 2);double dY = (-1) * Math.Sqrt(2) * dL * Math.Sin(dA / 2) * Math.Sin(dA45 + dA / 2);MyBrush.TranslateTransform((float)dX, (float)dY);Graphics g = Graphics.FromImage(tmpBitmap);g.FillRectangle(MyBrush, 0, 0, picSpinTable.Width, picSpinTable.Height);//this.ClientRectangle.Width, this.ClientRectangle.Height);g.DrawImage(tmpBitmap, new Point(0, 0));picSpinTable.BackgroundImage = tmpBitmap;}} }?
?
總結
- 上一篇: Exploratory Social N
- 下一篇: wvs高级技巧