??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品久久久久久久久免费,狠狠色丁香婷婷综合久久来来去,久久久WWW成人http://www.shnenglu.com/Shihira/Open source - 开放源代码 - 開放原始?- オープンソー?- 오픈 소스 - От{орен aо - متن‌با?/description>zh-cnTue, 06 May 2025 16:00:28 GMTTue, 06 May 2025 16:00:28 GMT60L(fng)与^滑o(h)波器的图像处理应?/title><link>http://www.shnenglu.com/Shihira/archive/2015/08/12/211542.html</link><dc:creator>Shihira</dc:creator><author>Shihira</author><pubDate>Tue, 11 Aug 2015 16:35:00 GMT</pubDate><guid>http://www.shnenglu.com/Shihira/archive/2015/08/12/211542.html</guid><wfw:comment>http://www.shnenglu.com/Shihira/comments/211542.html</wfw:comment><comments>http://www.shnenglu.com/Shihira/archive/2015/08/12/211542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Shihira/comments/commentRss/211542.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Shihira/services/trackbacks/211542.html</trackback:ping><description><![CDATA[<div><div><h1>L(fng)的介l?/h1> <p>L(fng)<em>QconvolutionQ?/em>是泛函分析里的一个概念,不过泛函分析一般都是数学系才学的,计算机系的学生大多在概率l计课本里了(jin)解到。它分ؓ(f)两种形式Q一个是L形式Q一个是q箋Q积分)(j)形式。在囑փ处理中我们更兛_(j)LL(fng)Q不q也先看看积分Ş式的L(fng)。现在假设我们有两个函数<img src="http://latex.codecogs.com/gif.latex?f%28x%29" alt="f(x)" />?img src="http://latex.codecogs.com/gif.latex?g%28x%29" alt="g(x)" />Q这?img src="http://latex.codecogs.com/gif.latex?g%28x%29" alt="g(x)" />又叫?strong>qx函数</strong>或?strong>L(fng)?/strong>Q那么它们在q箋I间的卷U是Q?/p> <img src="http://latex.codecogs.com/gif.latex?%28f*g%29%28x%29=%5Cint_%7B-%5Cinfty%7D%5E%7B%5Cinfty%7Df%28t%29g%28x-t%29dt" alt="(f*g)(x)=\int_{-\infty}^{\infty}f(t)g(x-t)dt" style="display: block; margin: 20px; margin-left: auto; margin-right: auto;" /> <p>一般我们有一个这L(fng)l论Q就是当<img src="http://latex.codecogs.com/gif.latex?f%28x%29" alt="f(x)" />l过_多次相同qx函数<img src="http://latex.codecogs.com/gif.latex?g%28x%29" alt="g(x)" />L(fng)Q就?x)够接q高斯函敎ͼ也就是正态分布的函数形式。卷U就是一U^滑操作,q说明高斯函数就?#8220;最qx的函?#8221;。引入热力学中熵的概念,高斯函数是拥有最高熵的函敎ͼ最E_的状态,以至于自然界大多数的l计规律都呈现出正态分布:(x)</p> <img src="http://latex.codecogs.com/gif.latex?%28%28%5Ccdots%28%28f*g%29*g%29%5Ccdots%29*g%29%28x%29%20%5Crightarrow%20%5Cfrac%201%7B%5Csigma%5Csqrt%7B2%5Cpi%7D%7D%20e%5E%7B-x%5E2/%7B%5Csigma%5E2%7D%7D" alt="((\cdots((f*g)*g)\cdots)*g)(x) \rightarrow \frac 1{\sigma\sqrt{2\pi}} e^{-x^2/{\sigma^2}}" style="display: block; margin: 20px; margin-left: auto; margin-right: auto;" /> <p>下面介绍L形式的卷U。这L(fng)Q首先是由有限项的多式体现。神奇的是,而它们的乘积是L(fng)。首先我们设有两个多式<img src="http://latex.codecogs.com/gif.latex?p%20=%20a_0%20+%20a_1%20x%20+%20a_2%20x%5E2" alt="p = a_0 + a_1 x + a_2 x^2" />以及(qing)<img src="http://latex.codecogs.com/gif.latex?q%20=%20b_0%20+%20b_1%20x%20+%20b_2%20x%5E2%20+%20b_3%20x%5E3" alt="q = b_0 + b_1 x + b_2 x^2 + b_3 x^3" />。计它们的乘积Q?/p> <img src="http://latex.codecogs.com/gif.latex?%5Cbegin%7Balign*%7D%0Ar%20=%20p%5Ccdot%20q%20&=%20%28a_0%20b_0%29%20%5C%5C%0A&+%20%28a_0%20b_1%20+%20a_1%20b_0%29%20x%20%5C%5C%0A&+%20%28a_0%20b_2%20+%20a_1%20b_1+%20a_2%20b_0%29%20x%5E2%20%5C%5C%0A&+%20%28a_0%20b_3%20+%20a_1%20b_2%20+%20a_2%20b_1%29%20x%5E3%20%5C%5C%0A&+%20%28a_1%20b_3%20+%20a_2%20b_2%29%20x%5E4%20%5C%5C%0A&+%20%28a_2%20b_3%29%20x%5E5%0A%5Cend%7Balign*%7D" alt="\begin{align*} r = p\cdot q &= (a_0 b_0) \\ &+ (a_0 b_1 + a_1 b_0) x \\ &+ (a_0 b_2 + a_1 b_1+ a_2 b_0) x^2 \\ &+ (a_0 b_3 + a_1 b_2 + a_2 b_1) x^3 \\ &+ (a_1 b_3 + a_2 b_2) x^4 \\ &+ (a_2 b_3) x^5 \end{align*}" style="display: block; margin: 20px; margin-left: auto; margin-right: auto;" /> <p>再引入离散Ş式卷U(向量L(fng)Q的定义Q大家比较一下这个定义和上面多项式的计算。稍微说明一下,中括L(fng)意义?strong>p[n]代表向量Wn个元?/strong>。将两个多项式的pL写成向量形式然后q行向量L(fng)Q也是例如<img src="http://latex.codecogs.com/gif.latex?p%20=%20%5Ba_0,%20a_1,%20a_2%5D" alt="p = [a_0, a_1, a_2]" />Q而没定义的地方当?。可以发玎ͼ两者是完全一致的Q?/p> <img src="http://latex.codecogs.com/gif.latex?%5Cbegin%7Balign*%7D%0A%28p%20*%20q%29%5Bn%5D%20&=%20%5Csum_%7Bm=-%5Cinfty%7D%5E%5Cinfty%20p%5Bm%5D%5Ccdot%20q%5Bn-m%5D%20%5C%5C%0Ar%5B1%5D%20&=%20%5Csum_%7Bm=0%7D%5E1%20%20p%5Bm%5D%5Ccdot%20q%5B1-m%5D%20&&=%20a_0%20b_1%20+%20a_1%20b_0%20%5C%5C%0Ar%5B2%5D%20&=%20%5Csum_%7Bm=0%7D%5E2%20%20p%5Bm%5D%5Ccdot%20q%5B2-m%5D%20&&=%20a_0%20b_2%20+%20a_1%20b_1%20+%20a_2%20b_0%20%5C%5C%0A&%5Ccdots%0A%5Cend%7Balign*%7D" alt="\begin{align*} (p * q)[n] &= \sum_{m=-\infty}^\infty p[m]\cdot q[n-m] \\ r[1] &= \sum_{m=0}^1 p[m]\cdot q[1-m] &&= a_0 b_1 + a_1 b_0 \\ r[2] &= \sum_{m=0}^2 p[m]\cdot q[2-m] &&= a_0 b_2 + a_1 b_1 + a_2 b_0 \\ &\cdots \end{align*}" style="display: block; margin: 20px; margin-left: auto; margin-right: auto;" /> <blockquote><p>知道?jin)多式的乘U就是其相应的卷U,我们甚至可以直接得出两个q数卷U的l果。因为泰勒数就是幂U数的一U,所以我们可以将几乎所有的q箋函数转换成离散Ş式,避免?jin)繁复的U分q算Q比如我们希望得?<img src="http://latex.codecogs.com/gif.latex?r%28x%29%20=%20p%28x%29%20*%20q%28x%29" alt="r(x) = p(x) * q(x)" />Q其?img src="http://latex.codecogs.com/gif.latex?p%28x%29%20=%20%5Csum%20a_i%20x%5Ei,%5C%20%20q%28x%29%20=%20%5Csum%20b_i%20x%5Ei" alt="p(x) = \sum a_i x^i,\ q(x) = \sum b_i x^i" />Q只需要简单地计算q两个数的<strong>柯西乘积</strong>Q所得结果就?img src="http://latex.codecogs.com/gif.latex?r%28x%29" alt="r(x)" />的卷U。当然了(jin)Q这是后话,与本文的主题无关?/p></blockquote> <h1>L(fng)与图像处?/h1> <p>在开始讲囑փ处理之前Q我希望先理解一下卷U的整个q程是怎样的。从上面的公式看得还是有Ҏ(gu)應|懂,从直觉上ȝ解一下很有必要。观察卷U的公式以及(qing)下面的图片,q个q程可以看作Q当你想求一个r[n]的时候:(x)</p> <blockquote><p>你先把卷U核q叠在p上面Q?strong>量</strong>使左端靠q(如果左对齐就再好不过?jin)?j)Q然后看看在<strong>[0, n]?/strong>p, q重叠的部分是从哪里到哪里Q分别写成向量,那么r[n]q于其中一个向量与另一个向量的<strong>逆序</strong>的内U?/p></blockquote> <p>比如当n = 2Ӟ两个向量?code>[a_0, a_1, a_2]</code>?code>[b_2, b_1, b_0]</code>Qn = 4Ӟ两个向量?code>[a_1, a_2, a_3, a_4]</code>?code>[b_3, b_2, b_1, b_0]</code>。至于求内积Q一定难不倒你。下图说明了(jin)q一点:(x)</p> <img src="http://latex.codecogs.com/gif.latex?%5Cbegin%7Balign*%7D%0A&&%20a_0%20%20%20%20&&%20a_1%20%20%20%20&&%20a_2%20%20%20%20&&%20a_3%20%20%20%20&&%20a_4%20%5C%5C%0A&&%20a_0b_0%20&&%20a_0b_1%20&&%20a_0b_2%20&&%20a_0b_3%20%5C%5C%0A&&%20%20%20%20%20%20%20%20&&%20a_1b_0%20&&%20a_1b_1%20&&%20a_1b_2%20&&%20a_1b_3%20%5C%5C%0A&&%20%20%20%20%20%20%20%20&&%20%20%20%20%20%20%20%20&&%20a_2b_0%20&&%20a_2b_1%20&&%20a_2b_2%20&&%20a_2b_3%20%5C%5C%0A&&%20%20%20%20%20%20%20%20&&%20%20%20%20%20%20%20%20&&%20%20%20%20%20%20%20%20&&%20a_3b_0%20&&%20a_3b_1%20&&%20a_3b_2%20&&%20a_3b_3%20%5C%5C%0A&&%20%20%20%20%20%20%20%20&&%20%20%20%20%20%20%20%20&&%20%20%20%20%20%20%20%20&&%20%20%20%20%20%20%20%20&&%20a_4b_0%20&&%20a_4b_1%20&&%20a_4b_2%20&&%20a_4b_3%20%5C%5C%0A%5Chline%0A&&%20c_0%20%20%20%20&&%20c_1%20%20%20%20&&%20c_2%20%20%20%20&&%20c_3%20%20%20%20&&%20c_4%20%20%20%20&&%20c_5%20%20%20%20&&%20c_6%20%20%20%20&&%20c_7%0A%5Cend%7Balign*%7D" alt="\begin{align*} && a_0 && a_1 && a_2 && a_3 && a_4 \\ && a_0b_0 && a_0b_1 && a_0b_2 && a_0b_3 \\ && && a_1b_0 && a_1b_1 && a_1b_2 && a_1b_3 \\ && && && a_2b_0 && a_2b_1 && a_2b_2 && a_2b_3 \\ && && && && a_3b_0 && a_3b_1 && a_3b_2 && a_3b_3 \\ && && && && && a_4b_0 && a_4b_1 && a_4b_2 && a_4b_3 \\ \hline && c_0 && c_1 && c_2 && c_3 && c_4 && c_5 && c_6 && c_7 \end{align*}" style="display: block; margin: 20px; margin-left: auto; margin-right: auto;" /> <p>上面是对某一点上L(fng)的理解。对整个域的L(fng)Q则可以看成是将L(fng)核(除了(jin)开头几个外Q不停向右移动,每移动一格就重叠部分拿出来求内U?/p> <p>q时我们可以把图像处理和L(fng)联系h?jin)。图像处理是Q将一?#8220;源图?#8221;<em>QSourceQ?/em>Q通过一些算法,变成一?#8220;目标囑փ”<em>QDestinationQ?/em>。当我们q行qx处理的时候,用到一个叫做o(h)波器<em>QfilterQ?/em>?东西Q也叫做滤镜。想x们现实生zM攑֤镜是怎么用的Q拿着攑֤镜,从报U的左上角开始,一直扫啊扫到右下角Q扫的过E中一直望着攑֤镜和报纸的重叠区 域(其实是望着攑֤镜,因ؓ(f)它比报纸多?jin)?j)Q这样你浏览完?jin)一张放大过的报U。^滑o(h)镜也是同L(fng)使用Ҏ(gu)Q从源图的左上角开始扫到右下角Q扫的过 E中一直取出重叠部分进?strong>内积</strong>计算Q然后将l果存放到目标图像中 —— 昄q个操作跟卷U是一致的Q只不过定义在二l空间内?/p> <p>Z(jin)方便量化表示Q我们把囑փ抽象成定义在<img src="http://latex.codecogs.com/gif.latex?R%20%5Ccap%20%5B0,%201%5D" alt="R \cap [0, 1]" /> 数环内的二维矩阵Q其意义?strong>灰度?/strong>Q颜色信息我们暂且忽略。卷U核Q也是滤L器同样也是定义在<img src="http://latex.codecogs.com/gif.latex?R%20%5Ccap%20%5B0,%201%5D" alt="R \cap [0, 1]" /> 内的二维矩阵。这P二维的卷U我们这样定义它的离散Ş式:(x)</p> <img src="http://latex.codecogs.com/gif.latex?%5Ctext%7BDest%7D%5Bi,%20j%5D%20=%20%5Csum_%7By=-%5Cinfty%7D%5E%5Cinfty%20%5Csum_%7Bx=-%5Cinfty%7D%5E%5Cinfty%20%5Ctext%7BSrc%7D%5By,x%5D%20%5Ccdot%20%5Ctext%7BKer%7D%5Bi%20-%20y,%20j%20-%20x%5D" alt="\text{Dest}[i, j] = \sum_{y=-\infty}^\infty \sum_{x=-\infty}^\infty \text{Src}[y,x] \cdot \text{Ker}[i - y, j - x]" style="display: block; margin: 20px; margin-left: auto; margin-right: auto;" /> <p>我们的卷U核大小q不是无限的Q它一个半径rQ这样它的大就?r+1。规定了(jin)q个r使得Q当|x| > r ?|y| > rQ都有Ker[y, x] = 0。规定过大小之后Q由 <code>|i-y| < r; |j-x| < r</code>得到 <strong><code>i-r < y < i+r; j-r < x < j+r</code></strong>。同时我们规定Dest和Src的大是<img src="http://latex.codecogs.com/gif.latex?m%20%5Ctimes%20n" alt="m \times n" />。于是我们得C(jin)滤L器的法Q?/p> <img src="http://latex.codecogs.com/gif.latex?%5Ctext%7BDest%7D%5Bi,%20j%5D%20=%20%5Csum_%7By=%5Cmax%5C%7B0,i-r%5C%7D%7D%5E%7B%5Cmin%5C%7Bi+r,n%5C%7D%7D%20%5Cleft%28%20%5Csum_%7Bx=%5Cmax%5C%7B0,j-r%5C%7D%7D%5E%7B%5Cmin%5C%7Bj+r,m%5C%7D%7D%20%5Ctext%7BSrc%7D%5By,%20x%5D%20%5Ccdot%20%5Ctext%7BKer%7D%5Bi%20-%20y,%20j%20-%20x%5D%20%5Cright%29" alt="\text{Dest}[i, j] = \sum_{y=\max\{0,i-r\}}^{\min\{i+r,n\}} \left( \sum_{x=\max\{0,j-r\}}^{\min\{j+r,m\}} \text{Src}[y, x] \cdot \text{Ker}[i - y, j - x] \right)" style="display: block; margin: 20px; margin-left: auto; margin-right: auto;" /> <h1>高斯滤L?/h1> <div imagebubble"=""> <img src="http://upload-images.jianshu.io/upload_images/610338-54f1c66e805cdc4c.gif?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="二维的高斯函敎ͼ俗称避孕套函敎ͼ(j)" data-original-src="http://upload-images.jianshu.io/upload_images/610338-54f1c66e805cdc4c.gif" /><br /><div>二维的高斯函敎ͼ俗称避孕套函敎ͼ(j)</div> </div> <p>高斯滤L器是最常用的^滑o(h)波器之一Q在Photoshop里面它被用作<strong>高斯模糊滤镜</strong>。高斯o(h)波器的定义很l典Q就是简单地把正态分布离散开来。二lŞ式只是单U把x替代?x<sup>2</sup> + y<sup>2</sup>)Q然后修改系Co(h)实数域上的积分ؓ(f)1Q?/p> <img src="http://latex.codecogs.com/gif.latex?%5Cbegin%7Balign*%7D%0A%5Ctext%7BKer%7D_1%5Bx%5D%20&=%20%5Cfrac%201%7B%5Csigma%5Csqrt%7B2%5Cpi%7D%7D%20e%5E%7B-x%5E2/%7B%5Csigma%5E2%7D%7D%20%5C%5C%0A%5Ctext%7BKer%7D_2%5Bi,%20j%5D%20&=%20%5Cfrac%201%7B2%5Csigma%5E2%5Cpi%7D%20e%5E%7B-%28i%5E2+j%5E2%29/%7B%5Csigma%5E2%7D%7D%0A%5Cend%7Balign*%7D" alt="\begin{align*} \text{Ker}_1[x] &= \frac 1{\sigma\sqrt{2\pi}} e^{-x^2/{\sigma^2}} \\ \text{Ker}_2[i, j] &= \frac 1{2\sigma^2\pi} e^{-(i^2+j^2)/{\sigma^2}} \end{align*}" style="display: block; margin: 20px; margin-left: auto; margin-right: auto;" /> <p>也许你已l发C(jin)一个这L(fng)规律Q这一规律Q这在更高维上仍然是满的,也就是在q箋I间里同h뀂这成为我们优化算法的关键。将q个规律代回Cl离散卷U的公式里,因ؓ(f)y在第二个q加中相当于常数pL可以提出来,我们发现Q?/p> <img src="http://latex.codecogs.com/gif.latex?%5Cbegin%7Balign*%7D%0A%5Ctext%7BKer%7D_2%5Bi,%20j%5D%20&=%20%5Ctext%7BKer%7D_1%5Bi%5D%20%5Ccdot%20%5Ctext%7BKer%7D_1%5Bj%5D%20%5C%5C%0A%5Ctext%7BDest%7D%5Bi,%20j%5D%20&=%20%5Csum_%7By=-%5Cinfty%7D%5E%5Cinfty%20%5Csum_%7Bx=-%5Cinfty%7D%5E%5Cinfty%20%5Ctext%7BSrc%7D%5By,x%5D%20%5Ccdot%20%5Ctext%7BKer%7D_2%5Bi%20-%20y,%20j%20-%20x%5D%20%5C%5C%0A&=%20%5Csum_%7By=-%5Cinfty%7D%5E%5Cinfty%20%5Csum_%7Bx=-%5Cinfty%7D%5E%5Cinfty%20%5Ctext%7BSrc%7D%5By,x%5D%20%5Ccdot%20%5Ctext%7BKer%7D_1%5Bi-y%5D%20%5Ccdot%20%5Ctext%7BKer%7D_1%5Bj-x%5D%5C%5C%0A&=%20%5Csum_%7By=-%5Cinfty%7D%5E%5Cinfty%20%5Cleft%28%20%5Csum_%7Bx=-%5Cinfty%7D%5E%5Cinfty%20%5Ctext%7BSrc%7D%5By,x%5D%20%5Ccdot%20%5Ctext%7BKer%7D_1%5Bj-x%5D%5Cright%29%20%5Ctext%7BKer%7D_1%5Bi-y%5D%0A%5Cend%7Balign*%7D" alt="\begin{align*} \text{Ker}_2[i, j] &= \text{Ker}_1[i] \cdot \text{Ker}_1[j] \\ \text{Dest}[i, j] &= \sum_{y=-\infty}^\infty \sum_{x=-\infty}^\infty \text{Src}[y,x] \cdot \text{Ker}_2[i - y, j - x] \\ &= \sum_{y=-\infty}^\infty \sum_{x=-\infty}^\infty \text{Src}[y,x] \cdot \text{Ker}_1[i-y] \cdot \text{Ker}_1[j-x]\\ &= \sum_{y=-\infty}^\infty \left( \sum_{x=-\infty}^\infty \text{Src}[y,x] \cdot \text{Ker}_1[j-x]\right) \text{Ker}_1[i-y] \end{align*}" style="display: block; margin: 20px; margin-left: auto; margin-right: auto;" /> <p>如果xq加所表示是卷U是从右上角开始按照文字书写顺序从左到叻I然后从上C的顺序进行一l卷U,那么yq加表示的卷U就是先从上CQ再从左到有的顺序卷U。在OpenCV提供的数据结构的基础上,不用imgproc提供的算法,我写?jin)一个示例:(x)</p><p><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; "> 1</span> <span style="color: #008000; ">//</span><span style="color: #008000; "> cflags: -lopencv_highgui -lopencv_core</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">cmath</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">opencv2</span><span style="color: #000000; ">/</span><span style="color: #000000; ">highgui</span><span style="color: #000000; ">/</span><span style="color: #000000; ">highgui.hpp</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; "> cv;<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; "> std;<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; "> title </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">gaussian-filter</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">Mat kernelMatrix(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> radius, </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> sigma)<br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> d </span><span style="color: #000000; ">=</span><span style="color: #000000; "> radius </span><span style="color: #000000; ">*</span><span style="color: #000000; "> </span><span style="color: #000000; ">2</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">        Mat kernel(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">, d, CV_64F);<br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> coef </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; "><=</span><span style="color: #000000; "> radius; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> f(x) = 1/(sigma * sqrt(2 pi)) * e ^ -x^2/(2 s^2)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span> <span style="color: #008000; "></span><span style="color: #000000; ">                </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> dx </span><span style="color: #000000; ">=</span><span style="color: #000000; "> i </span><span style="color: #000000; ">-</span><span style="color: #000000; "> radius;<br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> dx_2 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> dx </span><span style="color: #000000; ">*</span><span style="color: #000000; "> dx;<br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> w </span><span style="color: #000000; ">=</span><span style="color: #000000; "> pow(M_E, </span><span style="color: #000000; ">-</span><span style="color: #000000; "> dx_2 </span><span style="color: #000000; ">/</span><span style="color: #000000; "> (</span><span style="color: #000000; ">2</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; "> sigma </span><span style="color: #000000; ">*</span><span style="color: #000000; "> sigma));<br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; ">                coef </span><span style="color: #000000; ">+=</span><span style="color: #000000; "> w;<br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">                kernel.at</span><span style="color: #000000; "><</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">></span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">, i) </span><span style="color: #000000; ">=</span><span style="color: #000000; "> w;<br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">                kernel.at</span><span style="color: #000000; "><</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">></span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">, d </span><span style="color: #000000; ">-</span><span style="color: #000000; "> i </span><span style="color: #000000; ">-</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">) </span><span style="color: #000000; ">=</span><span style="color: #000000; "> w;<br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> when you used values from i to j (j>i), the sum of them is:<br /></span><span style="color: #008080; ">28</span> <span style="color: #008000; ">                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> kernel[1, j] - (i ? kernel[1, i-1] : 0)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">29</span> <span style="color: #008000; "></span><span style="color: #000000; ">                kernel.at</span><span style="color: #000000; "><</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">></span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, i) </span><span style="color: #000000; ">=</span><span style="color: #000000; "> coef;<br /></span><span style="color: #008080; ">30</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">31</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">32</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> radius </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">; i </span><span style="color: #000000; "><</span><span style="color: #000000; "> d; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">33</span> <span style="color: #000000; ">                coef </span><span style="color: #000000; ">+=</span><span style="color: #000000; "> kernel.at</span><span style="color: #000000; "><</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">></span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">, i);<br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">                kernel.at</span><span style="color: #000000; "><</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">></span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, i) </span><span style="color: #000000; ">=</span><span style="color: #000000; "> coef;<br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">36</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> kernel;<br /></span><span style="color: #008080; ">38</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; ">39</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">40</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">41</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> convolution(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> Mat</span><span style="color: #000000; ">&</span><span style="color: #000000; "> img, </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> Mat</span><span style="color: #000000; ">&</span><span style="color: #000000; "> kernel, Mat</span><span style="color: #000000; ">&</span><span style="color: #000000; "> output, </span><span style="color: #0000FF; ">bool</span><span style="color: #000000; "> t </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">42</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; ">43</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> y </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, x </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; y </span><span style="color: #000000; "><</span><span style="color: #000000; "> img.rows; x </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (</span><span style="color: #000000; ">++</span><span style="color: #000000; ">x</span><span style="color: #000000; "><</span><span style="color: #000000; ">img.cols)</span><span style="color: #000000; ">?</span><span style="color: #000000; "> x : (y</span><span style="color: #000000; ">++</span><span style="color: #000000; ">, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">)) {<br /></span><span style="color: #008080; ">44</span> <span style="color: #000000; ">                Vec3d r(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">45</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">46</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> ideal </span><span style="color: #000000; ">=</span><span style="color: #000000; "> x </span><span style="color: #000000; ">-</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">(kernel.cols </span><span style="color: #000000; ">/</span><span style="color: #000000; "> </span><span style="color: #000000; ">2</span><span style="color: #000000; ">),<br /></span><span style="color: #008080; ">47</span> <span style="color: #000000; ">                    ran_beg </span><span style="color: #000000; ">=</span><span style="color: #000000; "> max(ideal, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">) </span><span style="color: #000000; ">-</span><span style="color: #000000; "> ideal,<br /></span><span style="color: #008080; ">48</span> <span style="color: #000000; ">                    ran_end </span><span style="color: #000000; ">=</span><span style="color: #000000; "> min(ideal </span><span style="color: #000000; ">+</span><span style="color: #000000; "> kernel.cols, img.cols) </span><span style="color: #000000; ">-</span><span style="color: #000000; "> ideal;<br /></span><span style="color: #008080; ">49</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">50</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> ran_beg; i </span><span style="color: #000000; "><</span><span style="color: #000000; "> ran_end; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">51</span> <span style="color: #000000; ">                        </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> weight </span><span style="color: #000000; ">=</span><span style="color: #000000; "> kernel.at</span><span style="color: #000000; "><</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">></span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">, i);<br /></span><span style="color: #008080; ">52</span> <span style="color: #000000; ">                        Vec3b pixel </span><span style="color: #000000; ">=</span><span style="color: #000000; "> img.at</span><span style="color: #000000; "><</span><span style="color: #000000; ">Vec3b</span><span style="color: #000000; ">></span><span style="color: #000000; ">(y, ideal </span><span style="color: #000000; ">+</span><span style="color: #000000; "> i);<br /></span><span style="color: #008080; ">53</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">54</span> <span style="color: #000000; ">                        r[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">] </span><span style="color: #000000; ">+=</span><span style="color: #000000; "> pixel[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">] </span><span style="color: #000000; ">*</span><span style="color: #000000; "> weight;<br /></span><span style="color: #008080; ">55</span> <span style="color: #000000; ">                        r[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">] </span><span style="color: #000000; ">+=</span><span style="color: #000000; "> pixel[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">] </span><span style="color: #000000; ">*</span><span style="color: #000000; "> weight;<br /></span><span style="color: #008080; ">56</span> <span style="color: #000000; ">                        r[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">] </span><span style="color: #000000; ">+=</span><span style="color: #000000; "> pixel[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">] </span><span style="color: #000000; ">*</span><span style="color: #000000; "> weight;<br /></span><span style="color: #008080; ">57</span> <span style="color: #000000; ">                }<br /></span><span style="color: #008080; ">58</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">59</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> coef </span><span style="color: #000000; ">=</span><span style="color: #000000; "> kernel.at</span><span style="color: #000000; "><</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">></span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, ran_end </span><span style="color: #000000; ">-</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">60</span> <span style="color: #000000; ">                </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(ran_beg) coef </span><span style="color: #000000; ">-=</span><span style="color: #000000; "> kernel.at</span><span style="color: #000000; "><</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">></span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, ran_beg </span><span style="color: #000000; ">-</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">61</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">62</span> <span style="color: #000000; ">                output.at</span><span style="color: #000000; "><</span><span style="color: #000000; ">Vec3b</span><span style="color: #000000; ">></span><span style="color: #000000; ">(t</span><span style="color: #000000; ">?</span><span style="color: #000000; ">x:y, t</span><span style="color: #000000; ">?</span><span style="color: #000000; ">y:x) </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Vec3b(<br /></span><span style="color: #008080; ">63</span> <span style="color: #000000; ">                        saturate_cast</span><span style="color: #000000; "><</span><span style="color: #000000; ">uchar</span><span style="color: #000000; ">></span><span style="color: #000000; ">(r[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]</span><span style="color: #000000; ">/</span><span style="color: #000000; ">coef),<br /></span><span style="color: #008080; ">64</span> <span style="color: #000000; ">                        saturate_cast</span><span style="color: #000000; "><</span><span style="color: #000000; ">uchar</span><span style="color: #000000; ">></span><span style="color: #000000; ">(r[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">/</span><span style="color: #000000; ">coef),<br /></span><span style="color: #008080; ">65</span> <span style="color: #000000; ">                        saturate_cast</span><span style="color: #000000; "><</span><span style="color: #000000; ">uchar</span><span style="color: #000000; ">></span><span style="color: #000000; ">(r[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]</span><span style="color: #000000; ">/</span><span style="color: #000000; ">coef));<br /></span><span style="color: #008080; ">66</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">67</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; ">68</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">69</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">70</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br /></span><span style="color: #008080; ">71</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; ">72</span> <span style="color: #000000; ">        namedWindow(title, WINDOW_AUTOSIZE);<br /></span><span style="color: #008080; ">73</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">74</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> r </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">75</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">76</span> <span style="color: #000000; ">        Mat img </span><span style="color: #000000; ">=</span><span style="color: #000000; "> imread(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ai-sample.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),<br /></span><span style="color: #008080; ">77</span> <span style="color: #000000; ">            kernel </span><span style="color: #000000; ">=</span><span style="color: #000000; "> kernelMatrix(r, (r </span><span style="color: #000000; ">-</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">) </span><span style="color: #000000; ">*</span><span style="color: #000000; "> </span><span style="color: #000000; ">0.3</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">0.8</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">78</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">79</span> <span style="color: #000000; ">        Mat product_v </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Mat(img.cols, img.rows, img.type());<br /></span><span style="color: #008080; ">80</span> <span style="color: #000000; ">        Mat product_h </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Mat(img.rows, img.cols, img.type());<br /></span><span style="color: #008080; ">81</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">82</span> <span style="color: #000000; ">        convolution(img, kernel, product_v);<br /></span><span style="color: #008080; ">83</span> <span style="color: #000000; ">        convolution(product_v, kernel, product_h);<br /></span><span style="color: #008080; ">84</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">85</span> <span style="color: #000000; ">        imshow(title, product_h);<br /></span><span style="color: #008080; ">86</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(; waitKey(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">) </span><span style="color: #000000; ">></span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;);<br /></span><span style="color: #008080; ">87</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">88</span> <span style="color: #000000; ">        destroyWindow(title);<br /></span><span style="color: #008080; ">89</span> <span style="color: #000000; ">}</span></div><p><br /></p><img src="http://upload-images.jianshu.io/upload_images/610338-6d8a7ba9a3985876.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="渲染效果? data-original-src="http://upload-images.jianshu.io/upload_images/610338-6d8a7ba9a3985876.png" /><br /><div imagebubble"=""><div>渲染效果?/div> </div> </div></div><img src ="http://www.shnenglu.com/Shihira/aggbug/211542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Shihira/" target="_blank">Shihira</a> 2015-08-12 00:35 <a href="http://www.shnenglu.com/Shihira/archive/2015/08/12/211542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>点数简?/title><link>http://www.shnenglu.com/Shihira/archive/2015/01/02/209380.html</link><dc:creator>Shihira</dc:creator><author>Shihira</author><pubDate>Fri, 02 Jan 2015 06:38:00 GMT</pubDate><guid>http://www.shnenglu.com/Shihira/archive/2015/01/02/209380.html</guid><wfw:comment>http://www.shnenglu.com/Shihira/comments/209380.html</wfw:comment><comments>http://www.shnenglu.com/Shihira/archive/2015/01/02/209380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Shihira/comments/commentRss/209380.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Shihira/services/trackbacks/209380.html</trackback:ping><description><![CDATA[<div> <div> <div> <div> <h2>内存中的储存形式(IEEE-745)</h2> <pre style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid #cccccc; padding: 0.5em 0.7em; display: block ! important;">Address 3        2        1        0 <br />Content SEEEEEEE EBBBBBBB BBBBBBBB BBBBBBBB </code></pre> <p style="margin: 1.2em 0px ! important;">其中的字母分别代?</p> <ul style="margin: 1.2em 0px;padding-left: 2em;"> <li style="margin: 0.5em 0px;">S(Significand):1 - 正负?img alt="(-1)^S" name="4f943fc1-46c0-42b8-852f-2ab52da5d07b" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/4f943fc1-46c0-42b8-852f-2ab52da5d07b.png?resizeSmall&width=832" /></li> <li style="margin: 0.5em 0px;">E(Exponent):8 - 指数部分</li> <li style="margin: 0.5em 0px;">B(Base):23 - 底数部分</li> </ul> <p style="margin: 1.2em 0px ! important;">q样, 整个点数表Cv来就?</p> <p style="margin: 1.2em 0px ! important;"><img alt="(-1)^S \times 1.BBBBBBBBBBBBBBBBBBBBBBB \times 2 ^{EEEEEEEE - 01111111}" name="d5a7553b-beea-4ec5-be84-38434cb8f811" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/d5a7553b-beea-4ec5-be84-38434cb8f811.png?resizeSmall&width=832" /></p> <h2>Nq制的小?/h2> <p style="margin: 1.2em 0px ! important;">看到10q制的小? 数Ҏ(gu)用来分隔指数正负位的:</p> <p style="margin: 1.2em 0px ! important;"><img alt="123.456" name="f19cf11c-9bbd-4579-ab0d-38aca2c03bf5" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/f19cf11c-9bbd-4579-ab0d-38aca2c03bf5.png?resizeSmall&width=832" /><br clear="none" /> <img alt="= 1 \times 10^2 + 2 \times 10^1 + 3 \times 10^0 + 4 \times 10^{-1} + 5 \times 10^{-2} + 6 \times 10^{-3}" name="5c8f2017-66c5-4e8c-b3f4-c5d7af5bd422" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/5c8f2017-66c5-4e8c-b3f4-c5d7af5bd422.png?resizeSmall&width=832" /></p> <p style="margin: 1.2em 0px ! important;">推广到Nq制, 形式是完全相同的, q里用二q制做一个例?</p> <p style="margin: 1.2em 0px ! important;"><img alt="(101.0101)_2" name="9b964ef0-2b66-47a3-bf3b-6034f1399e36" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/9b964ef0-2b66-47a3-bf3b-6034f1399e36.png?resizeSmall&width=832" /><br clear="none" /> <img alt="= 2^2 + 2^0 + 2^{-2} + 2^{-4}" name="6f79a2c5-604c-4044-8ed8-79e195e19324" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/6f79a2c5-604c-4044-8ed8-79e195e19324.png?resizeSmall&width=832" /><br clear="none" /> <img alt="= 4+1+{1 \over 4}+{1 \over 16}" name="b2eea789-a281-42f0-a308-33a9a316d321" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/b2eea789-a281-42f0-a308-33a9a316d321.png?resizeSmall&width=832" /><br clear="none" /> <img alt="= 5.3125" name="06cb8f45-bd55-4d89-9829-d104d04675e7" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/06cb8f45-bd55-4d89-9829-d104d04675e7.png?resizeSmall&width=832" /></p> <h2>构造一个QҎ(gu)</h2> <p style="margin: 1.2em 0px ! important;">?2.625Z? 首先我们推算一下它的二q制形式是什? 如我们所? 整数部分和小数部分的位置是恒定不变的, 因ؓ(f)它们是否于1q个性质, 无论在什么进制之下都不会(x)改变. 首先整数部?</p> <p style="margin: 1.2em 0px ! important;"><img alt="12 \div 2 = 6 \cdots 0" name="92f68c9f-f8e4-4fa5-aace-7c49f7400ef3" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/92f68c9f-f8e4-4fa5-aace-7c49f7400ef3.png?resizeSmall&width=832" /><br clear="none" /> <img alt="6 \div 2 = 3 \cdots 0" name="0b788b1d-fdc0-4e0a-ab78-5488502ad8b1" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/0b788b1d-fdc0-4e0a-ab78-5488502ad8b1.png?resizeSmall&width=832" /><br clear="none" /> <img alt="3 \div 2 = 1 \cdots 1" name="f7f6f374-94ef-4bdf-b6f9-431e3d0ee838" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/f7f6f374-94ef-4bdf-b6f9-431e3d0ee838.png?resizeSmall&width=832" /><br clear="none" /> <img alt="1 \div 2 = 0 \cdots 1" name="1e4cda93-2816-416a-ab2d-b51d66501d4a" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/1e4cda93-2816-416a-ab2d-b51d66501d4a.png?resizeSmall&width=832" /><br clear="none" /> <img alt="\therefore \ (12)_10 = (1100)_2" name="9463af4e-69bf-4588-b077-bc01dcf9a233" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/9463af4e-69bf-4588-b077-bc01dcf9a233.png?resizeSmall&width=832" /></p> <p style="margin: 1.2em 0px ! important;">数部分(不知道是否注意到, 数部分只有?^n的和才有可能被表C成不@环小? 诸如0.7, 0.3都是二进制的无限循环数):</p> <p style="margin: 1.2em 0px ! important;"><img alt="0.625 \times 2 = 1 + 0.25" name="65a180e0-735d-45ba-b563-f3b71456843d" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/65a180e0-735d-45ba-b563-f3b71456843d.png?resizeSmall&width=832" /><br clear="none" /> <img alt="0.25 \times 2 = 0 + 0.5" name="fde2d47d-b280-4846-b995-4a9d8ed31dc3" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/fde2d47d-b280-4846-b995-4a9d8ed31dc3.png?resizeSmall&width=832" /><br clear="none" /> <img alt="0.5 \times 2 = 1" name="80991657-d983-4356-89d3-5513077712c7" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/80991657-d983-4356-89d3-5513077712c7.png?resizeSmall&width=832" /><br clear="none" /> <img alt="\therefore \ (0.625)_{10} = (0.101)_2" name="8d4c77f3-67ba-4e1c-bcaa-607afcc6e14a" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/8d4c77f3-67ba-4e1c-bcaa-607afcc6e14a.png?resizeSmall&width=832" /></p> <p style="margin: 1.2em 0px ! important;">q样, 我们得到?jin)一个二q位的小?100.101, q且化成IEEE-745标准形式:</p> <p style="margin: 1.2em 0px ! important;"><img alt="1100.101 = 1.100101 \times 2^{00000011 + 01111111 - 01111111}" name="aaf4f83b-de41-415c-a845-766387dbd563" src="https://www.evernote.com/shard/s375/sh/a4e4ed3a-af3e-4855-90ba-56daef650054/219cbab4fc64ceb3acdccab81292dfba/res/aaf4f83b-de41-415c-a845-766387dbd563.png?resizeSmall&width=832" /></p> <pre style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid #cccccc; padding: 0.5em 0.7em; display: block ! important;">Address 3        2        1        0 <br />Content SEEEEEEE EBBBBBBB BBBBBBBB BBBBBBBB <br />Value   01000001 01001010 00000000 00000000 <br />Hex           41       4A       00       00 </code></pre> <p style="margin: 1.2em 0px ! important;">现在我们得到?jin)一个整?x414A0000, 把它输出出来看看是多?</p> <pre style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid #cccccc; padding: 0.5em 0.7em; display: block ! important;">$ cat test.c <br />#include <stdio.h> <br />int main() <br />{ <br />   union { <br />      unsigned long u; <br />      float f; <br />   } u; <br />   u.u = 0x414a0000; <br />   printf("%f\n", u.f); <br />   return 0;<br />}<br /><br />$ ./test <br />12.625000 </code></pre> <div title="MDH:PGRpdj4jIyDlhoXlrZjkuK3nmoTlgqjlrZjlvaLlvI8oSUVFRS03NDUpPGJyPjxicj5gYGA8YnI+ QWRkcmVzcyAzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDImbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMSZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAwPGJyPkNvbnRlbnQgU0VFRUVFRUUgRUJCQkJCQkIg QkJCQkJCQkIgQkJCQkJCQkI8YnI+YGBgPGJyPjxicj7lhbbkuK3nmoTlrZfmr43liIbliKvku6Po oag6PGJyPjxicj4tIFMoU2lnbmlmaWNhbmQpOjEgLSDmraPotJ/lj7ckKC0xKV5TJDxicj4tIEUo RXhwb25lbnQpOjggLSDmjIfmlbDpg6jliIY8YnI+LSBCKEJhc2UpOjIzIC0g5bqV5pWw6YOo5YiG PGJyPjxicj7ov5nmoLcsIOaVtOS4qua1rueCueaVsOihqOekuui1t+adpeWwseaYrzo8YnI+PGJy PiQoLTEpXlMgXHRpbWVzIDEuQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkIgXHRpbWVzIDIgXntFRUVF RUVFRSAtIDAxMTExMTExfSQ8YnI+PGJyPiMjIE7ov5vliLbnmoTlsI/mlbA8YnI+PGJyPueci+WI sDEw6L+b5Yi255qE5bCP5pWwLCDlsI/mlbDngrnmmK/nlKjmnaXliIbpmpTmjIfmlbDmraPotJ/k vY3nmoQ6PGJyPjxicj4kMTIzLjQ1NiQ8YnI+JD0gMSBcdGltZXMgMTBeMiArIDIgXHRpbWVzIDEw XjEgKyAzIFx0aW1lcyAxMF4wICsgNCBcdGltZXMgMTBeey0xfSArIDUgXHRpbWVzIDEwXnstMn0g KyA2IFx0aW1lcyAxMF57LTN9JDxicj48YnI+5o6o5bm/5YiwTui/m+WItiwg5b2i5byP5piv5a6M 5YWo55u45ZCM55qELCDov5nph4znlKjkuozov5vliLblgZrkuIDkuKrkvovlrZA6PGJyPjxicj4k KDEwMS4wMTAxKV8yJDxicj4kPSAyXjIgKyAyXjAgKyAyXnstMn0gKyAyXnstNH0kPGJyPiQ9IDQr MSt7MSBcb3ZlciA0fSt7MSBcb3ZlciAxNn0kPGJyPiQ9IDUuMzEyNSQ8YnI+PGJyPiMjIOaehOmA oOS4gOS4qua1rueCueaVsDxicj48YnI+5LulMTIuNjI15Li65L6L5a2QLiDpppblhYjmiJHku6zm jqjnrpfkuIDkuIvlroPnmoTkuozov5vliLblvaLlvI/mmK/ku4DkuYguIOWmguaIkeS7rOaJgOef pSwg5pW05pWw6YOo5YiG5ZKM5bCP5pWw6YOo5YiG55qE5L2N572u5piv5oGS5a6a5LiN5Y+Y55qE LCDlm6DkuLrlroPku6zmmK/lkKblsI/kuo4x6L+Z5Liq5oCn6LSoLCDml6DorrrlnKjku4DkuYjo v5vliLbkuYvkuIvpg73kuI3kvJrmlLnlj5guIOmmluWFiOeul+aVtOaVsOmDqOWIhjo8YnI+PGJy PiQxMiBcZGl2IDIgPSA2IFxjZG90cyAwJDxicj4kNiBcZGl2IDIgPSAzIFxjZG90cyAwJDxicj4k MyBcZGl2IDIgPSAxIFxjZG90cyAxJDxicj4kMSBcZGl2IDIgPSAwIFxjZG90cyAxJDxicj4kXHRo ZXJlZm9yZSBcICgxMilfMTAgPSAoMTEwMClfMiQ8YnI+PGJyPuWwj+aVsOmDqOWIhijkuI3nn6Xp gZPmmK/lkKbms6jmhI/liLAsIOWwj+aVsOmDqOWIhuWPquacieaYrzJebueahOWSjOaJjeacieWP r+iDveiiq+ihqOekuuaIkOS4jeW+queOr+Wwj+aVsC4g6K+45aaCMC43LCAwLjPpg73mmK/kuozo v5vliLbnmoTml6DpmZDlvqrnjq/lsI/mlbApOjxicj48YnI+JDAuNjI1IFx0aW1lcyAyID0gMSAr IDAuMjUkPGJyPiQwLjI1IFx0aW1lcyAyID0gMCArIDAuNSQ8YnI+JDAuNSBcdGltZXMgMiA9IDEk PGJyPiRcdGhlcmVmb3JlIFwgKDAuNjI1KV97MTB9ID0gKDAuMTAxKV8yJDxicj48YnI+6L+Z5qC3 LCDmiJHku6zlvpfliLDkuobkuIDkuKrkuozov5vkvY3nmoTlsI/mlbAxMTAwLjEwMSwg5bm25LiU 5YyW5oiQSUVFRS03NDXmoIflh4blvaLlvI86PGJyPjxicj4kMTEwMC4xMDEgPSAxLjEwMDEwMSBc dGltZXMgMl57MDAwMDAwMTEgKyAwMTExMTExMSAtIDAxMTExMTExfSQ8YnI+PGJyPmBgYDxicj5B ZGRyZXNzIDMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMiZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAxJm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDA8YnI+Q29udGVudCBTRUVFRUVFRSBFQkJCQkJCQiBC QkJCQkJCQiBCQkJCQkJCQjxicj5WYWx1ZSZuYnNwOyZuYnNwOyAwMTAwMDAwMSAwMTAwMTAxMCAw MDAwMDAwMCAwMDAwMDAwMDxicj5IZXgmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgNDEmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsgNEEmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMDAmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMDA8YnI+YGBgPGJyPjxicj7njrDlnKjmiJHk u6zlvpfliLDkuobkuIDkuKrmlbTmlbAweDQxNEEwMDAwLCDmiorlroPovpPlh7rlh7rmnaXnnIvn nIvmmK/lpJrlsJE6PGJyPjxicj5gYGA8YnI+JCBjYXQgdGVzdC5jPGJyPiNpbmNsdWRlICZsdDtz dGRpby5oJmd0Ozxicj48YnI+aW50IG1haW4oKSB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyB1bmlvbiB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1bnNpZ25lZCBsb25nIHU7 PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyBmbG9hdCBmOzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgfSB1Ozxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgdS51ID0gMHg0MTRhMDAwMDs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7IHByaW50ZigiJWZcbiIsIHUuZik7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gMDs8YnI+fTxicj48YnI+JCAuL3Rlc3Q8YnI+ MTIuNjI1MDAwPGJyPmBgYDxicj48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div> </div> </div> </div> </div><img src ="http://www.shnenglu.com/Shihira/aggbug/209380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Shihira/" target="_blank">Shihira</a> 2015-01-02 14:38 <a href="http://www.shnenglu.com/Shihira/archive/2015/01/02/209380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TypeGame: 为Vim加上打字l习(fn)功能http://www.shnenglu.com/Shihira/archive/2014/08/16/typegame-vim.htmlShihiraShihiraSat, 16 Aug 2014 13:11:00 GMThttp://www.shnenglu.com/Shihira/archive/2014/08/16/typegame-vim.htmlhttp://www.shnenglu.com/Shihira/comments/208039.htmlhttp://www.shnenglu.com/Shihira/archive/2014/08/16/typegame-vim.html#Feedback6http://www.shnenglu.com/Shihira/comments/commentRss/208039.htmlhttp://www.shnenglu.com/Shihira/services/trackbacks/208039.html阅读全文

Shihira 2014-08-16 21:11 发表评论
]]>
Windows API 字符~码转换以及(qing)一些解释和?j)?/title><link>http://www.shnenglu.com/Shihira/archive/2013/10/28/200124.html</link><dc:creator>Shihira</dc:creator><author>Shihira</author><pubDate>Mon, 28 Oct 2013 14:49:00 GMT</pubDate><guid>http://www.shnenglu.com/Shihira/archive/2013/10/28/200124.html</guid><wfw:comment>http://www.shnenglu.com/Shihira/comments/200124.html</wfw:comment><comments>http://www.shnenglu.com/Shihira/archive/2013/10/28/200124.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/Shihira/comments/commentRss/200124.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Shihira/services/trackbacks/200124.html</trackback:ping><description><![CDATA[<div> <p><span style="font-size: 12pt;">我在解决q上面实际C(jin)不少弯\Q做?jin)很多实验,查?jin)很多资料。在q里做下W记Q希望后来者可以明白,走些弯路?/span></p> <p> </p> <h3>从最熟?zhn)的两U字W编码说?br /> </h3> <p> <span style="font-size: 12pt;">除了(jin)一些旧的、没有考虑到兼Ҏ(gu)的|页q在用gbk做编码外Q大部分的网都已经用utf-8做编码了(jin)。但是最令h头疼的是Qwindows的控制台是很不好昄utf-8的。有明君为我大C++写了(jin)两个函数Q是正确的、好用的<strike>Q除?jin)用std::string做返回D我等效率党有点觉得不爽之?#8230;…q是挺方便的Q?/strike>.</span></p> </div> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /> #include </span><span style="color: #000000; "><</span><span style="color: #000000; ">windows.h</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /> </span><span style="color: #0000FF; ">using</span><span style="color: #000000; "> std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">;<br /> <br /> </span><span style="color: #008000; ">//</span><span style="color: #008000; ">gbk ?nbsp;utf8</span><span style="color: #008000; "><br /> </span><span style="color: #0000FF; ">string</span><span style="color: #000000; "> GBKToUTF8(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&</span><span style="color: #000000; "> strGBK)<br /> {<br />     </span><span style="color: #0000FF; ">string</span><span style="color: #000000; "> strOutUTF8 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">""</span><span style="color: #000000; ">;<br />     WCHAR </span><span style="color: #000000; ">*</span><span style="color: #000000; "> str1;<br />     </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> n </span><span style="color: #000000; ">=</span><span style="color: #000000; "> MultiByteToWideChar(CP_ACP, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, strGBK.c_str(), </span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, NULL, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />     str1 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> WCHAR[n];<br />     MultiByteToWideChar(CP_ACP, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, strGBK.c_str(), </span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, str1, n);<br />     n </span><span style="color: #000000; ">=</span><span style="color: #000000; "> WideCharToMultiByte(CP_UTF8, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, str1, </span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, NULL, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, NULL, NULL);<br />     </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; "> str2 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">[n];<br />     WideCharToMultiByte(CP_UTF8, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, str1, </span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, str2, n, NULL, NULL);<br />     strOutUTF8 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> str2;<br />     delete[]str1;<br />     str1 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> NULL;<br />     delete[]str2;<br />     str2 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> NULL;<br />     </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> strOutUTF8;<br /> }<br /> <br /> </span><span style="color: #008000; ">//</span><span style="color: #008000; ">utf-8 ?nbsp;gbk</span><span style="color: #008000; "><br /> </span><span style="color: #0000FF; ">string</span><span style="color: #000000; "> UTF8ToGBK(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&</span><span style="color: #000000; "> strUTF8)<br /> {<br />     </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> len </span><span style="color: #000000; ">=</span><span style="color: #000000; "> MultiByteToWideChar(CP_UTF8, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, strUTF8.c_str(), </span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, NULL, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />     unsigned </span><span style="color: #0000FF; ">short</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; "> wszGBK </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> unsigned </span><span style="color: #0000FF; ">short</span><span style="color: #000000; ">[len </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />     memset(wszGBK, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, len </span><span style="color: #000000; ">*</span><span style="color: #000000; "> </span><span style="color: #000000; ">2</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />     MultiByteToWideChar(CP_UTF8, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, (LPCTSTR)strUTF8.c_str(), </span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, wszGBK, len);<br /> <br />     len </span><span style="color: #000000; ">=</span><span style="color: #000000; "> WideCharToMultiByte(CP_ACP, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, wszGBK, </span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, NULL, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, NULL, NULL);<br />     </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; ">szGBK </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">[len </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />     memset(szGBK, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">, len </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />     WideCharToMultiByte(CP_ACP,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">, wszGBK, </span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, szGBK, len, NULL, NULL);<br />     </span><span style="color: #008000; ">//</span><span style="color: #008000; ">strUTF8 = szGBK;</span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">    std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; "> strTemp(szGBK);<br />     delete[]szGBK;<br />     delete[]wszGBK;<br />     </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> strTemp;<br /> }</span></div> <p> <span style="font-size: 12pt;">q玩意儿不跨q_Q因为它用到?jin)windows api。我之所以把它放到跨q_~程上面来,是因为字W编码这东西只有到跨q_的时候才昑־坑爹?/span></p> <br /> <h3>接着我是不是要介l那俩函C下?</h3> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">int</span><span style="color: #000000; "> MultiByteToWideChar(<br />   _In_       UINT CodePage, </span><span style="color: #008000; ">/*</span><span style="color: #008000; ">代码|Windows下字W编码的叫法Qgbk?36Qutf-8?5001QCP_ACP是ANSI</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />   _In_       DWORD dwFlags, </span><span style="color: #008000; ">/*</span><span style="color: #008000; ">选项标志Q{换类型,?p?/span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />   _In_       LPCSTR lpMultiByteStr, </span><span style="color: #008000; ">/*</span><span style="color: #008000; ">多字节字W串</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />   _In_       </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> cbMultiByte, </span><span style="color: #008000; ">/*</span><span style="color: #008000; ">字符串要处理的长度,如果?1函数׃(x)处理整个字符?/span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />   _Out_opt_  LPWSTR lpWideCharStr, </span><span style="color: #008000; ">/*</span><span style="color: #008000; ">输出的宽字符串缓存,如果为空p回需要的宽字W串长度</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />   _In_       </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> cchWideChar </span><span style="color: #008000; ">/*</span><span style="color: #008000; ">宽字W串~存的长度,当然如果宽字W串为空Q这个设0可以了(jin)</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /> );<br /> <br /> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> WideCharToMultiByte(<br />   _In_       UINT CodePage,<br />   _In_       DWORD dwFlags,<br />   _In_       LPCWSTR lpWideCharStr,<br />   _In_       </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> cchWideChar,<br />   _Out_opt_  LPSTR lpMultiByteStr,<br />   _In_       </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> cbMultiByte, </span><span style="color: #008000; ">/*</span><span style="color: #008000; ">前面的基本与MultiByteToWideChar都相同,׃解释?/span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />   _In_opt_   LPCSTR lpDefaultChar, </span><span style="color: #008000; ">/*</span><span style="color: #008000; ">?卛_</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />   _Out_opt_  LPBOOL lpUsedDefaultChar </span><span style="color: #008000; ">/*</span><span style="color: #008000; ">?卛_</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /> );<br /> </span></div> <p><span style="font-size: 12pt;">q两个函数分别是多字节字符串{换ؓ(f)宽字W字W串 ?宽字符字符串{换ؓ(f)多字节字W串Q在此处晕倒的童鞋们我没有对不起你?#8230;…是M$那家伙对不v你们Q。我早就说过Windows API 的界面不友好Q这么多不知道干嘛吗用的参数Q全部填0对?jin)。要是iconv()Q它貌似只有4个参敎ͼq才是好的榜栗?/span></p> <p><br /> </p> <h3>宽字W?多字节?</h3> <p><span style="font-size: 12pt;">q是Windowsl它们v的名字,让h怸着头脑?/span></p> <p> </p> <p> </p> <ul> <li> <p><span style="font-size: 12pt;">宽字W:(x)是<strong style="font-size: 12pt;">Unicode</strong>。它h不动地用2个字节(0x0000 - 0xFFFFQ,表示所有我们^常能见到的字W,具体的表DQ?a >http://unicode-table.com</a></span></p> </li> </ul> <p> </p> <ul> <li> <p><span style="font-size: 12pt;">多字节:(x)是除了(jin)Unicode?strong style="font-size: 12pt;">其他</strong>的。我们熟(zhn)的gbk, utf-8, big5Q统l归入多字节?/span></p> </li> </ul> <p> </p> <p> </p> <p><span style="font-size: 12pt;">宽字W之所以叫做宽字符Q是因ؓ(f)它是一个宽一点的字符。那什么是短字W?#8230;…是ascii?jin)?个字?个字W绝对够短,而且只能表示256个西Ƨ字W。宽字符呢,?个字?个字W。宽一点,但还是可以识别到一个字W是哪里的。而多字节呢,是它在计算机里表示成多个字节,但是没有办法识别那里到那里是一个字W?/span></p> <p> </p> <p><span style="font-size: 12pt;">我不喜欢q两个函数的命名。如果按照Python的命名,</span><span style="color: #000000; font-size: 12pt;">MultiByteToWideChar 应该?decode(解码)QW(xu)ideCharToMultiByte 应该?encode(~码)?/span></p> <p><br /> </p> <h3>所以呢Q?/h3> <p><span style="font-size: 12pt;">如你所见,多字节无法准识别字W的长度Q处理v来就?x)很ȝ?ch)。而宽字符大多时候虽然比多字节多耗费一点空_(d)但是处理h方便。比如正则表辑ּ处理Q引擎是Z字符d配的Q宽字符可以两个字节两个字节跳着匚wQ而多字节׃(x)匚w错误?/span></p> <p> </p> <p><span style="font-size: 12pt;">比如有一个词“</span><span style="color: #008080; font-size: 12pt;">E序</span><span style="font-size: 12pt;">”=0xB3</span><span style="color: #0000ff; font-size: 12pt;">CCD0</span><span style="font-size: 12pt;">F2(gbk)Q我惛_?#8220;</span><span style="color: #008080; font-size: 12pt;">l?/span><span style="font-size: 12pt;">”=0x</span><span style="color: #0000ff; font-size: 12pt;">CCD0</span><span style="font-size: 12pt;">(gbk)Q正则库?x)替我把中间那两个字节匹配?jin)。用在C里用wchar_tQC++里用std::wstringQ我们可以很准确的,无错误地匚w到我们想要的子串Q因为引擎在q代的时候是逐字Q而不是逐字节)(j)q行比较的?/span></p> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080; ">1</span> <span style="color: #008000;">>>></span><span style="color: #000000; "> str1 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #800000; ">"</span><span style="color: #800000; ">l?/span><span style="color: #800000; ">"</span><span style="color: #000000; "><br /> </span><span style="color: #008080; ">2</span> <span style="color: #000000; "></span><span style="color: #008000;">>>></span><span style="color: #000000; "> str2 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #800000; ">"</span><span style="color: #800000; ">E序</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br /> </span><span style="color: #008080; ">3</span> <span style="color: #000000; "></span><span style="color: #008000;">>>></span><span style="color: #000000; "> </span><span style="color: #0000FF; ">print</span><span style="color: #000000; "> re.findall(str1, str2)<br /> </span><span style="color: #008080; ">4</span> <span style="color: #000000; ">[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">\xcc\xd0</span><span style="color: #800000; ">'</span><span style="color: #000000; ">]<br /> </span><span style="color: #008080; ">5</span> <span style="color: #000000; "></span><span style="color: #008000;">>>></span><span style="color: #000000; "> </span><span style="color: #0000FF; ">print</span><span style="color: #000000; "> re.findall(str1.decode(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">gbk</span><span style="color: #800000; ">"</span><span style="color: #000000; ">), str2.decode(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">gbk</span><span style="color: #800000; ">"</span><span style="color: #000000; ">))<br /> </span><span style="color: #008080; ">6</span> <span style="color: #000000; ">[]</span></div> <p><strong><span style="font-size: 12pt;">所以在处理字符串的时候,但凡要处理中文,要先把用L(fng)的字W串解码成Unicode。处理完之后昄出来或者保存,再编码成需要的charset?/span></strong></p> <h4><br style="color: #333333;" /> <span></span></h4> <h4><span style="color: #333333; font-size: 10pt;"><em>Appendix</em></span></h4> <p><em style="color: #333333; font-size: 10pt;">在不同的地方用不同的~码Q?/em></p> <ul> <li><em style="color: #333333; font-size: 10pt;">|络文本Q如|页Q传输一般用utf-8Q因为有量中文Q而大部分是英文?/em></li> <li><em style="color: #333333; font-size: 10pt;">在保存ؓ(f)本地文g的时候,应该保存为UnicodeQ因为本地存储资源丰富,且可以节省时_(d)实时解码毕竟也是O(N^2)啊?/em></li> <li><em style="color: #333333; font-size: 10pt;">昄出来应该用系l的~码Q中文Windows为gbkQ繁体Windows为Big5QLinux一律ؓ(f)UTF-8?/em></li> <li><em style="color: #333333; font-size: 10pt;">源代码里的少量中文串量?em style="color: #ff6600;">"\x????\x????"</em>来表C,如果有大量中文徏议用gettext或者资源之cȝ以外挂的方式d?/em></li> <li><em style="color: #333333; font-size: 10pt;">Qt内部使用UnicodeQ所以编写Qt应用时显C文字直接传递宽字符串即可?/em></li> <li><em style="color: #333333; font-size: 10pt;">NTFS的文件名、\径都是用<strike>GBK</strike>UTF16LE~码的,所以如果Windows下用戯入的是\径就无需解码?jin)?/em></li> </ul> <p><br /> </p><img src ="http://www.shnenglu.com/Shihira/aggbug/200124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Shihira/" target="_blank">Shihira</a> 2013-10-28 22:49 <a href="http://www.shnenglu.com/Shihira/archive/2013/10/28/200124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AGG入门Q八Q?- 渲染http://www.shnenglu.com/Shihira/archive/2012/08/01/185867.htmlShihiraShihiraWed, 01 Aug 2012 12:01:00 GMThttp://www.shnenglu.com/Shihira/archive/2012/08/01/185867.htmlhttp://www.shnenglu.com/Shihira/comments/185867.htmlhttp://www.shnenglu.com/Shihira/archive/2012/08/01/185867.html#Feedback0http://www.shnenglu.com/Shihira/comments/commentRss/185867.htmlhttp://www.shnenglu.com/Shihira/services/trackbacks/185867.html一、引a
让我们来看一看渲染具体的程囑֐Q?/div>

上面提到?jin)几个概念,再解释一下:(x)
  • 点源(Vertex SourceQ:(x)用顶点的方式描述矢量囑ŞQ?/li>
  • 光栅化(ResterizerQ:(x)它的作用是把点源所描绘的图形与像素对应hQ可以说cM于Photoshop上的矢量蒙版Q?/li>
  • 扫描U(ScanlineQ:(x)扫描U的作用是为扫描线渲染器提供一个扫描的方式和区域,使渲染器有序地填充;
  • 扫描U渲染器QScanline RendererQ:(x)分实色和自定义渲染器两类Q实色只允许你用单一的颜色去q行渲染Q而自定则可做得多姿多彩,比如渐变、位图;它相当于GDI里的d?/li>

二、工?/h3>
q次我们以一个自制的点源与椭圆l合作ؓ(f)渲染对象Q用宝蓝色的实色渲染器进行渲染;

#include <agg_ellipse.h>

//................

class triangle_path {
public:
    triangle_path()
    {
        unsigned tmp_array[4][3]={
            {0  , 250, agg::path_cmd_move_to},
            {500, 250, agg::path_cmd_line_to},
            {250, 500, agg::path_cmd_line_to},
            {0  ,   0, agg::path_cmd_stop}
        };
        memcpy(m_points[0], tmp_array[0], sizeof(m_points));
    }
    unsigned vertex(double *x, double* y)
    {
        *x = m_points[m_step][0];
        *y = m_points[m_step][1];
        unsigned r = m_points[m_step][2];
        m_step++;
        return r;
    }
    void rewind(int)
    {
        m_step = 0;
    }
private:
    int m_step;
    unsigned m_points[4][3];
};

//...... in class the_application

    void on_draw()
   {
        ren_bas.reset_clipping(true);
        ren_bas.clear(agg::rgba8(255, 255, 255));
 
        agg::ellipse ellipse(250, 125, 125, 125);
        triangle_path triangle;
        rasterizer.reset();
        rasterizer.add_path(triangle);
        rasterizer.add_path(ellipse);
        agg::render_scanlines_aa_solid(rasterizer, scanline, ren_bas,
            agg::rgba8(45, 108, 155));  //注意Q函数名中的scanline是复敎ͼQ?/span>
    }

三、解?/h3>
先看on_draw函数Q我们先定义?jin)两个顶?gu)Q一个是椭圆Q另一个是自制的三角ŞQ先把rasterizer重置Q清除上ơ重l留下的光栅信息Q我们再在光栅中dq两个顶Ҏ(gu)Q用渲染器渲染,是?jin)?/div>
你可能感到奇怪:(x)Z么没有扫描线渲染器的定义呢?其实?span style="color: #ff0000; ">render_scanlines_aa_solid里,已l帮你定义好?jin)实色渲染器。把render_scanlines_aa_solid展开成:(x)
agg::renderer_scanline_aa_solid<agg::renderer_base<agg::pixfmt_rgb24>> renderer_scanline(ren_bas);
renderer_scanline.color(agg::rgba8(45, 108, 155, cover));
agg::render_scanlines(rasterizer, scanlines, renderer_scanline);
效率是一L(fng)Q只不过函数版本更加z?/div>
点源的定义Q结合上一节的知识和agg_basics.h中关于path_commands_e和path_flags_e的定义,应该是可以理解的Q?/div>


Shihira 2012-08-01 20:01 发表评论
]]>AGG入门Q七Q?- 点?/title><link>http://www.shnenglu.com/Shihira/archive/2012/07/24/183919.html</link><dc:creator>Shihira</dc:creator><author>Shihira</author><pubDate>Tue, 24 Jul 2012 08:30:00 GMT</pubDate><guid>http://www.shnenglu.com/Shihira/archive/2012/07/24/183919.html</guid><wfw:comment>http://www.shnenglu.com/Shihira/comments/183919.html</wfw:comment><comments>http://www.shnenglu.com/Shihira/archive/2012/07/24/183919.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/Shihira/comments/commentRss/183919.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Shihira/services/trackbacks/183919.html</trackback:ping><description><![CDATA[<h3>一、修Ҏ(gu)?/h3> <div>现在l于q入?jin)真正的矢量l图阶段Q我们的模版也需要有所改变Q至于ؓ(f)什么,有什么作用,以后?x)说刎ͼ?br />包含下面的头文gQƈ且在the_applicationcMd两个成员?/div> <div> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008000; ">//</span><span style="color: #008000; ">扫描U和扫描U光栅器</span><span style="color: #008000; "><br /> </span>#include <agg_scanline_u.h><br /> #include <agg_rasterizer_scanline_aa.h><br /> <br /> <span style="color: #0000FF; ">private</span>:<br />     <span style="color: #008000; ">//</span><span style="color: #008000; ">扫描U和扫描U光栅器</span><span style="color: #008000; "><br /> </span>    agg::scanline_u8 scanline;<br />     agg::rasterizer_scanline_aa<> rasterizer;</div> </div> <div> <p><br /> </p> <h3> 二、顶Ҏ(gu)</h3> <p> </p> <div>点源(Vertex SourceQ不是一个类Q而是一U类的模式。这U类里面有rewind()函数和vertex()函数lAGG内部调用Q没错,q就是它的定义)(j)。类如其名,点源就是ؓ(f)l图pȝ提供点信息的,大家能想象得?gu)两个函数的作用?jin)吗?</div> <div><strong>rewind()</strong>Q回到最开始个步骤Q?/div> <div><strong>vertex(double* x, double* y)</strong>Q每调用一ơ,跳一个步骤(点)(j)Q每一个步骤都输出点的x,y坐标Q灰色字Q,以及(qing)q个坐标的绘囑֑令(紫色字)(j)Q?br /> <img src="http://www.shnenglu.com/images/cppblog_com/shihira/5.png" border="0" alt="" width="296" height="256" /></div> <div></div> <h3>三、内|顶Ҏ(gu)</h3> <div>AGG内置?jin)大量的点源,我们可以直接调用Q他们包括:(x)</div> <div><strong>agg::path_storage</strong></div> <div><strong>agg::arc</strong></div> <div><strong>agg::rounded_rect</strong></div> <div><strong>agg::ellipse</strong></div> <div><strong>agg::curve3</strong></div> <div><strong>agg::curve4 ......</strong></div> <div>{等Qؓ(f)什么没有线、点点源?其实Qpath_storage已经内置?jin)画U函数、画弧函数、画贝塞?dng)曲U函敎ͼ你可以用path_storage创造几乎Q何的囑Ş。至于画点,copy_pixel()或者用椭圆?#8230;…</div> <div></div> <h3>四、\径储存器</h3> <div>Path storage 是用来管理\径、画复杂囑Ş的。在上面可以Ld直线、曲Uѝ其他\径?/div> <h4>头文?/h4> <div><span style="color: #0000ff; ">#include</span> <agg_path_storage.h></div> <h4>cd定义</h4> <div><span style="color: #0000ff; ">typedef</span> path_base<vertex_block_storage<<span style="color: #0000ff; ">double</span>> > path_storage;</div> <h4>基本成员函数</h4> <div> <ul> <li><strong>move_to()</strong><br />     d命o(h)?path_cmd_move_to 的顶点,意ؓ(f)下一条线从这个点开始画Q?/li> <li><strong>line_to()</strong><br />     d命o(h)?path_cmd_line_to 的顶点,意ؓ(f)ȝ到这个点Q?/li> <li><strong>arc_to(double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double x, double y)</strong><br />     d一条弧路径Q画轴长为rx, ryQ角度ؓ(f)angleQ优/劣弧Q顺逆时针,l点?x,y)?/li> <li><strong>curve3_to()</strong><br />     d贝塞?dng)曲U,参数Z个控制点和终点的坐标</li> <li><strong>curve4_to()</strong><br />     d贝塞?dng)曲U,参数Z个控制点和终点的坐标</li> <li><strong>join_path()</strong><br />     d一个顶Ҏ(gu)Q即l合</li> <li><strong>vertex(unsigned idx, double* x, double* y)<br /> last_vertex(double* x, double* y)<br /> vertex(double* x, double* y)</strong><br />     取顶点位|,前者ؓ(f)已知步骤Q后两者ؓ(f)序或倒序获取</li> <li><strong>modify_vertex()<br /> modify_command()</strong><br />     修改步骤为idx的顶点坐标和命o(h)</li> </ul> </div> <div></div> <h3>五、其他顶Ҏ(gu)</h3> <div>其他点源就不一一介绍?jin),只列出其头文件和构造函敎ͼ(x)</div> <div> <ul> <li><span style="color: #0000ff; ">#include <agg_ellipse.h></span><br /> <strong>ellipse(double x, double y, double rx, double ry, unsigned num_steps=0, bool cw=false)</strong><br />     圆心(j)(x, y)和长短半轴分别ؓ(f)rx, ryQ步骤数位num_stepsQ无用)(j)Qcw军_怺地方是否I出</li> <li><span style="color: #0000ff; ">#include <agg_arc.h></span><br /> <strong>arc(double x,  double y, double rx, double ry, double a1, double a2, bool ccw=true)</strong><br />     圆心(j)?x, y)和长短半轴分别ؓ(f)rx, ryQ初始角度和l结角度为a1, a2</li> <li><span style="color: #0000ff; ">#include <agg_curves.h></span><br /> <strong>curve3(double x1, double y1, double x2, double y2, double x3, double y3)</strong><br />     三个点,分别为:(x)初始点,控制点一Q终l点</li> <li><span style="color: #0000ff; ">#include <agg_curves.h></span><br /> <strong>curve4(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)</strong><br />     四个点,分别为:(x)初始点,控制点一Q控制点二,l结?/li> <li><span style="color: #0000ff; ">#include <agg_rounded_rect.h></span><br /> <strong>rounded_rect(double x1, double y1, double x2, double r)</strong><br />     对角点的坐标和圆角半?/li> </ul> </div> <div></div> <p><strong style="color: #993300; ">至于怎样把他们画在渲染内存上呢,我们下一会(x)讲到?/strong><strong style="color: red; "><br />头文件也渐渐地多?jin)v来,包含头文件时的工作量有点大;我特地列?jin)一个头文gQ里面已l包含了(jin)所有的AGG头文Ӟ以后大家只需要包含它?yu)好了(jin)?br />下蝲处:(x)</strong><a href="http://www.shnenglu.com/Files/Shihira/agg.h.zip">http://www.shnenglu.com/Files/Shihira/agg.h.zip</a><a href="http://www.shnenglu.com/Files/Shihira/AGG.zip"></a></p> </div><img src ="http://www.shnenglu.com/Shihira/aggbug/183919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Shihira/" target="_blank">Shihira</a> 2012-07-24 16:30 <a href="http://www.shnenglu.com/Shihira/archive/2012/07/24/183919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AGG入门Q六Q?- l习(fn)和细?/title><link>http://www.shnenglu.com/Shihira/archive/2012/07/24/183618.html</link><dc:creator>Shihira</dc:creator><author>Shihira</author><pubDate>Tue, 24 Jul 2012 08:30:00 GMT</pubDate><guid>http://www.shnenglu.com/Shihira/archive/2012/07/24/183618.html</guid><wfw:comment>http://www.shnenglu.com/Shihira/comments/183618.html</wfw:comment><comments>http://www.shnenglu.com/Shihira/archive/2012/07/24/183618.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/Shihira/comments/commentRss/183618.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Shihira/services/trackbacks/183618.html</trackback:ping><description><![CDATA[<div>学到目前为止Q已l认识了(jin)六个cdQ?/div> <div> <ul> <li><strong>platform_support</strong></li> <li><strong>rendering_buffer</strong></li> <li><strong>rgba8</strong></li> <li><strong>pixfmt_rgb24</strong></li> <li><strong>rect_i</strong></li> <li><strong>renderer_base</strong></li> </ul> </div> <div>现在来做些练?fn),看看有没有掌握学q的东西Qƈ且灵z运用吧?/div> <div></div> <h3>一、基本框?/h3> <div>q一节的E序都以q个框架为基Q都是在on_draw中稍微改动的Q?/div> <div> <div style="background-color: #eeeeee; font-size: 13px; border:1px solid #CCCCCC; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->#include <agg_pixfmt_rgb.h><br /> #include <agg_renderer_base.h><br /> #include <platform/agg_platform_support.h><br /> <br /> <span style="color: #0000FF; ">class</span> the_application : <span style="color: #0000FF; ">public</span> agg::platform_support<br /> {<br /> <span style="color: #0000FF; ">public</span>:<br />     the_application(agg::pix_format_e format, <span style="color: #0000FF; ">bool</span> flip_y) : <br />         agg::platform_support(format, flip_y),<br />         pix_fmt(rbuf_window()),<br />         ren_bas(pix_fmt) <span style="color: #008000; ">//</span><span style="color: #008000; ">初始化渲染器</span><span style="color: #008000; "><br /> </span>    { }<br />     <br />     <span style="color: #0000FF; ">virtual</span> <span style="color: #0000FF; ">void</span> on_draw()<br />     {<br />          ren_bas.reset_clipping(true); <div>         ren_bas.clear(agg::rgba8(255, 255, 255));</div>     }<br /> <span style="color: #0000FF; ">private</span>:<br />     agg::pixfmt_rgb24 pix_fmt;<br />     agg::renderer_base<agg::pixfmt_rgb24> ren_bas;<br /> <br /> };<br /> <br /> <span style="color: #0000FF; ">int</span> agg_main(<span style="color: #0000FF; ">int</span> argc, <span style="color: #0000FF; ">char</span>* argv[])<br /> {<br />     the_application app(agg::pix_format_bgr24, <span style="color: #0000FF; ">true</span>);<br />     app.caption("AGG Test");<br />     <br />     <span style="color: #0000FF; ">if</span>(app.init(500, 500, agg::window_resize)) {<br />         <span style="color: #0000FF; ">return</span> app.run();<br />     }<br />     <span style="color: #0000FF; ">return</span> -1;<br /> }</div> </div> <h3>二、画U函?/h3> <p>~写如下函数Q实现在渲染~存中画U的功能Q无需反锯齿)(j)Q?br />     <span style="color: #0000ff; ">inline void</span> stroke_line(<span style="color: #0000ff; ">int</span> x1, <span style="color: #0000ff; ">int</span> y1, <span style="color: #0000ff; ">int</span> x2, <span style="color: #0000ff; ">int</span> y2, agg::rgba8& color);<br /> 参数Q?br /> </p> <ul> <li>x1, y1, x2, y2分别是两个端点的坐标Q?/li> <li>color是颜Ԍ</li> </ul> <p> </p> <h3>三、画圆函?/h3> <p>~写如下函数Q实现在渲染~存中画圆的功能Q无需反锯齿)(j)Q?br />     <span style="color: #0000ff; ">void</span> stroke_round(<span style="color: #0000ff; ">int</span> r, <span style="color: #0000ff; ">int</span> C_x, <span style="color: #0000ff; ">int</span> C_y, agg::rgba8& color, <span style="color: #0000ff; ">float </span>step = 0.01) <br /> 参数Q?br /> </p> <ul> <li>C_x, C_y 是圆?j)的坐标Q?/li> <li>color是颜Ԍ</li> <li>step是步长,也就是吧圆细分成1/step边ŞQ? </li> </ul> <p> </p> <h3>四、答?/h3> <div> <p> </p> <ul> <li>ȝ函数<br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->inline <span style="color: #0000FF; ">void</span> stroke_line(<span style="color: #0000FF; ">int</span> x1, <span style="color: #0000FF; ">int</span> y1, <span style="color: #0000FF; ">int</span> x2, <span style="color: #0000FF; ">int</span> y2, agg::rgba8& color)<br /> {<br />     <span style="color: #0000FF; ">double</span> precision = max(abs(x1 - x2), abs(y1 - y2));<br />     <span style="color: #008000; ">//</span><span style="color: #008000; ">_ֺQ也是d个?/span><span style="color: #008000; "><br /> </span><br />     <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=0; i <= precision; i++)<br />         ren_bas.copy_pixel( x1 + ( x2 - x1 ) / precision * i, <span style="color: #008000; ">//</span><span style="color: #008000; ">x</span><span style="color: #008000; "><br /> </span>            y1 + ( y2 - y1 ) / precision * i, <span style="color: #008000; ">//</span><span style="color: #008000; ">y</span><span style="color: #008000; "><br /> </span>            color);<br /> }</div> </li> <li>d函数<br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">void</span> stroke_round(<span style="color: #0000FF; ">int</span> r, <span style="color: #0000FF; ">int</span> C_x, <span style="color: #0000FF; ">int</span> C_y, agg::rgba8& color, <span style="color: #0000FF; ">float</span> step = 0.01)<br /> {<br />     <span style="color: #0000FF; ">int</span> prev_x = <span style="color: #0000FF; ">int</span>(r * cos(-0.01)) + C_x,<br />         prev_y = <span style="color: #0000FF; ">int</span>(r * sin(-0.01)) + C_y; <span style="color: #008000; ">//</span><span style="color: #008000; ">保存上一个点</span><span style="color: #008000; "><br /> </span><br />     <span style="color: #0000FF; ">int</span> x, y; <span style="color: #008000; ">//</span><span style="color: #008000; ">保存当前的点</span><span style="color: #008000; "><br /> </span>    <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">double</span> rad = 0; rad < 2 * PI + step; rad+= step) {<br />         x = <span style="color: #0000FF; ">int</span>(r * cos(rad)) + C_x;<br />         y = <span style="color: #0000FF; ">int</span>(r * sin(rad)) + C_y; <span style="color: #008000; ">//</span><span style="color: #008000; ">计算弧度为rad时的坐标</span><span style="color: #008000; "><br /> </span>        stroke_line(x, y, prev_x, prev_y, color);<br />         prev_x = x; prev_y = y;<br />     }<br /> }</div> </li> </ul> <p>可能有的Z(x)觉得奇怪的是,Z么在ȝ函数中,不用pix_fmt.copy_pixel()而用ren_bas.copy_pixel()呢?因ؓ(f)Q在pix_fmt中,混合器不q行(g)查,像素拯的时候会(x)拯到剪裁区域以外,q样?x)造成很奇怪的情况Q以至于如果写到?jin)缓存以外,q会(x)出现异常。注意,剪裁盒功能是基础渲染器别才提供的,更加底层的操作,比如像素格式混合和直接操作缓存,高层ơ的渲染器是无从理的。ؓ(f)?jin)安全v见,碰基础渲染器以下的工具……</p> </div> <div> </div><img src ="http://www.shnenglu.com/Shihira/aggbug/183618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Shihira/" target="_blank">Shihira</a> 2012-07-24 16:30 <a href="http://www.shnenglu.com/Shihira/archive/2012/07/24/183618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AGG入门Q五Q?- 基础渲染?/title><link>http://www.shnenglu.com/Shihira/archive/2012/07/24/183556.html</link><dc:creator>Shihira</dc:creator><author>Shihira</author><pubDate>Tue, 24 Jul 2012 08:29:00 GMT</pubDate><guid>http://www.shnenglu.com/Shihira/archive/2012/07/24/183556.html</guid><wfw:comment>http://www.shnenglu.com/Shihira/comments/183556.html</wfw:comment><comments>http://www.shnenglu.com/Shihira/archive/2012/07/24/183556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Shihira/comments/commentRss/183556.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Shihira/services/trackbacks/183556.html</trackback:ping><description><![CDATA[<div>基础渲染器(Base RendererQ是扫描U渲染器的基Q可以说Q正常情况下Q你l画M囑Ş、做M事,都需要通过它。而基渲染器需要你以模版的形式提供像素格式的信息,他将?x)通过像素格式混合器来实现渲染。其实,基础渲染器比像素格式混合器多?jin)剪裁盒的功能,其他混合、拷贝什么的和像素格式؜合器是相似的Q这里就不列出来?jin)?/div><div></div><h3>矩Şc?/h3><div>AGG装?jin)一个专门表C矩形的模板crect_baseQ方便矩形的操作。下面用rect_i说明一下?       </div><h4>头文?/h4><div><span style="color: #0000ff; ">#include</span> "agg_basics.h"</div><h4>cd定义</h4><div><span style="color: #0000ff; ">typedef</span> rect_base<int> rect_i;</div><h4>基本成员函数</h4><div><ul><li><span style="color: #000080; "><strong>rect_i(x1, y1, x2, y2)<br /></strong></span>        构造函敎ͼl出最和最大坐标;</li><li><strong><font color="#000080">normalize()<br /></font></strong>        修正x1>x2或y1>y2的不合法矩ŞQ?/li><li><span style="color: #000080; "><strong>clip(rect_i& r)</strong></span><br />        取当前矩形与r怺的区域矩形作为当前矩形;</li><li><span style="color: #000080; "><strong>is_valid()</strong></span><br />        (g)查矩形是否合法;</li><li><span style="color: #000080; "><strong>hit_test(int x, int y)<br /></strong></span>        (g)?x, y)是否在矩形内Q?/li></ul></div><div></div><h3>基础渲染?/h3><h4>头文?/h4><div><span style="color: #0000ff; ">#include</span> "agg_renderer_base"</div><h4>cd定义</h4><div><span style="color: #0000ff; ">template</span><class PixelFormat> class renderer_base</div><h4>基本成员函数</h4><div><ul><li><span style="color: #000080; "><strong>renderer_base(PixelFormat)<br /></strong></span>        构造函敎ͼ提供像素格式Q?/li><li><strong style="color: #000080; ">ren()<br /></strong>        q回像素格式对象Q?/li><li><span style="color: #000080; "><strong>clip_box(x1,y1,x2,y2)<br />clip_box_naked(x1,y1,x2,y2)<br /></strong></span>        讄当前剪裁盒ؓ(f)x1,y1,x2,y2围成的剪裁盒Q前者检查剪裁盒是否合法Q后者不(g)查?/li><li><span style="color: #000080; "><strong>reset_clipping(bool visibility)<br /></strong></span>        重置剪裁盒,visibility军_剪裁盒是铺满H口Q可视)(j)q是0Q不可视Q;</li><li><span style="color: #000080; "><strong>clip_box()<br />xmin()<br />ymin()<br />xmax()<br />ymax()<br /></strong></span>        q回当前剪裁盒矩形、以?qing)纵横坐标?/li><li><span style="color: #000080; "><strong>copy_from()<br />blend_from()<br /></strong></span>        可以比较方便地、以矩Ş方式拯和؜合缓存里的图像了(jin)Q?/li></ul></div><img src ="http://www.shnenglu.com/Shihira/aggbug/183556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Shihira/" target="_blank">Shihira</a> 2012-07-24 16:29 <a href="http://www.shnenglu.com/Shihira/archive/2012/07/24/183556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AGG入门Q四Q?- 渲染~存和؜合器http://www.shnenglu.com/Shihira/archive/2012/07/24/183204.htmlShihiraShihiraTue, 24 Jul 2012 08:29:00 GMThttp://www.shnenglu.com/Shihira/archive/2012/07/24/183204.htmlhttp://www.shnenglu.com/Shihira/comments/183204.htmlhttp://www.shnenglu.com/Shihira/archive/2012/07/24/183204.html#Feedback0http://www.shnenglu.com/Shihira/comments/commentRss/183204.htmlhttp://www.shnenglu.com/Shihira/services/trackbacks/183204.html一、上一节的代码

        agg::rendering_buffer &rbuf = rbuf_window();
        agg::pixfmt_rgb24 pixf(rbuf);

        agg::renderer_base<agg::pixfmt_rgb24> renb(pixf);
        renb.clear(agg::rgba8(255, 255, 255));

        pixf.copy_pixel(20, 20, agg::rgba8(0, 0, 255));

二、渲染缓?/h3>
渲染~存保存着一个个像素Q作为AGG的画布。它仅仅是一个内存块Q用来储存像素信息,不提供Q何绘囑֊能,只允怽d和修攚w面的数据。它也不告诉你里面的像素是灰度的、RGB的还是RGBA的,不告诉你从哪里到哪里是一个像?#8212;—它只是用来管理内存数据的?/div>

头文?/h4>
#include "platform/agg_platform_support.h"

cd定义

typedef row_accessor<int8u> rendering_buffer //int8u? bit无符h?/div>

基本成员函数

  • rendering_buffer(int8u* buf, unsigned width, unsigned height, int stride) 
            构造函敎ͼ指定事先分配好的内存块(到时qC面)(j)首地址、宽高、一行的字节敎ͼ默认全部都是0Q;
  • row_ptr(int y)
            q回Wy行的首地址Q?/li>
  • copy_from(void *buf)
            从buf中拷贝像素;
  • clear(int8u value)
            用value清空~存
  • buf(), height(), weight(), stride()
            q回~存首地址、宽高、一行的字节敎ͼ
注:(x)代码中的rbuf_window()是platform_support的一个成员函敎ͼ用于q回platform_support一开始帮你申L(fng)~存引用?/span>

三、؜合器

混合器的存在是ؓ(f)?jin)适应不同q_、不同需求下的不同像素格式。؜合器有三U:(x)agg::rgbaQ?strong>agg::rgba8?strong>agg::rgba16Q都是用来指定颜色的Qrgba每个通道储存为doubleQrgba8为unsigned charQrgba16为int或long intQ؜合器起到的作用就像Win32API里的RGB和COLORREF宏?/div>

头文?/h4>
#include "agg_pixfmt_rgba.h"

cd定义

struct rgba8; //对,你没有看错,是结构,不是c?#8230;…

基本成员函数

  • rgba8(unsigned r, unsigned g, unsigned b, unsigned a)
            无须解释?jin)吧Q最?55Q?/li>
  • clear(), no_color()
            四个通道全部清零Q也是变没色咯Q?/li>
  • transparent()
            alpha清零Q变透明Q?/li>
  • opacity()
            q回透明度,用double表示Q?/li>
  • gradient(agg::rgba8 &c, double k)
            颜色梯度Q就是颜色变Z原先的颜色渐变ؓ(f)cQ变化率为kQ?/li>
  • add(agg::rgba8 &c, unsinged cover)
            颜色叠加Q叠加一个透明度ؓ(f)cover/255的颜色cQ?/li>

成员变量

  • r, g, b, a都是无符h型;

四、像素格式؜合器


像素格式混合器的作用是直接操作像素(也就是缓存里保存的数据,但v码有个像素的样子Q,起到Win32API里的SetPixel()和GetPixel()的作用。像素格式由两个属性决定:(x)混合器类?strong>【agg::rgba8/agg::rgba16?/strong>、bgr/rgb/rgba/abgr序【agg::order_bgr/agg::order_rgb/agg::order_rgba/agg::order_abgr?/strong>——q样Q共8U像素格式,它们起名字的规则是Q?/div>
agg::pixfmt_[order][bits*3];
下面用最常用的agg::pixfmt_rgb24来解释:(x)

头文?/h4>
#include "agg_pixfmt_rgb.h"

cd定义

typedef pixfmt_alpha_blend_rgb<blender_rgb<rgba8,  order_rgb>, rendering_buffer> pixfmt_rgb24;

基本成员函数

  • pixfmt_rgb24(agg::rendering_buffer &) 
            构造函敎ͼ指定~存好Q?/li>
  • blend_pixel(agg::rgba8& c, int x, int y, int8u cover)
            用颜色c以coverQ覆盖率=透明度)(j)的透明度؜合像?x, y)Q?/li>
  • copy_pixel(agg::rgba8& c, int x, int y)Qpixel(int x, int y)
            q个是相当于SetPixel()和GetPixel()?jin)?/li>
  • copy_hline(int x, int y, unsigned len, agg::rgba8& c)
    copy_vline(int x, int y, unsigned len, agg::rgba8& c)  
            ?x, y)开始打横(竖)(j)序讄len长度的像素;
  • blend_hline(int x, int yQ?unsigned len, agg::rgba8& c, int8u cover)
    blend_vline(int x, int yQ?unsigned len, agg::rgba8& c, int8u cover) 
            ?x, y)开始打横(竖)(j)序混合len长度的像素;
  • copy_solid_hspan(int x, int yQ?unsigned len, agg::rgba8* colors)
    copy_solid_vspan(int x, int yQ?unsigned len, agg::rgba8* colors)
    blend_solid_hspan(int x, int yQ?unsigned len, agg::rgba8* colors, int8u* cover, int8u cover)
    blend_solid_vspan(int x, int yQ?unsigned len, agg::rgba8* colors, int8u* cover, int8u cover)
            同上两个Q不q不是一个颜Ԍ是一pd的颜Ԍ
  • for_each_pixel(void (*f)(agg::rgba8* color))
            每一像素执行一遍fQ?/li>
  • copy_from(agg::rendering_buffer & from, int xdst, int ydst, int xsrc, int ysrc, unsigned len)
    blend_from(agg::rendering_buffer & from, int xdst, int ydst, int xsrc, int ysrc, unsigned len[, unsigned cover])  
            从缓存form?xsrc, ysrc)序复制Q؜合)(j)到当前缓存的(xdst, ydst)中;
【其他函数和像素格式p靠大家的举一反三Q触cL通了(jin)……?/div>

五、结?/h3>
上面说的三者关pLQ؜合器混合RGBA四个通道Q像素格式؜合器混合像素Q像素格式؜合器操作的结果是使渲染缓存里的数据发生变化,而؜合器则不?x),因?f)它的作用仅仅是表C颜艌Ӏ?/div>

Shihira 2012-07-24 16:29 发表评论
]]>AGG入门Q三Q?- 渲染器介l?/title><link>http://www.shnenglu.com/Shihira/archive/2012/07/24/183117.html</link><dc:creator>Shihira</dc:creator><author>Shihira</author><pubDate>Tue, 24 Jul 2012 08:28:00 GMT</pubDate><guid>http://www.shnenglu.com/Shihira/archive/2012/07/24/183117.html</guid><wfw:comment>http://www.shnenglu.com/Shihira/comments/183117.html</wfw:comment><comments>http://www.shnenglu.com/Shihira/archive/2012/07/24/183117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Shihira/comments/commentRss/183117.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Shihira/services/trackbacks/183117.html</trackback:ping><description><![CDATA[<h3>一、看回AGG入门Q二Q时on_draw()虚函数里的代码:(x)</h3> <div> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->        agg::rendering_buffer &rbuf = rbuf_window();<br />         agg::pixfmt_rgb24 pixf(rbuf);<br /> <br />         agg::renderer_base<agg::pixfmt_rgb24> renb(pixf);<br />         renb.clear(agg::rgba8(255, 255, 255));<br /> <br />         pixf.copy_pixel(20, 20, agg::rgba8(0, 0, 255));</div> </div> <div></div> <h3>二、渲染器</h3> <h4>什么是渲染Q?/h4> <div>渲染是把内存中的l图指o(h)真正执行的过E。比如说Q绘制一条线D,在内存里只会(x)保存着两个端点的坐标和U段的宽度,而渲染就把这两个端点转换Z图、缓存甚xC屏上的一个个像素的数据。又比如_(d)URZ面肯定是要有投媄(jing)的了(jin)Q但q个投媄(jing)的质量,q渲染器决定;U段是走L(fng)QAQ,q是反走L(fng)QBQ,靠的是渲染器的指o(h)?jin)?br /> <img src="http://www.shnenglu.com/images/cppblog_com/shihira/20120713-1.png" border="0" alt="" width="392" height="193" /><br /> <img src="http://www.shnenglu.com/images/cppblog_com/shihira/20120713-2.png" border="0" alt="" width="460" height="193" /></div> <h4>AGG里的渲染?/h4> <div>AGG分有多种渲染器。在AGG中,渲染器负责表现扫描线中的每个U段。在渲染器之前,AGG囑Ş中的U段是没有颜色值的Q只是位|、长度和 覆盖率(透明度)(j)。渲染器赋于U段色彩Q最l成Zq完整的囑փ。其中最常用的是Q?/div> <div> <ul> <li>像素格式渲染?/li> <li>基础渲染?/li> <li>扫描U(反锯齿)(j)渲染?/li> </ul> </div> <div></div> <h3>三、三U渲染器间的关系</h3> <div> <ul> <li>像素格式渲染器(PixelFormat RendererQ是最基础的渲染器Q不需要Q何其他渲染器的支持,所以可以直接声明;</li> <li>基础渲染器(Base RendererQ是中渲染器,需要像素格式作为模版和像素格式渲染器的支持;</li> <li>扫描U渲染器QScanline RendererQ是高渲染器,需要基渲染器作为模版和支持;</li> </ul> </div> <div>Q注Q模版主要是Z(jin)获取像素格式的信息)(j)</div> <div></div> <blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"> <div>所以,除像素格式渲染器声明为:(x)<br /> <span style="color: #008000; ">agg::class object(agg::rendering_buffer &);</span><br />之外其他的渲染器都声明ؓ(f)Q?/div><div> <span style="color: #008000; ">agg::class<template> object(template &);</span></div> </blockquote> <div></div><img src ="http://www.shnenglu.com/Shihira/aggbug/183117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Shihira/" target="_blank">Shihira</a> 2012-07-24 16:28 <a href="http://www.shnenglu.com/Shihira/archive/2012/07/24/183117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.hearingaids.net.cn" target="_blank">ҹþþӰԺ</a>| <a href="http://www.nanning315.cn" target="_blank">99þóĻ </a>| <a href="http://www.chezhuangbao.cn" target="_blank">7777þĻ</a>| <a href="http://www.aurp.cn" target="_blank">ƷƷھþø </a>| <a href="http://www.5icsw.cn" target="_blank">һþaþþƷvrۺ</a>| <a href="http://www.auto-insurance.cn" target="_blank">þþþһƷɫav </a>| <a href="http://www.sehinix.cn" target="_blank">ھƷþþþӰԺ</a>| <a href="http://www.z718.cn" target="_blank">߳߳þþ91</a>| <a href="http://www.minghuzisha.cn" target="_blank">þһ</a>| <a href="http://www.3hiis.cn" target="_blank">re99þ6Ʒ</a>| <a href="http://www.bolezi333.cn" target="_blank">ƷһþþƷ</a>| <a href="http://www.mirbase.cn" target="_blank">þùVһë</a>| <a href="http://www.mengyun868.cn" target="_blank">޾ƷþþӰԺӰƬ</a>| <a href="http://www.dogff.cn" target="_blank">Ļ˾Ʒþò</a>| <a href="http://www.wendalaw.com.cn" target="_blank">޾ƷҹVAþó</a>| <a href="http://www.fpim.cn" target="_blank">99þþƷѹۿ</a>| <a href="http://www.cz27b1.cn" target="_blank">þþƷɫ鶹</a>| <a href="http://www.tgbnews.cn" target="_blank">AAƬѿƵþ</a>| <a href="http://www.gloven.cn" target="_blank">þþƷ鶹ҹҹ</a>| <a href="http://www.4000300252.cn" target="_blank">þһѲ</a>| <a href="http://www.qeckf.cn" target="_blank">ܻƺ۵վþmimiɫ</a>| <a href="http://www.pb-wines.cn" target="_blank">þAvԴվ</a>| <a href="http://www.noahmachine.com.cn" target="_blank">ŷ龫Ʒþþþþþ</a>| <a href="http://www.x6844.cn" target="_blank">Ʒþþþþþ</a>| <a href="http://www.gg4493.cn" target="_blank">þ޴ɫĻþþ </a>| <a href="http://www.emitel.cn" target="_blank">99þþùƷ޿</a>| <a href="http://www.hzskc.cn" target="_blank">þùɫavѿ</a>| <a href="http://www.94byq.cn" target="_blank">˾ҹվھƷþþþþþþ</a>| <a href="http://www.42856.com.cn" target="_blank">þþƷAV</a>| <a href="http://www.liangfang013.cn" target="_blank">2021ƷþþƷ</a>| <a href="http://www.kovnxs.cn" target="_blank">þ̳</a>| <a href="http://www.sdhaomai.cn" target="_blank">ھƷþþþþþӰ鶹 </a>| <a href="http://www.damingxing.cn" target="_blank">޹һ˾þþƷ</a>| <a href="http://www.shenghuigd.com.cn" target="_blank">ٸƷþ</a>| <a href="http://www.gta567.cn" target="_blank">þֻоƷƵ99</a>| <a href="http://www.ypiu.cn" target="_blank">þù㽶һƷ</a>| <a href="http://www.damangdao.cn" target="_blank">Ӱһþҹײ </a>| <a href="http://www.ads9.cn" target="_blank">þù޾Ʒ</a>| <a href="http://www.mxklj.cn" target="_blank">þþ뾫ƷպĦ</a>| <a href="http://www.fiyhigh.com.cn" target="_blank">ھƷþþӰԺ </a>| <a href="http://www.antsgogo.cn" target="_blank">ģ˽ĹƷþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>