Máy ảnh Nikon Z6 II (Body Only)
                     
                
                    
                        
                            
                                
                                
                                     Nikon Z6 II   là mẫu máy ảnh mirrorless kế nhiệm của Nikon Z6. Giống như Nikon Z6, Nikon Z6 II được thiết kế hoàn toàn bằng hợp kim Magiê tạo độ chắc chắn... 
                                    khuyến mãi áp dụng đến hết ngày 01/07-31/03/2025 
                                
                                
                             
                         
                         
                     
                    
                 
             
         
        
     
    
    
        
            
                
                    
                        
                            Giao hàng 
                            Toàn quốc 
                        
                     
                    
                        
                            Sản phẩm 
                            Chính hãng 
                        
                     
                    
                        
                            Bảo hành 
                            Lâu dài 
                        
                     
                    
                        
                            Thanh toán 
                            Đa dạng 
                        
                     
                 
             
         
     
    
    
    
    
    (function () {
        const requestAnimFrame = (function () {
            return window.requestAnimationFrame ||
                window.webkitRequestAnimationFrame ||
                window.mozRequestAnimationFrame ||
                function (callback) {
                    window.setTimeout(callback, 1000 / 60);
                };
        })();
        const hieuUngPhaoHoa = {
            canvas: document.getElementById('hieuUngPhaoHoa__canvas'),
            ctx: null,
            cw: window.innerWidth,
            ch: window.innerHeight,
            fireworks: [],
            particles: [],
            colors: [0, 60, 300], // Mảng các màu
            hue: 0,
            timerTotal: 30, // Giảm thời gian giữa các lần bắn
            timerTick: 0,
            isActive: true, // Biến để kiểm soát trạng thái hoạt động
            init: function () {
                this.ctx = this.canvas.getContext('2d');
                this.canvas.width = this.cw;
                this.canvas.height = this.ch;
                this.loop();
                // Tự động dừng sau 5 giây
                setTimeout(() => {
                    this.isActive = false;
                }, 5000);
            },
            calculateDistance: function (p1x, p1y, p2x, p2y) {
                const xDistance = p1x - p2x;
                const yDistance = p1y - p2y;
                return Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));
            },
            random: function (min, max) {
                return Math.random() * (max - min) + min;
            },
            createParticles: function (x, y) {
                let particleCount = 30;
                // Chọn màu ngẫu nhiên từ mảng
                this.hue = this.colors[Math.floor(Math.random() * this.colors.length)];
                while (particleCount--) {
                    this.particles.push(new Particle(x, y, this));
                }
            },
            // Main loop
            loop: function () {
                if (!this.isActive && this.fireworks.length === 0 && this.particles.length === 0) {
                    return; // Dừng animation khi hết pháo hoa
                }
                requestAnimFrame(this.loop.bind(this));
                this.hue += 0.5;
                this.ctx.globalCompositeOperation = 'destination-out';
                this.ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';
                this.ctx.fillRect(0, 0, this.cw, this.ch);
                this.ctx.globalCompositeOperation = 'lighter';
                let i = this.fireworks.length;
                while (i--) {
                    this.fireworks[i].draw();
                    this.fireworks[i].update(i);
                }
                i = this.particles.length;
                while (i--) {
                    this.particles[i].draw();
                    this.particles[i].update(i);
                }
                // Tự động bắn pháo hoa nếu đang hoạt động
                if (this.isActive && this.timerTick >= this.timerTotal) {
                    this.fireworks.push(new Firework(
                        this.cw / 2, this.ch,
                        this.random(0, this.cw),
                        this.random(0, this.ch / 2),
                        this
                    ));
                    this.timerTick = 0;
                } else {
                    this.timerTick++;
                }
            }
        };
        // Firework class
        class Firework {
            constructor(sx, sy, tx, ty, main) {
                this.main = main;
                this.x = sx;
                this.y = sy;
                this.sx = sx;
                this.sy = sy;
                this.tx = tx;
                this.ty = ty;
                this.distanceToTarget = main.calculateDistance(sx, sy, tx, ty);
                this.distanceTraveled = 0;
                this.coordinates = [];
                this.coordinateCount = 3;
                while (this.coordinateCount--) {
                    this.coordinates.push([this.x, this.y]);
                }
                this.angle = Math.atan2(ty - sy, tx - sx);
                this.speed = 2;
                this.acceleration = 1.05;
                this.brightness = main.random(50, 70);
                this.targetRadius = 1;
            }
            update(index) {
                this.coordinates.pop();
                this.coordinates.unshift([this.x, this.y]);
                if (this.targetRadius < 8) {
                    this.targetRadius += 0.3;
                } else {
                    this.targetRadius = 1;
                }
                this.speed *= this.acceleration;
                const vx = Math.cos(this.angle) * this.speed;
                const vy = Math.sin(this.angle) * this.speed;
                this.distanceTraveled = this.main.calculateDistance(
                    this.sx, this.sy, this.x + vx, this.y + vy
                );
                if (this.distanceTraveled >= this.distanceToTarget) {
                    this.main.createParticles(this.tx, this.ty);
                    this.main.fireworks.splice(index, 1);
                } else {
                    this.x += vx;
                    this.y += vy;
                }
            }
            draw() {
                this.main.ctx.beginPath();
                this.main.ctx.moveTo(
                    this.coordinates[this.coordinates.length - 1][0],
                    this.coordinates[this.coordinates.length - 1][1]
                );
                this.main.ctx.lineTo(this.x, this.y);
                this.main.ctx.strokeStyle = `hsl(${this.main.hue}, 100%, ${this.brightness}%)`;
                this.main.ctx.stroke();
            }
        }
        // Particle class
        class Particle {
            constructor(x, y, main) {
                this.main = main;
                this.x = x;
                this.y = y;
                this.coordinates = [];
                this.coordinateCount = 5;
                while (this.coordinateCount--) {
                    this.coordinates.push([this.x, this.y]);
                }
                this.angle = main.random(0, Math.PI * 2);
                this.speed = main.random(1, 10);
                this.friction = 0.95;
                this.gravity = 1;
                this.hue = main.random(main.hue - 20, main.hue + 20);
                this.brightness = main.random(50, 80);
                this.alpha = 1;
                this.decay = main.random(0.015, 0.03);
            }
            update(index) {
                this.coordinates.pop();
                this.coordinates.unshift([this.x, this.y]);
                this.speed *= this.friction;
                this.x += Math.cos(this.angle) * this.speed;
                this.y += Math.sin(this.angle) * this.speed + this.gravity;
                this.alpha -= this.decay;
                if (this.alpha <= this.decay) {
                    this.main.particles.splice(index, 1);
                }
            }
            draw() {
                this.main.ctx.beginPath();
                this.main.ctx.moveTo(
                    this.coordinates[this.coordinates.length - 1][0],
                    this.coordinates[this.coordinates.length - 1][1]
                );
                this.main.ctx.lineTo(this.x, this.y);
                this.main.ctx.strokeStyle = `hsla(${this.hue}, 100%, ${this.brightness}%, ${this.alpha})`;
                this.main.ctx.stroke();
            }
        }
        // Khởi chạy khi trang load xong
        //window.addEventListener('load', () => hieuUngPhaoHoa.init());
    })();