分别用DDA算法和中点Bresenham方法画直线段P1(0,0)-P2(8,6)具体要求: (1) 先根据算法步骤,依次计算出每一步的坐标 (c,y),列出计算步骤和结果表格 (2)写出DDA算法和中点Bresenham算法主函数源程序 (3)分析两种算法的优缺点
时间: 2024-11-15 16:26:45 浏览: 44
DDA(数字差分适应法)和中点Bresenham算法都是用于计算机图形学中绘制离散直线的方法。假设我们要画出从原点(0,0)到点(8,6)的直线。
**1. DDA算法计算步骤:**
由于DDA算法是逐像素步进,我们按以下步骤计算:
- 初始化起点P1(0,0),终点P2(8,6)。
- 计算斜率 m = (y2 - y1) / (x2 - x1) = (6 - 0) / (8 - 0) = 3/4。
- 取整斜率为整数部分 d = floor(m) = floor(3/4) = 0,小数部分 e = m - d = 3/4 - 0 = 0.75。
- 点(x, y)初始化为0。
- 使用循环,每次迭代:
a. 更新x: x += 1;
b. 检查e是否大于等于1:
i. 如果是,更新y: y += d; 将e减去1:e -= 1;
c. 当x >= 8 或者 y >= 6时,停止。
**2. 主函数源程序(简化版)(C++):**
```cpp
#include <iostream>
void drawLine_DDA(int x1, int y1, int x2, int y2) {
int dx = x2 - x1, dy = y2 - y1, steep = abs(dy) > abs(dx);
int x = x1, y = y1, err = steep ? dx : dy << 1;
while (x != x2 || y != y2) {
if (steep) std::cout << "(" << y << ", " << x << ") ";
else std::cout << "(" << x << ", " << y << ") ";
if ((err <= 0) && (x == x2)) err += 2 * dy;
if ((err > 0) && (y == y2)) err += 2 * dx;
x += (err > 0) ? 1 : -1;
y += (err > 0) ? steep ? -1 : 1 : steep ? 1 : -1;
}
}
int main() {
drawLine_DDA(0, 0, 8, 6);
return 0;
}
```
**3. 中点Bresenham算法计算步骤(简化):**
- 直线倾斜角 θ = arctan(dy/dx)
- 首先取两个连续整数点作为中点,然后判断中点是否在目标线上。
- 继续找到下一个中点,直到达到目标点或超过。
**4. 主函数源程序(简化版)(C++):**
```cpp
#include <iostream>
#include <cmath>
void drawLine_Bresenham(int x1, int y1, int x2, int y2) {
int dx = x2 - x1, dy = y2 - y1, err = abs(dx) - abs(dy);
for (int x = x1, y = y1; x != x2 && y != y2; ++x) {
// Bresenham's algorithm
std::cout << "(" << x << ", " << y << ") ";
if (err <= 0) {
++y;
err += 2 * dy;
} else {
++x;
err += 2 * (-dy);
}
}
}
int main() {
drawLine_Bresenham(0, 0, 8, 6);
return 0;
}
```
**优点和缺点分析:**
- **DDA算法**:简单易理解,不需要计算角度,适合初学者。但精度较差,不适合长直线,因为步长可能会导致锯齿状。
- **中点Bresenham算法**:计算更精确,生成的线条无锯齿。但由于涉及角度计算,代码相对复杂。它适用于需要高精度直线的情况,但对于短直线,两者效果相近。
阅读全文