C++要么寻常二维图形处理(向量,点阵图旋转)

c#下之简练2D图像处理是本来为是没什么可说之
我自也不举行图像处理方面的端庄工作。一龙为工作 浑浑噩噩
写多少平台下的业务代码 ,其实这些东西多用不怎么上。 出了校门这么绵长了
高中的那些sin cos 向量 是干嘛的 怎么还因此不达。 做图像处理意识 哇
都用上了 原来数学这么有趣 甚至还见面用上有大学的数学知识。在数学的社会风气里
会发现电脑程序语言仅仅是工具 而已。你在C++ java下 也是均等的
算法都是均等 。
首先说下我如果讲话的呢没什么技术含量。其实这些事物在多数图像库里都起带了。这里只是想简明提一下外的规律
能够开什么 ,如果库里没有自带呢
如果当那种刀耕火种的嵌入式设备平台下编代码呢 就是考验你的时节到了噻。
不过在windows平台下 成熟的酷平台下
这种考验你的机不大可能。成熟的大平台下软件开发
各种外部可供应调用的物一样垛一堆的 就是写作业代码
也从没什么技术含量的。我形容的东西 基本开篇都如bb一番底 虽然也远非啥本事
,别拍砖。好刚题 。

向量计算及其应用

C++ 1

C++ 2

 

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

这种事物本身纯口水话描述 讲出来也非肯定能够达到效果。

具体理论充分利用了三角函数 r是坐标(0,0) 到具体点的半径。

首先看r*sin(阿尔法+西塔) 这里(阿尔法+西塔) 正是那个大之比的角度。

sin(阿尔法+西塔)为 对边/r  ,如果再次趁以r  那么不刚等于对边的长短么
,即点的Y值。

此处的sin(阿尔法+西塔) 就得 利用 三角函数的和角公式 sin(A+B) =
sinAcosB+cosAsinB。

理所当然其实不用呢足以 ,别打自己。

还索要以Asin 函数 同是三角函数里之  根据正弦值
反朝求角度。反正要取得图中几只参数照公式套不怕得了。

透过此类种种手法 就可把图片有旋转后底点求出来上旋转图片C++的目的。

事实上图及既让出去了,然后针对每个点依次计算 就可了。

 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渡过 我们来拘禁下成果:

C++ 4C++ 5C++ 6

 

各队移跟拉伸 那些自己眷恋原理是极致简单了我便未开腔了。
祝大家周末喜欢。