目标
函数图像:双曲线 ,即 .
作图方法:中点Bresenham算法
分析
曲线 关于 轴, 轴对称,因此只需考虑第一象限内的情况。同时,由于存在渐近线 和 , 因此 ,是该曲线第一象限内最大位移方向。
方向每走一步, 方向 或不变
中点M的坐标,代入中,
- 若,表示M在双曲线右侧,;
- 若,表示M在双曲线左侧,;
则误差
误差递推:
时:
时:
代码
python
import matplotlib.pyplot as plt
import numpy as np
def quater_hyperbola(X,Y,k,num):
"""
用于画x^2-y^2=k^2双曲线的第一象限
"""
#初始化x,y,d0
x,y,d=k,0,k-0.75
for i in range(1,num+1):
#递推误差d
if(d>0):
d=d-2*y-3
else:
d=d+2*(x-y)-1
#y前进一步
y=y+1
#判断x是够前进
if(d>0):
x=x
else:
x=x+1
#坐标加入列表中
X=np.append(X,x)
Y=np.append(Y,y)
return (X,Y)
def draw_hyperbola(k,num):
"""
画曲线x^2-y^2=k^2
num控制x的范围
"""
X=np.array([],dtype=int)
Y=np.array([],dtype=int)
#获取第一象限的坐标
(X,Y)=quater_hyperbola(X,Y,k,num)
#获取其他三个象限的坐标
X=np.append(X,np.negative(X))
Y=np.append(Y,Y)
X=np.append(X,X)
Y=np.append(Y,np.negative(Y))
X=np.append(X,np.negative(X))
Y=np.append(Y,np.negative(Y))
# print(X,Y)
#原曲线
x0 = np.arange(-1*num, num)
y0 = []
y1=[]
for t in x0:
y_1 = np.sqrt(t*t-k*k)
y0.append(y_1)
for t in x0:
y_1 = -1*np.sqrt(t*t-k*k)
y1.append(y_1)
plt.plot(x0,y0,c="red")
plt.plot(x0,y1,c="red")
#画出散点图
plt.scatter(X,Y)
plt.title("x^2-y^2={}^2".format(k)) # 设置标题
#设置坐标轴
ax = plt.gca()
ax.spines['right'].set_color('none') # 设置颜色为none ,就看不见了
ax.spines['top'].set_color('none')
# 移动x轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
# 移动y轴
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
plt.show()
draw_hyperbola(20,40)