01/10/2018, 14:10
Khống chế giá trị nhỏ nhất của hàm sin
Trong đồ họa để làm hoạt hình phóng to thu nhỏ ta có thể làm kỹ thuật sau
var count=0;
function play(delta) {
//msg(delta)
cat.rotation += 1 * Math.PI / 180;//Vừa phóng to vừa xoay tròn
count += 0.005;//Thay đổi tốc độ biến hình ở đây
cat.scale.x = 1+Math.sin(count);//Phóng gấp đôi hìn cũ
cat.scale.y = 1+Math.sin(count);
Giá trị của hàm sin này nằm trong miền
[-2,+2]
Có cách nào đưa giá trị count vào để hàm có giá trị trong miền [1,2] không?
Bài liên quan
Hi Thuc Nguyen Tan.
Tức là bạn phóng to xong lại thu nhỏ à?
uh, làm như trên nó có một giai đoạn biến mất (giá trị âm)
Hi Thuc Nguyen Tan.
Nên rescale (bằng số) cái
cat.rotation
vì nó đã sẵn độ rồi.Cái đó để đổi ra radian thôi bạn, cũng là số đấy nếu cat.rotation=1, thì nó không quay, góc của nó luôn bằng 1
ý lộn, hàm y=1 + sin(count) --> miền giá trị là : [-2,2]
Hi Thuc Nguyen Tan.
uh, okey, cám ơn nhé,
hàm y= 1 + sin(x) có miền giá trị là [0,2]
hì cám ơn.
Kể ra kiến thức về toán khá là hữu ích trong lập trình nhệ.
Thế bi giờ mình muốn miền giá trị nó là [0.5 , 2] thì làm thế nào?
(Co lại một nữa và phóng to gấp đôi)
y max = 2 khi x = 90 độ ~~ Rad= 90 * 3.14 / 180
y mix =0.5 khi x= -30 độ ~~ Rad= - 30 * 3.14 / 180
==> -0.52 < x < 1.57
Lý luận thế đúng không nhỉ?
Lấy (min + max) / 2 được giá trị trung tâm.
Ví dụ [0.5,2] thì trung tâm là 1.25.
Từ giá trị trung tâm tính đến max hoặc min cho một giá trị để tính scale so với giá trị max của hàm sin.
= 2-1.25 = 0.75.
=> biểu thức mới
Y = 0.75*sin(a) + 1.25.
Đây chỉ đơn thuần là phép dịch trục toạ độ mà thôi.
Chỉ cần lấy giấy nháp vẽ ra sẽ dễ hình dung hơn nhiều.
Không nên. Với y = sinx ta chọn [-pi/2, pi/2] -> [-1, 1].
Với y = asinx + b sao cho miền trị là [1/2; 2] ta có:
1/2 = -a + b <= au+b <= a + b = 2 (u = sinx)
vậy 2b = 5/2 <=> b = 5/4 => a = 3/4.
Mình là mình muốn [-1, 1] và cực tiểu rơi ngay vào 0 (vì ngay đó là trung bình của -pi/2 và pi/2), nói cách khác b = 1 và hàm này sẽ gãy tại (0, 1), hay y = 1/2*sinx + 1 từ đầu và y = sinx + 1 về sau.
Phương trình có dạng:
asin(x) + b
.range của sin(x) là 2 (-1;1).
[1,2] có range là 1, bắt đầu = 1, nên a = 1/2, b = 3/2
f(x) = sin(x)/2 + 3/2
Khái quát hóa bài toán:
Giả sử muốn khống chế hàm sin,cos trong khoảng [min,max]
Đặt
k = (max-min)/2
=> f(x) = sin(x)*k + min + k