仍是普通二維圖形處理(向量,點陣圖旋轉)

c#下的簡單2D圖像處理這個原本也是沒什麼可說的 我本人也不作圖像處理方面的正經工做。一天爲了工做 渾渾噩噩 寫數據平臺下的業務代碼 ,其實這些東西大都用不怎麼上。 出了校門這麼久了 高中的那些sin cos 向量 是幹嗎的 怎麼都用不上。 作圖像處理髮現 哇 都用上了 原來數學這麼有趣 甚至還會用上一些大學的數學知識。在數學的世界裏 會發現計算機程序語言僅僅是工具 而已。你在C++ java下 也是同樣的 算法都是同樣 。 首先說下我要講的也沒什麼技術含量。其實這些東西在大多數圖像庫裏都自帶了。這裏只是想簡明提一下他的原理 可以作什麼 ,若是庫裏沒有自帶呢 若是在那種刀耕火種的嵌入式設備平臺下編代碼呢 就是考驗你的時候到了噻。 不過在windows平臺下 成熟的大平臺下 這種考驗你的機會不大可能。成熟的大平臺下軟件開發 各類外部可供調用的東西一坨一坨的 就是寫業務代碼 也沒什麼技術含量的。我寫的東西 基本開篇都要bb一番的 雖然也沒啥本事 ,別拍磚。好正題 。java

向量計算及其運用算法

 

 1 //向量的聲明:
 2 //向量和點 雖然都用座標的方式表示 ,可是它們意義有本質的區別
 3 //向量和點 在c#能夠強制互相轉換
 4 //(WPF 裏用Vector WPF裏有不少原來winform模式下重複功能的庫,WPF也在重複造輪子
 5 Vector v1 = (Vector)new System.Windows.Point(1, 0);
 6 Vector v2 = (Vector)new System.Windows.Point(0, 1);
 7 
 8 System.Windows.Point p1 = (System.Windows.Point)new Vector(1, 0);
 9 
10 
11 //向量的運算:
12 //基本方式是x+x  y+y 不用多說噻
13 //其實兩個向量相加並無明確的幾何意義 ,點和向量相加 表明一個點移動到另外一個點
14 //高中學過 兩個向量相加是一個新的向量
15 //vector 重載了+ 運算符 因此 向量向量之間  點和向量之間都可進行運算,就像高中數學裏那樣
16 //向量的值v3爲(1,1) 是否是跟高中學的同樣;
17 Vector v3 = v1 + v2;
18 MessageBox.Show(string.Format("x={0},y={1}", v3.X, v3.Y));
19 //減去一個向量等於加上一個方向相反的向量  這裏輸出的值v4爲(0.5,0.5)
20 Vector v4 = v3 - new Vector(0.5, 0.5);
21 MessageBox.Show(string.Format("x={0},y={1}", v4.X, v4.Y));
22 
23 
24 //利用向量你可以作什麼:
25 //高中數學裏的有一章 記得麼 ,利用向量運算 檢測兩條直線是否平行 是否垂直 。
26 //三維空間法線計算  你均可以利用此原理
27 //我想 在遊戲裏 工程計算 這些地方都會用到 發揮你的想象力

用的圖 是WPF自學手冊裏面的 而後是Vector這個東西只有WPF裏纔有 ,固然你用point本身實現也能夠。c#

而後是 ,點陣圖片的旋轉:windows

這個理解稍微複雜點,仍是先上圖函數

這種東西我純口水話描述 講出來也不必定能達到效果。工具

具體理論充分利用了三角函數 r是座標(0,0) 到具體點的半徑。spa

首先看r*sin(阿爾法+西塔) 這裏(阿爾法+西塔) 正是那個大的角的角度。code

sin(阿爾法+西塔)爲 對邊/r  ,若是再乘以r  那麼不正好等於對邊的長度麼 ,即點的Y值。orm

這裏的sin(阿爾法+西塔) 就須要 利用 三角函數的和角公式 sin(A+B) = sinAcosB+cosAsinB。blog

固然其實不用也能夠 ,別打我。

還須要用到Asin 函數 同是三角函數裏的  根據正弦值 反向求角度。反正只要獲得圖中幾個參數照公式套就能夠了。

經過此類種種手段 就能夠把圖片全部旋轉後的點求出來達到旋轉圖片的目的。

其實圖上已經給出來了,而後對每一個點依次計算 就能夠了。

 1 void rotate()
 2 {
 3     //旋轉 
 4 
 5     /*
 6      * 矩陣信息
 7      * cos&     sin&
 8      * -sin&    cos&
 9      */
10     System.Drawing.Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile("Tulips.jpg");
11 
12     System.Drawing.Bitmap bmp2 = new Bitmap((int)(bmp.Width ), (int)(bmp.Height ));
13 
14     for (int i = 0; i < bmp.Height; i++)//row
15     {
16         for (int j = 0; j < bmp.Width; j++)//col
17         {
18             //獲取原始RGB
19             System.Drawing.Color sourceRGB = bmp.GetPixel(j, i);
20             //經過矩陣運算到新的座標
21             double r = Math.Sqrt(Math.Pow(j, 2f) + Math.Pow(i, 2f));
22             double alpha = Math.Asin(i / r);
23             double xita = Math.PI / 6;
24 
25             int x1 = (int)((r * Math.Cos(alpha) * Math.Cos(xita)) -
26                 (r * Math.Sin(alpha)) * (Math.Sin(xita)));
27 
28             int y1 = (int)((r * Math.Sin(alpha) * Math.Cos(xita)) +
29                 (r * Math.Cos(alpha)) * (Math.Sin(xita)));
30 
31             if ((x1 >= 0 && x1 < bmp2.Width) && (y1 >= 0 && y1 < bmp2.Height))
32                 bmp2.SetPixel(x1, y1, sourceRGB);
33         }
34     }
35 
36     bmp2.Save("22.jpg", ImageFormat.Bmp);
37 }

這裏的 xita是角度 double xita = Math.PI / 6;  表明30度 咱們來看下成果:

 

位移跟拉伸 那些我想原理是太簡單了我就不講了。祝你們週末愉快。

相關文章
相關標籤/搜索