LINUX.ORG.RU
ФорумTalks

Кто реализует турбулентность?


0

0
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <style>
  div{
    color:#ffffff;
  }
  </style>
<script>

function Sneg(args){
  this.count = args.count || 100;
  this.time = args.time || 100;
  this.weigth = args.weigth || 0.1;
  this.resist = args.resist || 2;
  this.maxForce = args.force || 0.5;
  //погода, содержит силу и направление ветра
  this.weather = {
    force: this.maxForce,
    //угол направления
    dest: Math.random()*Math.PI*2,
    getForces: function(){
      return {
        x: Math.cos(this.dest) * this.force,
        y: Math.sin(this.dest) * this.force
      };
    }
  };

  this.getDims = function(){
    return {
      x: window.innerWidth / 2.0,
      y: window.innerHeight / 2.0
    };
  }

  var Snejinka = function(parent){

    this.reset = function(){
      this.speed = {x:Math.random(),y:Math.random()} ;
      var d = parent.getDims();
      this.point =  {
        x: Math.random()*d.x*2 - d.x,
        y: Math.random()*d.y*2 - d.y
      };
    }

    this.move = function(p){
      var d = parent.getDims();
      this.node.style.top = d.y - p.y;
      this.node.style.left = d.x + p.x;
    }

    this.repaint = function(){

      var p = this.point;
      var w = parent.weather.getForces();
      var v = this.speed;

      v.x = v.x + ( w.x * this.resist );
      p.x = p.x + v.x ;

      v.y = v.y + (w.y * this.resist - this.weigth / this.resist);
      p.y = p.y + v.y ;

      this.move(this.point);
      var d = parent.getDims();

      if((v.y > 0 && (d.y - p.y) <= 0) || (v.y < 0 && (d.y + p.y) <= 0)){
        p.y = -p.y;
      }
      if((v.x > 0 && (d.x - p.x) <= 0) || (v.x < 0 && (d.x + p.x) <= 0)){
        p.x = -p.x;
      }

    }

    //параметры
    //вес
    this.weigth = Math.random()*parent.weigth;
    //парусность (воздушное сопротивление 8) )
    this.resist = Math.random()*parent.resist;
    // скорость
    this.reset();
    this.node = document.createElement("div");
    this.node.appendChild(document.createTextNode("*"));
    this.node.style.position = "fixed";
    document.body.appendChild(this.node);

    this.move(this.point);

  }

  this.snows = new Array();//массив снежинок, каждая имеет две координаты
  //инициализация
  for(var i = 0; i < this.count; i++){
    this.snows[i] = new Snejinka(this);
  }

  this._repaint = function(){
    for(var i = 0; i < this.count; i++){
      this.snows[i].repaint();
    }
  }

  var refresh = function(_this){
    //TODO изменение ветра
    var w = _this.weather;
    w.force +=((w.force > _this.maxForce)?-1:1)*(Math.random()*w.force);
    w.dest += Math.PI/2 - Math.random()*Math.PI/4;
    if(w.dest > Math.PI*2){
      w.dest -= Math.PI*2;
    }
    _this._repaint();
  }

  this.run = function(){
    setInterval(refresh, this.time, this);
  }
}

function init(){
  var sneg = new Sneg({
    count:500
  });
  sneg.run();
}
</script>
</head>
<body bgcolor="#000000" onload="init()">
  <div id="snow" style="width:90%;height:90%; margin:5%;border:#ffffff solid 1px">
  </div>
</body>
</html>

Сабж.

ps, Это тонкий намек…

★★☆

Ответ на: комментарий от bioreactor

Это запукать надо а не читать, хотя если ты браузер (кого только на лоре не встретишь)…

wfrr ★★☆
() автор топика

Кстати нелюбимый мной ФФ лучше всего справился с этой байдой...

Sauron_AZM
()
Ответ на: комментарий от wfrr

> Это запукать надо

Вот за что я вас ценю, wfrr, так это за изысканность выражений. Любой другой регистрат сказал бы, что срать на это хотел, а эвона как вежливо: "запукать"..

anonymous
()

Да, еще нету интерактивности (нельзя мышой снежинки гонять)... Хотя какая тут интерактивность при 100% загрузке CPU и 0.2 fps

EmStudio
()
Ответ на: комментарий от EmStudio

>Так и должно быть? (при переходе на окно со скриптом)

Что-то оно вставляет. Надо запустить %)))

wyldrodney
()

Запустил в хроме - вроде более-менее нормально работает, и проц не жрёт на 100%.

svr4
()
Ответ на: комментарий от question4

Каждая снежинка имеет вес, скрость и парусность.

Есть сила тяжести и "погода"(сила и направление ветра) координата пересчитывается по:

v.x = v.x + ( w.x * this.resist );
p.x = p.x + v.x ;

v.y = v.y + (w.y * this.resist - this.weigth / this.resist);
p.y = p.y + v.y ;

resist - парусность
weight - вес
w.x - проекция силы ветра на координату "х"

При малой массе и большой парусности часть снежинок полет вверх, что можно наблюдать смотря из окна. Собстно задача было симулирвоать поведение настоящих снежинок, ночью вот придумалось добавить 3d, а вот турбулентность как с имитировать я не придумал.

wfrr ★★☆
() автор топика
Ответ на: комментарий от EmStudio

Опера? Опера аццки тормозит на сём тесте, возможно из-за того что текст.

wfrr ★★☆
() автор топика

>Кто реализует турбулентность?

Буковок много, так что смотреть что там не стал, но если по сабжу - открой на максимум врдопроводный кран.

KRoN73 ★★★★★
()

Какой-то дьявольский шабаш снежинок, загружает одно ядро полностью :)

kub
()
Ответ на: комментарий от EmStudio

Ога. А если турбулентность добавить ... Хотя поглядев за окно на грязные лужи, и проца не жалко

cerberus7
()

Ты бы на svg лучше накатал.

>Это тонкий намек…

vada ★★★★★
()

Да оно же еле шевелится, снег на улице не летает с 0.5 fps, вот в чем главная нереалистичность

temp
()
Ответ на: комментарий от temp

if(temp == "нищеброд" || temp == "операфил"){
  throw new RuntimeException("Толсто!");
}

wfrr ★★☆
() автор топика
Ответ на: комментарий от anonymous

Можно взять эти картинки от гимпить до прозрачного пнг и 1000 экземпляров рисеовать сабжевым скриптом, только нужен кластер.

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

да и для скорости придется добавить третью коодинату, а для ветра второй угол (если в полярных координатах) и проекуцию силы ветра на z

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <style>
  div{
    color:#ffffff;
  }

body{overflow:hidden;}
  </style>
</head>
<body bgcolor="#000000" onload="init()">
  <div id="snow" style="width:90%;height:90%; margin:5%;border:#ffffff solid 1px">
  </div>

<script>

dims=[window.innerWidth,window.innerHeight];

count=100;
gravity=1;
flakes=[];
stars=[];

wind=[0,0];

for(q=0;q<count;q++){
flakes[q]=initFlake()
flakes[q].y=Math.random()*0+dims[1];

    stars[q] = document.createElement("div");
    stars[q].appendChild(document.createTextNode("*"));
    stars[q].style.position = "absolute";
    document.body.appendChild(stars[q]);


}



function initFlake(){
return({
speed:{x:Math.random()*10-5,y:Math.random()*10-5},
x:Math.random()*dims[0],
y:-20,
weight:Math.random(),
fly:Math.random()
});
}



function update(){
for(q=0;q<count;q++){
      with(stars[q].style){
top =flakes[q].y;
left =flakes[q].x;
    }

flakes[q].y+=flakes[q].speed.y+wind[1];
flakes[q].x+=flakes[q].speed.x+wind[0];
flakes[q].speed.y+=flakes[q].weight*gravity/5;

if(flakes[q].y>dims[1]){flakes[q]=initFlake();stars[q].style.fontSize=Math.floo
r(flakes[q].weight*20)}

if(flakes[q].x>dims[0]){flakes[q].x-=dims[0];}
if(flakes[q].x<0){flakes[q].x+=dims[0];}

}

wind=[
wind[0]*.9,
wind[1]*.9
];

}


setInterval(update,100);

om=[0,0];
document.onmousemove=function(e){
wind[0]+=(e.x-om[0])/30;
wind[1]+=(e.y-om[1])/10;
om=[e.x,e.y];
}

</script>

</body>
</html>



3D ниасилил, зато при сотне снежинок анимация довольно плавная.
Ветер задается мышкой. Со временем стихает.
Быдлокод форматировать и оформлять в оо-стиль лень.

EmStudio
()
Ответ на: комментарий от EmStudio

Да, ветер надо на летучесть перемножить:

flakes[q].y+=flakes[q].speed.y+wind[1]*flakes[q].fly;
flakes[q].x+=flakes[q].speed.x+wind[0]*flakes[q].fly;

EmStudio
()

Оказвается, если заменить:

  this.getDims = function(){
    if(!this.dims){
      this.dims = {
        x: window.innerWidth / 2.0,
        y: window.innerHeight / 2.0
      };
    }
    return this.dims;
  }

то тормоза исчезают

wfrr ★★☆
() автор топика
Ответ на: комментарий от EmStudio

В фоксе не пашет, в опере толчками, видимо опера старая.

wfrr ★★☆
() автор топика
Ответ на: комментарий от EmStudio

Ещё надо, когда одна снежинка на другую натыкается - анигилировались чтоб. Как в игре robots :)

ovax ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.