bresenham算法在计算机绘图时十分常用,其原理在网上都能找到,这里就不做赘述啦,很多小伙伴在网上找能在Visual Sudio MFC环境下实现的代码,总是遇到各种问题,不能正常运行,这里直接上能在VS上实现代码(亲测有效)。
CDC * pDC = this->GetDC(); int dx, dy, x, y; int increment; bool if_xy_swap = false; if (abs(x1 - x0) < abs(y1 - y0)) { if_xy_swap = true; swap(&x0, &y0); swap(&x1, &y1); } if (x0 > x1) { swap(&x0, &x1); swap(&y0, &y1); } increment = y0 < y1 ? 1 : -1; dx = x1 - x0; dy = y1 - y0; int h = abs(2 * dy) - dx; if (if_xy_swap) pDC->SetPixel(y0, x0, RGB(255, 0, 0)); else pDC->SetPixel(x0, y0, RGB(255, 0, 0)); x = x0; y = y0; while (x < x1) { if (h > 0) { h += abs(2 * dy) - 2 * dx; y += increment; if_xy_swap ? pDC->SetPixel(y, x, RGB(255, 0, 0)) : pDC->SetPixel(x, y, RGB(255, 0, 0)); } else { h += abs(2 * dy); if_xy_swap ? pDC->SetPixel(y, x, RGB(255, 0, 0)) : pDC->SetPixel(x, y, RGB(255, 0, 0)); } x++; }
大家可以去执行下,应该是能成功实现(除了垂直的直线——代码较简单,没写在里面了)。
注意:x0,y0,x1,y1分别是所画的直线两点的坐标,值在MFC对话框中传入。
------------------------------------------------------------------------
(在下写博客,是记下平时学习程中常遇到的问题,代码中若有不合理之处,还望各位大佬指正)