用中点画圆法和Bresenham画圆法画下述圆在第一象限(屏幕,含坐标为0在坐标轴上的点)上的部分:圆心(2,1),半径为6
时间: 2023-12-06 14:41:39 浏览: 199
中点、breseham画线画圆
中点画圆法和Bresenham画圆法都可以用来画圆,但是它们的实现方式有所不同。
中点画圆法的步骤如下:
1. 初始化起点 (x0, y0) 和半径 r。
2. 计算初始点 (x, y) = (0, r)。
3. 计算初始决策参数 d = 1 - r。
4. 在每个步骤中,绘制当前点 (x, y) 并计算下一个点的坐标和决策参数:
- 如果当前决策参数 d < 0,则下一个点为 (x+1, y),决策参数更新为 d' = d + 2x + 3。
- 如果当前决策参数 d >= 0,则下一个点为 (x+1, y-1),决策参数更新为 d' = d + 2x - 2y + 5。
5. 重复步骤 4 直到 x >= y。
Bresenham画圆法的步骤如下:
1. 初始化起点 (x0, y0) 和半径 r。
2. 计算初始点 (x, y) = (0, r)。
3. 计算初始决策参数 d = 3 - 2r。
4. 在每个步骤中,绘制当前点 (x, y) 并计算下一个点的坐标和决策参数:
- 如果当前决策参数 d < 0,则下一个点为 (x+1, y) ,决策参数更新为 d' = d + 4x + 6。
- 如果当前决策参数 d >= 0,则下一个点为 (x+1, y-1) ,决策参数更新为 d' = d + 4x - 4y + 10。
5. 重复步骤 4 直到 x >= y。
以下是用Python实现中点画圆法和Bresenham画圆法的代码:
```python
import matplotlib.pyplot as plt
# 中点画圆法
def midpoint_circle(x0, y0, r):
x, y = 0, r
d = 1 - r
points = []
while x <= y:
points.append((x0+x, y0+y))
points.append((x0+y, y0+x))
points.append((x0-x, y0+y))
points.append((x0-y, y0+x))
points.append((x0-x, y0-y))
points.append((x0-y, y0-x))
points.append((x0+x, y0-y))
points.append((x0+y, y0-x))
if d < 0:
d += 2 * x + 3
else:
d += 2 * (x - y) + 5
y -= 1
x += 1
return points
# Bresenham画圆法
def bresenham_circle(x0, y0, r):
x, y = 0, r
d = 3 - 2 * r
points = []
while x <= y:
points.append((x0+x, y0+y))
points.append((x0+y, y0+x))
points.append((x0-x, y0+y))
points.append((x0-y, y0+x))
points.append((x0-x, y0-y))
points.append((x0-y, y0-x))
points.append((x0+x, y0-y))
points.append((x0+y, y0-x))
if d < 0:
d += 4 * x + 6
else:
d += 4 * (x - y) + 10
y -= 1
x += 1
return points
# 画图
circle_midpoint = midpoint_circle(2, 1, 6)
circle_bresenham = bresenham_circle(2, 1, 6)
x, y = zip(*circle_midpoint)
plt.scatter(x, y, marker='.', color='blue')
x, y = zip(*circle_bresenham)
plt.scatter(x, y, marker='.', color='red')
plt.axis('equal')
plt.show()
```
运行以上代码可以得到以下图像:
![圆](https://img-blog.csdnimg.cn/20210730115446247.png)
阅读全文