2016-08-30 2 views
9

EDIT: Я все еще не там. Я поставил щедрость на этот вопрос, потому что я действительно мог бы ответить на этот вопрос. Я обошел идею элементов, которые представляют планеты, которые не вращаются вокруг центра. Из-за этого вы можете пропустить шаги 1 & 2 и идти прямо к 3, чтобы попытаться помочь мне.Визуализируйте элементы JSON, используя некоторую математику

ORIGINAL: Я работаю над небольшим проектом. Это солнечная система, в которой планеты вращаются вокруг Солнца. Я считаю, что это симуляция, которая соответствует трем большим шагам.

Первый шаг: создать функциональную вращающуюся солнечную систему с 8 планетами.

Второй шаг: создать функцию, которая добавляет новые планеты, вращающиеся вокруг того же солнца, с одним нажатием кнопки с его особенности базируясь случайным образом (т.е. расстояние от Солнца, цвет планеты, размер планета и т. д.)

Я нахожусь на третьем шаге, и я не хочу, чтобы вещи были случайными. Третий шаг для меня, безусловно, самый сложный для меня, потому что у меня мало опыта работы с JSON. У меня есть данные со всех экзопланет за нашей солнечной системой с сайта НАСА, и я хочу добавить эти отдельные объекты (планеты) в симуляцию с функцией, которая добавляет объекты.

Мой вопрос к вам: Как бы мой код нужно смотреть, чтобы каждый отдельный запись, которую вы видите здесь, в массиве JSON в моем коде, как элемент, который расположен далеко от черного пятнышка на центре экран (см. скрипку) в случайном угле, так что это не все совпадают. В конце концов, я хочу иметь тысячи мелких пятнышек, которые представляют планеты, показанные на экране, где черное пятнышко в настоящее время только видимо, должно быть солнцем.

Это потому, что в моем файле JSON есть тысячи таких планет, и я хочу, чтобы они все вращались со своим соответствующим расстоянием от солнца «Расстояние [pc]», их соответствующий размер «Радиус планеты» [Радиус Юпитера ]». Конечно, науке не нужно было быть точным, но это должно быть несколько. Например, планета с наибольшим расстоянием [pc] (расстояние в парсеке) должна быть самой далекой, но все же быть в состоянии видеть на экране, даже если это всего лишь небольшое пятнышко.

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

Это мой код, но не все. Чтобы увидеть все это, нажмите ссылку, размещенную под этим кодом.

 //this is an array that holds all of the json data 
      var arr= [ 
       { 
        "rowid": 1, 
       "Host name": "11 Com", 
       "Number of Planets in System": 1, 
       "Planet Mass or M*sin(i)[Jupiter mass]": 19.4, 
       "Planet Radius [Jupiter radii]": null, 
       "Planet Density [g": { 
        "cm**3]": null 
       }, 
       "Distance [pc]": 110.62, 
       "Effective Temperature [K]": 4742, 
       "Date of Last Update": "5/14/2014" 
      }, 
      { 
       "rowid": 2, 
       "Host name": "11 UMi", 
       "Number of Planets in System": 1, 
       "Planet Mass or M*sin(i)[Jupiter mass]": 10.5, 
       "Planet Radius [Jupiter radii]": null, 
       "Planet Density [g": { 
        "cm**3]": null 
       }, 
       "Distance [pc]": 119.47, 
       "Effective Temperature [K]": 4340, 
       "Date of Last Update": "5/14/2014" 
      }, 
      { 
       "rowid": 3, 
       "Host name": "14 And", 
       "Number of Planets in System": 1, 
       "Planet Mass or M*sin(i)[Jupiter mass]": 4.8, 
       "Planet Radius [Jupiter radii]": null, 
       "Planet Density [g": { 
        "cm**3]": null 
       }, 
       "Distance [pc]": 76.39, 
       "Effective Temperature [K]": 4813, 
       "Date of Last Update": "5/14/2014" 
      }, 
      { 
       "rowid": 4, 
       "Host name": "14 Her", 
       "Number of Planets in System": 1, 
       "Planet Mass or M*sin(i)[Jupiter mass]": 4.64, 
       "Planet Radius [Jupiter radii]": null, 
       "Planet Density [g": { 
        "cm**3]": null 
       }, 
       "Distance [pc]": 18.15, 
       "Effective Temperature [K]": 5311, 
       "Date of Last Update": "5/14/2014" 
      }]; 

//these variables hold specific properties 
    var distance; 
    var planetRadius; 
    var rowid; 
    var hostName; 

    for(var i=0;i<arr.length;i++){ 

     rowid= arr[i]["rowid"]; 
     distance= arr[i]["Distance [pc]"]; 
     hostName= arr[i]["Host name"]; 
     planetRadius=arr[i]["Planet Radius [Jupiter radii]"];//This is the idea how we should access the json objects, as your operations are not clear to us just I'm giving the idea 
     // Do what ever you want with individual object 
      if(planetRadius !== null){ 
       // If planet radius not null do whatever you want. 
      } 
    } 

Этот код содержит fiddle. Примечание: Эта ссылка содержит все 3000+ планет в коде, поэтому она может повлиять на вас с точки зрения загрузки. Просто введите 1 вместо 2 в URL-адресе, чтобы перейти к черновику, в котором есть всего несколько примеров планет hte, если ваш браузер действует на вас.

+0

Что вы хотите делать с каждым объектом из массива объекта? –

+0

Я имею в виду, хотите ли вы где-нибудь поместить или что-то нужно сделать? –

+0

Извините, если я неясен, но я хочу, чтобы размер и расстояние каждого объекта от элемента солнца были основаны на «Радиус планеты» [Радиус Юпитера] »(если значение не равно нулю) и «Расстояние [pc]». О, я только что понял, что примеры, которые я дал, просто оказались пустыми. Это всего лишь 10% всех планет в массиве. Я сделаю об этом изменения. – Zhyohzhy

ответ

1

Позвольте мне дать это попробовать:

Смотрите эту fiddle. Расстояние логарифмическое, так что все планеты подходят на экране.

var arr= [ 
    { 
     "rowid": 1, 
     "Host name": "11 Com", 
     "Number of Planets in System": 1, 
     "Planet Mass or M*sin(i)[Jupiter mass]": 19.4, 
     "Planet Radius [Jupiter radii]": null, 
     "Planet Density [g": { 
      "cm**3]": null 
     }, 
     "Distance [pc]": 110.62, 
     "Effective Temperature [K]": 4742, 
     "Date of Last Update": "5/14/2014" 
    }, 
    { 
     "rowid": 2, 
     "Host name": "11 UMi", 
     "Number of Planets in System": 1, 
     "Planet Mass or M*sin(i)[Jupiter mass]": 10.5, 
     "Planet Radius [Jupiter radii]": null, 
     "Planet Density [g": { 
      "cm**3]": null 
     }, 
     "Distance [pc]": 119.47, 
     "Effective Temperature [K]": 4340, 
     "Date of Last Update": "5/14/2014" 
    }, 
    { 
     "rowid": 3, 
     "Host name": "14 And", 
     "Number of Planets in System": 1, 
     "Planet Mass or M*sin(i)[Jupiter mass]": 4.8, 
     "Planet Radius [Jupiter radii]": null, 
     "Planet Density [g": { 
      "cm**3]": null 
     }, 
     "Distance [pc]": 76.39, 
     "Effective Temperature [K]": 4813, 
     "Date of Last Update": "5/14/2014" 
    }, 
    { 
     "rowid": 4, 
     "Host name": "14 Her", 
     "Number of Planets in System": 1, 
     "Planet Mass or M*sin(i)[Jupiter mass]": 4.64, 
     "Planet Radius [Jupiter radii]": null, 
     "Planet Density [g": { 
      "cm**3]": null 
     }, 
     "Distance [pc]": 18.15, 
     "Effective Temperature [K]": 5311, 
     "Date of Last Update": "5/14/2014" 
    }]; 
var distance; 
var planetRadius; 
var rowid; 
var hostName; 


var svg=document.getElementById("Layer_1"); 
for(var i=0;i<arr.length;i++){ 

    rowid= arr[i]["rowid"]; 
    distance= arr[i]["Distance [pc]"]; 
    hostName= arr[i]["Host name"]; 
    planetRadius=arr[i]["Planet Radius [Jupiter radii]"];//This is the idea how we should access the json objects, as your operations are not clear to us just I'm giving the idea 
    // Do what ever you want with individual object 
     if(planetRadius !== null){ 
      // If planet radius not null do whatever you want. 
      var circle=document.createElementNS("http://www.w3.org/2000/svg","circle"); 
      circle.setAttribute("class","fillblack"); 
      circle.setAttribute("cx","0"); 
      circle.setAttribute("cy","0"); 
      circle.setAttribute("r",planetRadius.toString()); 
      var logDist=Math.log(distance+1)*50; 
      var angle=0; // change this based on the current time, if you would like an animation 
      circle.setAttribute("transform","translate(500 300.8) rotate("+angle+") translate("+logDist+")"); 
      svg.appendChild(circle); 
     } 
} 
window.requestAnimationFrame(function(){ 
    // do your animations here 
}); 

Если вы хотите, вы можете добавить анимацию путем изменения angle переменной в преобразовании на основе текущего времени. SVG-преобразования делают математику довольно простой, так как вы можете объединять преобразования.

Однако я сомневаюсь, что 3000+ планет можно анимировать со скоростью 60 кадров в секунду с <svg> с текущими компьютерами. Если вам нужна гладкая анимация, вы можете посмотреть на <canvas>.

EDIT: Это прилично гладкое, но не похоже на мне 60 кадров в секунду. fiddle.

0

Если вам необходим отдельный объект для выполнения операций, используйте цикл for.

 var arr= [ 
     { 
      "rowid": 1, 
      "Host name": "11 Com", 
      "Number of Planets in System": 1, 
      "Planet Mass or M*sin(i)[Jupiter mass]": 19.4, 
      "Planet Radius [Jupiter radii]": null, 
      "Planet Density [g": { 
       "cm**3]": null 
      }, 
      "Distance [pc]": 110.62, 
      "Effective Temperature [K]": 4742, 
      "Date of Last Update": "5/14/2014" 
     }, 
     { 
      "rowid": 2, 
      "Host name": "11 UMi", 
      "Number of Planets in System": 1, 
      "Planet Mass or M*sin(i)[Jupiter mass]": 10.5, 
      "Planet Radius [Jupiter radii]": null, 
      "Planet Density [g": { 
       "cm**3]": null 
      }, 
      "Distance [pc]": 119.47, 
      "Effective Temperature [K]": 4340, 
      "Date of Last Update": "5/14/2014" 
     }, 
     { 
      "rowid": 3, 
      "Host name": "14 And", 
      "Number of Planets in System": 1, 
      "Planet Mass or M*sin(i)[Jupiter mass]": 4.8, 
      "Planet Radius [Jupiter radii]": null, 
      "Planet Density [g": { 
       "cm**3]": null 
      }, 
      "Distance [pc]": 76.39, 
      "Effective Temperature [K]": 4813, 
      "Date of Last Update": "5/14/2014" 
     }, 
     { 
      "rowid": 4, 
      "Host name": "14 Her", 
      "Number of Planets in System": 1, 
      "Planet Mass or M*sin(i)[Jupiter mass]": 4.64, 
      "Planet Radius [Jupiter radii]": null, 
      "Planet Density [g": { 
       "cm**3]": null 
      }, 
      "Distance [pc]": 18.15, 
      "Effective Temperature [K]": 5311, 
      "Date of Last Update": "5/14/2014" 
     }]; 
var distance; 
var planetRadius; 

for(var i=0;i<arr.length;i++){ 

    distance= arr[i]["Distance [pc]"]; 
    planetRadius=arr[i]["Planet Radius [Jupiter radii]"];//This is the idea how we should access the json objects, as your operations are not clear to us just I'm giving the idea 
    // Do what ever you want with individual object 
     if(planetRadius !== null){ 
      // If planet radius not null do whatever you want. 
     } 
} 
+0

Привет, спасибо за ваш ответ! Однако у меня возникли проблемы с его реализацией. Эта строка прямо из моего кода прямо здесь "r: parseFloat (document.getElementById (" new-r "). Value)" решает, где находится планета. Как изменить переменную расстояния, которую вы написали, заменить? Простое копирование кода в мой JSfiddle не влияет. Не могли бы вы обновить мой JSfiddle с ответом? https://jsfiddle.net/zxfqLsc9/ – Zhyohzhy

+0

Вы хотите получить доступ к «r» ?? from "r: parseFloat (document.getElementById (" new-r "). value)" –

+0

Ну, теперь, когда я думаю об этой функции, она устарела. Код, как сейчас, так это то, что вы можете свободно добавлять планеты вокруг солнца, но я больше не хочу, чтобы выбор был задействован. В массиве 4 планеты, я хочу, чтобы эти планеты были автоматически добавлены после загрузки страницы. Таким образом, когда я добавляю пятую планету в массив, солнечная система динамически обновляется с этой планетой, положение и размер которой зависят от ваших расстояний и переменных планетаРадиус. – Zhyohzhy

0

Я не собираюсь писать для вас код, но я собираюсь дать вам подсказки.

Первая проблема - установка на экран: найдите самый дальний край от центральной точки, а затем преобразуйте все расстояния так, чтобы они находились на этом расстоянии, но точно сохраняйте относительные расстояния. Для этого вам нужны 3 входных номера и то, что вы находите:

  • R'max = расстояние до самого дальнего края на экране (возможно, в пикселях).
  • D'max = расстояние до самой дальней планеты в вашем json от солнца.
  • D'planet = расстояние, которое вы хотите преобразовать в относительное расстояние.
  • R'planet = расстояние до планеты на экране, которое вам нужно найти (возможно, в пикселях).

формула:

R'planet = D'planet/(R'max/D'max); 

Вторая проблема - место планеты на экране: вам нужно расстояние планеты от Солнца на экране (R'planet - у вас есть из предыдущего шага), а также как угол от солнца (0 - 360 градусов - вы сказали, что можете делать случайные). Затем вы можете рассчитать координаты экрана следующим образом:

  • R'planet - расстояние по экрану.
  • A'planet - угол экрана от солнца.
  • X'planet - координата X планеты (если солнце находится в [0,0]).
  • Y'planet - координата Y планеты (если солнце находится в [0,0]).

формула:

X'planet = cos(A'planet)/R'planet; 
Y'planet = sin(A'planet)/R'planet; 

Помните, что эти координаты являются истинными, если солнце находится в [0,0]. Итак, чтобы поместить планету на экран, вам нужно добавить X'planet к X'sun и добавить Y'planet в Y'sun.

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

Radius'screen = Radius'actual/(Radius'actualmax/Radius'maxpx); 

Существует много способов сделать это, либо svg, либо просто поместить div с изображением планеты в нем и соответствующим образом.

Это должно быть все.

Смежные вопросы