Loading... ## 目标 函数图像:双曲线$x^2-y^2=k^2$ ,即 $F(x,y)=x^2-y^2-k^2$ . 作图方法:中点Bresenham算法 ## 分析 曲线$x^2-y^2=k^2$ 关于 $x$ 轴,$y$ 轴对称,因此只需考虑第一象限内的情况。同时,由于存在渐近线 $y=x$ 和 $y=-x$ , 因此 $y$ ,是该曲线第一象限内最大位移方向。 <center><img src="https://gallery-of-jafari.oss-cn-beijing.aliyuncs.com/caleb.ink/2022/09/3187400784.png" width="60%"></center> $y$ 方向每走一步, $x$ 方向 $+1$ 或不变 <center><img src="https://gallery-of-jafari.oss-cn-beijing.aliyuncs.com/caleb.ink/2022/09/2851772432.jpeg" width="50%"></center> 中点M的坐标$(x_i+0.5,y_i+1)$,代入$F(X_M,Y_M)$中, - 若$F(x_M,y_M)>0$,表示M在双曲线右侧,$x_{i+1}=x_i$; - 若$F(x_M,y_M)≤0$,表示M在双曲线左侧,$x_{i+1}=x_i+1$; 则误差$di=F(x_i+0.5,y_i+1)=(x_i+0.5)^2-(y_i+1)^2-k^2$ - $di≤0,x_{i+1}=x_i+1;$ - $di>0,x_{i+1}=x_i$ ## 误差递推: $di>0$ 时: $d_{i+1}=F(x_i+0.5,y_i+2)$ $=(x_i+0.5)^2-(y_i+2)^2-k^2$ $=(x_i+0.5)^2-(y_i+1)^2-k^2-2y_i-3$ $=d_i-2y_i-3$ $d_i≤0$ 时: $d_{i+1}=F(x_i+1.5,y_i+2)$ $=(x_i+1.5)^2-(y_i+2)^2-k^2$ $=(x_i+0.5)^2-(y_i+1)^2-k^2-2y_i-3+2x_i+2$ $=d_i+2(x_i-y_i)-1$ $d_0=F(k+0.5,1)=k-0.75$ ## 代码 ```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) ``` ![结果](https://gallery-of-jafari.oss-cn-beijing.aliyuncs.com/caleb.ink/2022/09/3099629087.png) 最后修改:2023 年 11 月 23 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏