<h2> <strong></strong>项目描述: </h2> <h2> 在窗口客户区内按下鼠标左键选择直线的起点,移动鼠标指针到直线终点,弹起鼠标左键绘制任意斜率的直线段。 </h2> <p> <br /> </p> <p> <br /> </p> <p> <img src="/files/uploads/image/201808/c8c4f22d5111.png" alt="" /> </p> <p> <br /> </p> <h2> 知识点: </h2> <h2> <ul> <li> 斜率0≤k≤1直线的中点Bresenham算法。 </li> </ul> <ul> <li> 任意斜率直线段绘制算法。 </li> </ul> <ul> <li> 颜色类的定义与调用方法。 </li> </ul> <ul> <li> 直线类的定义与调用方法。 </li> </ul> <ul> <li> 鼠标按键消息映射方法。 </li> </ul> </h2> <h2> 原理算法: </h2> <h3> <ol> <li> MFC提供的CDC类的成员函数MoveTo()和LineTo()函数用于绘制任意斜率的直线段,直线段的颜色由所选用的画笔指定。 <ul> <li> MoveTo()函数移动当前点到参数(x,y)所指定的点,不画线; </li> <li> LineTo()函数从当前点画一直线段到参数(x,y)所指定的点,但不包括(x,y)点。 <pre class="prettyprint linenums lang-c">d=0.5-k; for(p=P0;p.x<P1.x;p.x++) { pDC->SetPixelV(Round(p.x),Round(p.y), RGB(clr.red*255,clr.green*255,clr.blue*255)); if(d<0) { p.y++; d+=1-k; } else d-=k; } }</pre> </li> </ul> </li> <li> 定义CLine类来模拟CDC类绘制任意斜率的直线段,同样提供MoveTo()和LineTo()成员函数。 </li> </ol> </h3> <p> <br /> </p> <h3> <ul> <ul> <li> 本案例绘制的是任意斜率的直线段,需要根据直线段的斜率k,将除垂线(k=±∞)外的直线段划分为k>1、0≤k≤1、-1≤k<0和k<-1四种情况。 </li> <li> 当0≤k≤1时或-1≤k<0时,x方向为主位移方向; </li> <li> 当k>1时或k<-1时,y方向为主位移方向。对于|k|=∞的垂线,可以直接画出。 </li> </ul> </ul> </h3> <pre class="prettyprint linenums lang-c">class CLine { public: CLine(); virtual ~CLine(); void MoveTo(CDC *,CP2); //移动到指定位置 void MoveTo(CDC *,double,double); void LineTo(CDC *,CP2); //绘制直线,不含终点 void LineTo(CDC *,double,double); public: CP2 P0;//起点 CP2 P1;//终点 }; </pre> <p> <br /> </p> <br /> <p> <br /> </p> <p> </p>
cwyabEIJH