PDA

View Full Version : hỏi về thuật toán vẽ hyperbol



dieu
10-11-2004, 18:17
cho hỏi thuật toán vẽ Hyperbol bằng c++ (neu có source càng tốt!!!)
cám ơn nhiều

bete
11-11-2004, 07:53
Thân gửi dieu: giả sử bạn biết cách vẽ 1 điểm rồi nghen. Và lấy ví dụ mình đang muốn vẽ hyperbol y = 1/x . Có thể thử làm như sau: cho x chạy từ xRealMin đến xRealMax, với mỗi giá trị của x => tính giá trị tương ứng của y, vẽ điểm (x,y)

Vài điểm cần lưu ý:

1) thông thường: tọa độ (0,0) là góc trên bên trái của màn hình: giá trị x (hoành độ) tăng dần từ trái qua phải, còn giá trị y (tung độ) tăng dần từ trên xuống dưới => mình sẽ thấy hình bị nhỏ/lớn + thiếu và bị lật ngược (trên <--> dưới) => cần lật theo tung độ (đảo dấu) rồi phóng đại/thu nhỏ rồi tịnh tiến (tính tọa độ lớn nhất của màn hình theo cả 2 trục dọc/ngang)

2) Trên đồ thị, những chỗ y tăng chậm hơn x thì nhìn còn được, những chỗ y tăng nhanh hơn x nhiều thì có thể thấy không đẹp (răng cưa) => có thể đảo lại vẽ x theo y (cho y => tính x) (để ý những chỗ mà tiếp tuyến của đồ thị hợp thành 1 góc 45 độ với trục hoành)

3) y = 1/x có tiệm cận đứng tại x = 0 => tính y tại x=0 (hoặc lân cận) có thể sẽ bị lỗi (y quá lớn => tràn số).
Có thể giới hạn giá trị tuyệt đối của y (< yMaxAbs) => giới hạn được giá trị tuyệt đối của x (> xMinAbs = 1/yMaxAbs). Ở những chỗ |x|<xMinAbs thì bỏ qua (không vẽ điểm)

Xin lỗi là tui không có mã nguồn; hơn nữa tui nghĩ viết lấy (coi vậy chứ không khó lắm đâu) thì sẽ học được nhiều hơn là coi mã viết sẵn (trừ khi bí quá thì hỏi 1 vài chỗ kẹt thôi)

(có gì sai sót xin các bạn chỉ giùm, cám ơn rất nhiều)

-thân

whitepenguin
11-11-2004, 20:27
BÁc diêu gì ơi ,khi bác vẽ Hyperbol đóa ,các bước để intalize các điểm như bác đã biết do pete chĩ tui còn giúp bác thêm một số chuyện khi vẽ Hyberpol là bác nên vẽ Hyperbol bằng cách lưu các điễm đã tính vào một cái array of Point với Point {float x,y}
vào nhớ các điểm này khi lưu vào cái array đó là đã được Phóng đại lên rồi,tại vì bác làm việc theo số thực ,mà máy tính thì đâu thể vẽ các tọa độ thực đâu ,nên bác nên phóng đại các điểm đó rồi nối lần lượt các điễm đó với nhau bằng vẽ Line ,số điểm trên Hyperbol bác tính càng nhiều thì đường Hyber càng Mịn và không bị giống như gấp khúc,nhưng như Pete nói nó vẩn sẽ có răng cưa(aliasing) ,chuyên khắc phục răng cưa này lại là một vấn đề khác nên Penguin không nói ra đây

thailehuy
12-11-2004, 12:15
Hì hì, vẽ line kiểu đó có hơi lâu, nhưng được cái đỡ mệt cho mình. Vẽ Hyperbol chỉ có 1 vấn đề khi x -> 0 và x -> vô cực, có cách nào giải quyết hiệu quả không ?

whitepenguin
12-11-2004, 22:21
To Le huy: Thế theo bác thì vẽ bằng cái gì thì nhanh đây !!:D đừng nói là putpixel nhá
bác mà putpixel cái Hyber cứ giống như cái hình bị đứt khúc vậy ,nói thiệt với bác nhá kể cả đường cong bspline và các mặt cong bspline cùng do các đoạn line đó nối thành đó,trong đồ họa máy tính chỉ có thể dùng các đoạn line thiệt nhỏ để biểu diễn các mô hình phức tạp ,theo Peguin nghĩ thì duy nhất chỉ có cách này !!!!,chứ nếu put pixel thì cái hình nó hông liên lục ,ngoại trừ trường hợp các điễm trên mô hình quá là sát nhau

thailehuy
17-11-2004, 15:20
Thì mình cũng không phản đối chuỵên nối lines, nhưng làm trong java thì cái line nó xấu òm à.
Còn nữa, về chuyện khi mẫu số -> 0 và mẫu số -> vô cực thì mình vẫn chưa biết nên chọn biến sát cỡ nào là vừa đẹp

bete
18-11-2004, 09:25
thân gửi thailehuy

Còn nữa, về chuyện khi mẫu số -> 0 và mẫu số -> vô cực thì mình vẫn chưa biết nên chọn biến sát cỡ nào là vừa đẹp

Mình có min, max của tọa độ màn hình
=> tính ngược ra min, max của tọa độ thực
=> giới hạn trị tuyệt đối

(có gì sai sót xin các bạn chỉ giúp, cám ơn rất nhiều)

-thân