Skip to content

「计算机图形学」用中点Bresenham算法画简单的双曲线,python实现

Published at:

目标

函数图像:双曲线 ,即 .

作图方法:中点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)

结果