void Ctest1View::OnDraw(CDC* pDC) { Ctest1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CPoint p; int y1 = p1.y; int y2 = p2.y; int x2 = p2.x; int x1 = p1.x; double d=0; double k = 0; k = double((y1-y2)/(x1-x2)); if ((k <= 1) && (k >= 0)) { d = 0.5 - k; for (p = p1; p.x < p2.x; p.x++) { pDC->SetPixel(x1, y1, RGB(3, 6, 8)); if (d < 0) { p.y++; d += 1 - k; } else d -= k; } } }用bremenham算法完善以上编程实现画直线功能
时间: 2024-03-24 13:35:38 浏览: 110
ctest-gtest:CTest与Google Test
下面是使用中点Bresenham算法实现画直线功能的代码:
```cpp
void Ctest1View::OnDraw(CDC* pDC)
{
Ctest1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CPoint p;
int y1 = p1.y;
int y2 = p2.y;
int x2 = p2.x;
int x1 = p1.x;
double k = 0;
k = double((y1 - y2) / (x1 - x2));
if ((k <= 1) && (k >= -1)) //绝对值小于等于1时
{
int dx = x2 - x1;
int dy = y2 - y1;
int yi = 1;
if (dy < 0) {
yi = -1;
dy = -dy;
}
int D = 2 * dy - dx;
int y = y1;
for (int x = x1; x <= x2; x++)
{
pDC->SetPixel(x, y, RGB(3, 6, 8));
if (D > 0) {
y += yi;
D -= 2 * dx;
}
D += 2 * dy;
}
}
else //绝对值大于1时
{
int dx = x2 - x1;
int dy = y2 - y1;
int xi = 1;
if (dx < 0) {
xi = -1;
dx = -dx;
}
int D = 2 * dx - dy;
int x = x1;
for (int y = y1; y <= y2; y++)
{
pDC->SetPixel(x, y, RGB(3, 6, 8));
if (D > 0) {
x += xi;
D -= 2 * dy;
}
D += 2 * dx;
}
}
}
```
在这个代码中,我们使用了中点Bresenham算法来绘制直线段。在绝对值小于等于1时,使用水平方向为主的扫描方式,如果斜率为正,则从左到右扫描;如果斜率为负,则从右到左扫描。在绝对值大于1时,使用垂直方向为主的扫描方式,如果斜率为正,则从上到下扫描;如果斜率为负,则从下到上扫描。
我们使用了CDC类的SetPixel函数来绘制像素点。使用RGB(3, 6, 8)来设置像素点的颜色。
阅读全文