БлогNot. Просто ещё одни звёздочки

Просто ещё одни звёздочки

Нужен был простой "полноэкранник" на белом фоне, с функцией-самовызывалкой как здесь. Так как просто белый экран это скучно, пусть что-нибудь движется.

Аналоги уже были тут (с внешней библиотекой) и там (другой эффект, через setInterval).

На изменение размеров окна браузера скрипт реагирует, для перехода в полноэкранный режим можно просто нажимать клавишу F11.

Ниже приводятся ссылка на работающий скрипт и полный исходник на момент написания (файл .html в кодировке UTF-8).

 Открыть скрипт stars.html в текущем окне/вкладке (4 Кб)

<!DOCTYPE html>
<html lang="ru">
 <head>
  <title>Звёзды</title>
  <style>
   *{
    border: none;
    margin: 0;
    padding: 0;
   }
   #container{
    position: absolute;
    top: 0px;
    right: 0px;
    bottom: 0px;
    left: 0px;
    background-color: #fff;
   }
   html, body{
    height: 100%;
    width: 100%;
    overflow: hidden;
   }
  </style>
 </head>
 <body>
  <div id="container">
   <canvas id="renderCanvas"></canvas>
  </div>
  <script>
(function(renderCanvas,container) { //id канвы, id обрамляющего раздела
 let objects = [];
 let World = { allPoints: 600 }; //всего звёзд
 let canvas = document.getElementById(renderCanvas);
 canvas.width = document.getElementById(container).offsetWidth;
 canvas.height = document.getElementById(container).offsetHeight;
 let context = canvas.getContext("2d");

 window.onresize = function() { //изменение размеров окна
  canvas.width = document.getElementById("container").offsetWidth;
  canvas.height = document.getElementById("container").offsetHeight;
 };

 function rotateAndRender() { //основной метод
  for (let i = 0; i < 5; i++){
   objects.push( {
    type: "point", x: Math.random() * canvas.width * 2,
    y: 0, z: Math.random() * canvas.width * 2 - (canvas.width - canvas.height) }
   );
   transform(objects[objects.length-1], [0-canvas.width/2, World.allPoints, 0-canvas.height/2]);
  }
  let i = objects.length;
  while(i--) {
   if(objects[i].y < 0) { objects.splice(i, 1); }
  }
  context.fillStyle = "rgba(255, 255, 255, 0.6)"; //цвет фона
  context.fillRect(0, 0, canvas.width, canvas.height);
  for(let i in objects){
   rotate(objects[i], [0, (Math.PI/800), 0], [canvas.width/2, 400, canvas.height/2]);
   transform(objects[i], [0, -2, 0]);
   render(objects[i], canvas);
  }
  window.requestAnimationFrame(rotateAndRender);
 }

 function render (object, canvas) {
  if (object.type == "point") {
   if (object.y < World.allPoints && object.y > 0) {
    let c = minmax (Math.round(255 * (object.y / World.allPoints)), 0, 255);
    context.fillStyle = "rgb("+(255-c)+", "+(c)+", "+(c)+")"; //цвет звёзд
    context.fillRect (
     (object.x + (1-(1/(4*(object.y / World.allPoints)))) * (canvas.width/2 - object.x)) - 1,
     (object.z + (1-(1/(4*(object.y / World.allPoints)))) * (canvas.height/2 - object.z)) - 1,
     2, 2);
   }
  }
 }

 function rotate(object, angles, center) {
  let vector = { x: object.x - center[0], y: object.y - center[1], z: object.z - center[2]};
  //ось x 
  vector.y = vector.y * Math.cos(angles[0]) - vector.z * Math.sin(angles[0]);
  vector.z = vector.y * Math.sin(angles[0]) + vector.z * Math.cos(angles[0]);
  //ось y
  vector.z = vector.z * Math.cos(angles[1]) - vector.x * Math.sin(angles[1]);
  vector.x = vector.z * Math.sin(angles[1]) + vector.x * Math.cos(angles[1]);
  //ось z
  vector.x = vector.x * Math.cos(angles[2]) - vector.y * Math.sin(angles[2]);
  vector.y = vector.x * Math.sin(angles[2]) + vector.y * Math.cos(angles[2]);
  object.x = center[0] + vector.x;
  object.y = center[1] + vector.y;
  object.z = center[2] + vector.z;
 }

 function transform (object, coords) {
  object.x += coords[0];
  object.y += coords[1];
  object.z += coords[2];
  return object;
 }

 function minmax (number, min, max) {
  if (number < min) number = min;
  if (number > max) number = max;
  return number;
 } 
 
 rotateAndRender();
}('renderCanvas','container'));
 </script>
 <noscript><p>Включите Javascript для работы приложения</p></noscript>
</body>
</html><!DOCTYPE html>
<html lang="ru">
 <head>
  <title>Звёзды</title>
  <style>
   *{
    border: none;
    margin: 0;
    padding: 0;
   }
   #container{
    position: absolute;
    top: 0px;
    right: 0px;
    bottom: 0px;
    left: 0px;
    background-color: #fff;
   }
   html, body{
    height: 100%;
    width: 100%;
    overflow: hidden;
   }
  </style>
 </head>
 <body>
  <div id="container">
   <canvas id="renderCanvas"></canvas>
  </div>
  <script>
(function(renderCanvas,container) { //id канвы, id обрамляющего раздела
 let objects = [];
 let World = { allPoints: 600 }; //всего звёзд
 let canvas = document.getElementById(renderCanvas);
 canvas.width = document.getElementById(container).offsetWidth;
 canvas.height = document.getElementById(container).offsetHeight;
 let context = canvas.getContext("2d");

 window.onresize = function() { //изменение размеров окна
  canvas.width = document.getElementById("container").offsetWidth;
  canvas.height = document.getElementById("container").offsetHeight;
 };

 function rotateAndRender() { //основной метод
  for (let i = 0; i < 5; i++){
   objects.push( {
    type: "point", x: Math.random() * canvas.width * 2,
    y: 0, z: Math.random() * canvas.width * 2 - (canvas.width - canvas.height) }
   );
   transform(objects[objects.length-1], [0-canvas.width/2, World.allPoints, 0-canvas.height/2]);
  }
  let i = objects.length;
  while(i--) {
   if(objects[i].y < 0) { objects.splice(i, 1); }
  }
  context.fillStyle = "rgba(255, 255, 255, 0.6)"; //цвет фона
  context.fillRect(0, 0, canvas.width, canvas.height);
  for(let i in objects){
   rotate(objects[i], [0, (Math.PI/800), 0], [canvas.width/2, 400, canvas.height/2]);
   transform(objects[i], [0, -2, 0]);
   render(objects[i], canvas);
  }
  window.requestAnimationFrame(rotateAndRender);
 }

 function render (object, canvas) {
  if (object.type == "point") {
   if (object.y < World.allPoints && object.y > 0) {
    let c = minmax (Math.round(255 * (object.y / World.allPoints)), 0, 255);
    context.fillStyle = "rgb("+(255-c)+", "+(c)+", "+(c)+")"; //цвет звёзд
    context.fillRect (
     (object.x + (1-(1/(4*(object.y / World.allPoints)))) * (canvas.width/2 - object.x)) - 1,
     (object.z + (1-(1/(4*(object.y / World.allPoints)))) * (canvas.height/2 - object.z)) - 1,
     2, 2);
   }
  }
 }

 function rotate(object, angles, center) {
  let vector = { x: object.x - center[0], y: object.y - center[1], z: object.z - center[2]};
  //ось x 
  vector.y = vector.y * Math.cos(angles[0]) - vector.z * Math.sin(angles[0]);
  vector.z = vector.y * Math.sin(angles[0]) + vector.z * Math.cos(angles[0]);
  //ось y
  vector.z = vector.z * Math.cos(angles[1]) - vector.x * Math.sin(angles[1]);
  vector.x = vector.z * Math.sin(angles[1]) + vector.x * Math.cos(angles[1]);
  //ось z
  vector.x = vector.x * Math.cos(angles[2]) - vector.y * Math.sin(angles[2]);
  vector.y = vector.x * Math.sin(angles[2]) + vector.y * Math.cos(angles[2]);
  object.x = center[0] + vector.x;
  object.y = center[1] + vector.y;
  object.z = center[2] + vector.z;
 }

 function transform (object, coords) {
  object.x += coords[0];
  object.y += coords[1];
  object.z += coords[2];
  return object;
 }

 function minmax (number, min, max) {
  if (number < min) number = min;
  if (number > max) number = max;
  return number;
 } 
 
 rotateAndRender();
}('renderCanvas','container'));
 </script>
 <noscript><p>Включите Javascript для работы приложения</p></noscript>
</body>
</html>

02.02.2024, 13:44 [162 просмотра]


теги: javascript графика random

К этой статье пока нет комментариев, Ваш будет первым