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?

Tao Không Ngu. viết 16:14 ngày 01/10/2018

Hi Thuc Nguyen Tan.

  1. Giá trị hàm sin [-1; 1].
  2. Bạn tạo 1 hàm cho gia giá trị trong khoảng đó.
rogp10 viết 16:23 ngày 01/10/2018

Tức là bạn phóng to xong lại thu nhỏ à?

Thuc Nguyen Tan viết 16:22 ngày 01/10/2018

uh, làm như trên nó có một giai đoạn biến mất (giá trị âm)

Tao Không Ngu. viết 16:24 ngày 01/10/2018

Hi Thuc Nguyen Tan.

  1. Hàm sin có giá trị [-1; 1];
  2. Bạn không thấy họ cộng 1 vào rồi a ?
rogp10 viết 16:26 ngày 01/10/2018

Nên rescale (bằng số) cái cat.rotation vì nó đã sẵn độ rồi.

Thuc Nguyen Tan viết 16:20 ngày 01/10/2018

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

Thuc Nguyen Tan viết 16:14 ngày 01/10/2018

ý lộn, hàm y=1 + sin(count) --> miền giá trị là : [-2,2]

Tao Không Ngu. viết 16:22 ngày 01/10/2018

Hi Thuc Nguyen Tan.

  1. Hàm sin có giá trị [-1; 1];
  2. Bạn không thấy họ cộng 1 vào rồi a ? [0, 2].
Thuc Nguyen Tan viết 16:17 ngày 01/10/2018

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)

Thuc Nguyen Tan viết 16:15 ngày 01/10/2018

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ỉ?

Văn Dương viết 16:16 ngày 01/10/2018

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.

Văn Dương viết 16:26 ngày 01/10/2018

Đâ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.

rogp10 viết 16:11 ngày 01/10/2018

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.

No Name viết 16:17 ngày 01/10/2018

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

No Name viết 16:17 ngày 01/10/2018

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

Bài liên quan
0