y’
+∞
Ax
+∞
M
P S
x
i
x
i
+1
y
i
+1
y
i
Q
|
Thuật toán vẽ Hyperbol – = 1 (A < B)
B1: Thu hẹp vùng vẽ
Vẽ cung ở góc phần tư thứ I rồi lấy đối xứng qua trục tung, trục hoành,
gốc toạ độ được các phần còn lại
B2: Phân vùng vẽ.
Xét cung ở góc phần tư thứ I có phương trình
y =
A ≤ x
y’ = → y’ > 1
Suy ra có 1 vùng vẽ:
Vùng vẽ 1: A ≤ x; ứng với y’>1
B 3.1 Vẽ vùng 1
Đặt F(x,y) = B
2
x
2
– A
2
y
2
– A
2
B
2
Biết M
i
(x
i
,y
i
)
Xác định M
i+1
(x
i+1
,y
i+1
)
x
i+1
Є { x
i
, x
i
+ 1}
y
i+1
= y
i
+ 1
Nhật xét : x tăng chậm
y tăng đều
Gọi M là trung điểm của SP
M
i
(x
i
+ 1/2 , y
i
+ 1)
Đặt P
i
= 4 F(x,y)
P
i
= 4 [B
2
(x
i
+ 1/2)
2
– A
2
(y
i
+ 1)
2
– A
2
B
2
] (1)
P
i+1
= 4 [B
2
(x
i+1
+ 1/2)
2
– A
2
(y
i+1
+ 1)
2
– A
2
B
2
]
Xét hiệu
P
i+1
– P
i
= 4 [B
2
(x
i+1
+ 1/2)
2
– A
2
(y
i+1
+ 1)
2
– A
2
B
2
]
– 4 [B
2
(x
i
+ 1/2)
2
– A
2
(y
i
+ 1)
2
– A
2
B
2
]
= 4 [B
2
(x
i+1
+ 1/2)
2
– A
2
(y
i
+ 2)
2
– A
2
B
2
]
– 4 [B
2
(x
i
+ 1/2)
2
– A
2
(y
i
+ 1)
2
– A
2
B
2
]
= 4 [B
2
((x
i+1
)
2
+ x
i+1
– (x
i
)
2
– x
i
) – A
2
(2y
i
+ 3)] (2)
Biện luận theo dấu của P
i
*Nếu P
i
< 0 → F(x,y) < 0 → M nằm ngoài (H) → điểm Q gần điểm S
Chọn điểm S để vẽ: Khi đó x
i +1
= x
i
+ 1
Thay vào (2) ta được
P
i+1
– P
i
= 4 [B
2
((x
i
+1)
2
+ (x
i
+1)
– (x
i
)
2
– x
i
) – A
2
(2y
i
+ 3)]
= 4 [B
2
(2x
i
+ 2) – A
2
(2y
i
+ 3)]
P
i+1
= P
i
+ 8 B
2
x
i
+ 8 B
2
– 8A
2
y
i
– 12A
2
(3)
*Nếu P
i
≥ 0 → F(x,y) ≥ 0 → M nằm trong (H) → điểm Q gần điểm P
Chọn điểm P để vẽ: Khi đó x
i +1
= x
i
Thay vào (2) ta được
P
i+1
- P
i
= 4[B
2
((x
i
)
2
+ x
i
– (x
i
)
2
– x
i
) – A
2
(2y
i
+ 3)]
= 4[– A
2
(2y
i
+ 3)]
P
i+1
= P
i
– 8A
2
y
i
– 8A
2
(4)
Tính P
0
ứng với điểm ban đầu M
0
(A,0)
P
0
= 4 [B
2
(A + 1/2)
2
– A
2
(0 + 1)
2
– A
2
B
2
]
= 4AB
2
– 4A + B
2
BEGIN
p=p+8B
2
x – 8A
2
y+8B
2
– 12A
2
;
x=x+1;
(A
2
-B
2
) x
2
< A
4
p = 4A
2
B - 4 A + B
2
x = A; y = 0;
Put4pixel(x,y,color);
p < 0
p=p - 8A
2
y - 12A
2
;
y = y + 1;
Put4pixel(x,y,color);
No
No
END
Yes
Yes
LƯU ĐỒ HYPERBOL
2
Thuật toán vẽ Hyperbol
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
void InitGraph()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error : %s\n", grapherrormsg(errorcode));
getch();
exit(1);
}
}
void put4pixel(int x, int y)
{
int a,b;
a = getmaxx()/2;
b = getmaxy()/2;
putpixel(x + a, y + b, 12);
putpixel(-x + a, y + b, 5);
putpixel(x + a, -y + b, 4);
putpixel(-x + a, -y + b,11);
delay(20);
}
void Hyperbol()
{
float a=70, b=60,p;
float x,y;
x=a;y=0;
put4pixel(x,y);
p=4*a*b*b+b*b-a*a;
while((a*a-b*b)*x*x<a*a*a*a & y<200)
{
if(p<0)
{
p+=8*b*b*x-8*a*a*y+8*b*b-12*a*a;
x++;
}
else
p=p-8*a*a*y-12*a*a;
y++;
put4pixel((int)x,(int)y);
}
void main()
{
InitGraph();
Hyperbol();
getch() ;
closegraph();
}
3