📄 chap07.htm
字号:
<p style='line-height:18.0pt'><span> </span> static LOGPEN
rlp={PS_SOLID,1,1,RGB(255,0,0)};</p>
<p style='line-height:18.0pt'><span> </span> HPEN
rhp;</p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>我们处理的实际上是</span><span lang=EN-US>256</span><span
style='font-family:宋体;"Times New Roman"'>级灰度图,不过只用到了</span><span lang=EN-US>0</span><span
style='font-family:宋体;"Times New Roman"'>和</span><span lang=EN-US>255</span><span style='font-family:
宋体;"Times New Roman"'>两种颜色。</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>if( NumColors!=256){ </span></p>
<p style='line-height:18.0pt'><span> </span>MessageBox(hWnd,"Must
be a mono bitmap with grayscale palette!",</p>
<p style='line-height:
18.0pt'><span lang=EN-US>"Error Message",MB_OK|MB_ICONEXCLAMATION);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>return FALSE;</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>}</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>计算最大距离</span></p>
<p style='line-height:18.0pt'><span> </span>Dist=(int)(sqrt((double)bi.biWidth*bi.biWidth+</p>
<p style='line-height:
18.0pt'><span lang=EN-US>(double)bi.biHeight*bi.biHeight)+0.5);</span></p>
<p style='line-height:18.0pt'><span> </span>Alpha=180
/2 ; //0 <span
style='font-family:宋体;"Times New Roman"'>到</span><span lang=EN-US> to 178 </span><span
style='font-family:宋体;"Times New Roman"'>度,步长为</span><span lang=EN-US>2</span><span style='font-family:
宋体;"Times New Roman"'>度</span></p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>为距离角度数组分配内存</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>if((hDistAlpha=GlobalAlloc(GHND,(DWORD)Dist*Alpha*</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>sizeof(int)))==NULL){</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,"Error alloc memory!","Error
Message",</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>return FALSE;</span></p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>为记录直线端点的数组分配内存</span></p>
<p style='line-height:18.0pt'><span> </span> if((hMyLine=GlobalAlloc(GHND,(DWORD)Dist*Alpha*</p>
<p style='line-height:
18.0pt'><span lang=EN-US>sizeof(MYLINE)))==NULL){</span></p>
<p style='line-height:18.0pt'><span> </span>
GlobalFree(hDistAlpha);</p>
<p style='line-height:18.0pt'><span> </span>
return FALSE;</p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span>OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);</p>
<p style='line-height:18.0pt'><span
lang=EN-US>//BufSize</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>为缓冲区大小</span></p>
<p style='line-height:18.0pt'><span> </span>BufSize=OffBits+bi.biHeight*LineBytes;</p>
<p style='line-height:18.0pt'><span> </span> lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);</p>
<p style='line-height:18.0pt'><span> </span> lpDistAlpha=(int
*)GlobalLock(hDistAlpha);</p>
<p style='line-height:18.0pt'><span> </span>lpMyLine=(MYLINE
*)GlobalLock(hMyLine);</p>
<p style='line-height:18.0pt'><span
lang=EN-US>for (i=0;i<(long)Dist*Alpha;i++){</span></p>
<p style='line-height:18.0pt'><span>
</span>TempLine=(MYLINE*)(lpMyLine+i);</p>
<p style='line-height:18.0pt'><span>
</span>(*TempLine).boty=32767; //<span style='font-family:宋体;
"Times New Roman"'>初始化最低点的</span><span lang=EN-US>y</span><span
style='font-family:宋体;"Times New Roman"'>坐标为一个很大的值</span></p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span>for
(y=0;y<bi.biHeight;y++){</p>
<p style='line-height:18.0pt'><span>
</span>//lpPtr<span
style='font-family:宋体;"Times New Roman"'>指向位图数据</span></p>
<p style='line-height:18.0pt'><span>
</span>lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);</p>
<p style='line-height:18.0pt'><span>
</span>for (x=0;x<bi.biWidth;x++)</p>
<p style='line-height:18.0pt'><span>
</span>if(*(lpPtr++)==0) //<span style='font-family:宋体;
"Times New Roman"'>是个黑点</span></p>
<p style='line-height:18.0pt'><span>
</span>for (k=0;k<180;k+=2){</p>
<p style='line-height:18.0pt'><span>
</span>//<span
style='font-family:宋体;"Times New Roman"'>计算距离</span><span lang=EN-US>i</span></p>
<p style='line-height:18.0pt'><span> </span>
i=(long)fabs((x*cos(k*PI/180.0)+y*sin(k*PI/180.0)));</p>
<p style='line-height:18.0pt'><span>
</span>//<span
style='font-family:宋体;"Times New Roman"'>相应的数组元素加</span><span lang=EN-US>1</span></p>
<p style='line-height:18.0pt'><span>
</span> *(lpDistAlpha+i*Alpha+k/2)=*(lpDistAlpha+i*Alpha+k/2)+1;</p>
<p style='line-height:18.0pt'><span>
</span>TempLine=(MYLINE*)(lpMyLine+i*Alpha+k/2);</p>
<p style='line-height:18.0pt'><span>
</span>if(y> (*TempLine).topy){</p>
<p style='line-height:18.0pt'><span>
</span>//<span
style='font-family:宋体;"Times New Roman"'>记录该直线最高点的</span><span lang=EN-US>x,y</span><span
style='font-family:宋体;"Times New Roman"'>坐标</span></p>
<p style='line-height:18.0pt'><span>
</span>(*TempLine).topx=x;</p>
<p style='line-height:18.0pt'><span>
</span>(*TempLine).topy=y;</p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span>
</span>if(y< (*TempLine).boty){</p>
<p style='line-height:18.0pt'><span>
</span>//<span
style='font-family:宋体;"Times New Roman"'>记录该直线最低点的</span><span lang=EN-US>x,y</span><span
style='font-family:宋体;"Times New Roman"'>坐标</span></p>
<p style='line-height:18.0pt'><span>
</span>(*TempLine).botx=x;</p>
<p style='line-height:18.0pt'><span>
</span>(*TempLine).boty=y;</p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span
lang=EN-US>}</span></p>
<p style='line-height:18.0pt'><span> </span>maxd=0;</p>
<p style='line-height:18.0pt'><span> </span>for
(i=0;i<(long)Dist*Alpha;i++){</p>
<p style='line-height:18.0pt'><span>
</span>TempLine=(MYLINE*)(lpMyLine+i);</p>
<p style='line-height:18.0pt'><span>
</span>k=*(lpDistAlpha+i);</p>
<p style='line-height:18.0pt'><span>
</span>if(k > maxd){</p>
<p style='line-height:18.0pt'><span>
</span>//<span
style='font-family:宋体;"Times New Roman"'>找到数组元素中最大的,及相应的直线端点</span></p>
<p style='line-height:18.0pt'><span>
</span>maxd=k;</p>
<p style='line-height:18.0pt'><span>
</span>MaxdLine.topx=(*TempLine).topx;</p>
<p style='line-height:18.0pt'><span>
</span>MaxdLine.topy=(*TempLine).topy;</p>
<p style='line-height:18.0pt'><span>
</span>MaxdLine.botx=(*TempLine).botx;</p>
<p style='line-height:18.0pt'><span>
</span>MaxdLine.boty=(*TempLine).boty;</p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span>hDc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -