Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.31 KB | None | 0 0
  1. var WIDTH = window.innerWidth;
  2. var HEIGHT = window.innerHeight;
  3.  
  4. var mouse = new THREE.Vector2();
  5.  
  6. var renderer = new THREE.WebGLRenderer({antialias: true});
  7. renderer.setSize(WIDTH, HEIGHT);
  8. renderer.setClearColor(0xDDDDDD, 1);
  9. document.body.appendChild(renderer.domElement);
  10.  
  11. var scene = new THREE.Scene();
  12.  
  13. var camera = new THREE.PerspectiveCamera(45, WIDTH / HEIGHT, 0.1, 10000);
  14. camera.position.set(0, 0, 10);
  15.  
  16. scene.add(camera);
  17.  
  18. var light = new THREE.PointLight(0xFFFFFF);
  19. light.position.set(-10, 15, 50);
  20. scene.add(light);
  21.  
  22.  
  23.  
  24. var request = new XMLHttpRequest();
  25. request.open("GET", "Aspirin.json", false);
  26. request.send(null);
  27. molecule_data = JSON.parse(request.responseText);
  28.  
  29.  
  30.  
  31. ///////////////////////////////////////////////////////////////////////////////////////////
  32. var molecule = new THREE.Object3D();
  33. var k = 0.4;
  34.  
  35. //массивы для атомов, материалов и геометрий
  36. var atoms = [], materials = [], geometries = [];
  37.  
  38.  
  39. atoms['H'] = [0, 0x2a52be, 0.53];
  40. atoms['O'] = [1, 0xff0000, 0.60];
  41. atoms['C'] = [2, 0x00ff12, 0.91];
  42.  
  43. // TODO:--------------- atoms2 заполнен аналогично 3 строкам выше ---------------------------------------------
  44. var atoms2 = [];
  45. var typesOfAtoms = new Set(molecule_data["PC_Compounds"][0]["atoms"]["element"]);
  46. var j = 0;
  47. for (let type of typesOfAtoms){
  48. var color = Number('0x'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6));
  49. var name = type.toString() + 'element';
  50. atoms2[name] = [j,color,molecule_data["PC_Compounds"][0]["coords"][0]["type"][j]/7];
  51. j+=1;
  52. }
  53. atoms_old = atoms;
  54. atoms = atoms2; //меняю старый на новый
  55. // --------------------------------------------------------------------------------------------------------------
  56.  
  57.  
  58. //объявление материалов и геометрий этих атомов
  59. for (var Name in atoms) {
  60. var material = new THREE.MeshPhongMaterial({
  61. color: atoms[Name][1], specular: 0x00b2fc, shininess: 90,
  62. blending: THREE.NormalBlending, depthTest: true
  63. }
  64. );
  65. materials.push(material);
  66. var geometry = new THREE.SphereGeometry(atoms[Name][2] * k, 64, 64);
  67. geometries.push(geometry);
  68. }
  69.  
  70. //информация о координатах молекулы
  71.  
  72. var bond_arr = [];
  73. j = 0;
  74. for (i = 0; i < molecule_data["PC_Compounds"][0]["atoms"]["aid"].length; i++) {
  75. bond = [];
  76. while (molecule_data["PC_Compounds"][0]["bonds"]["aid1"][j] === i + 1) {
  77. bond.push(molecule_data["PC_Compounds"][0]["bonds"]["aid2"][j]);
  78. j += 1;
  79. }
  80. if (bond_arr.length >= 1){
  81. for (var s = 0; s < i ; s++){
  82. if (bond_arr[s].indexOf(i+1)!== -1){
  83. bond.push(s+1)
  84. }
  85. }
  86. }
  87. bond_arr.push(bond);
  88. }
  89.  
  90. order = [];
  91. for (i = 0; i < molecule_data["PC_Compounds"][0]["bonds"]["aid1"].length; i++){
  92. var n1 = molecule_data["PC_Compounds"][0]["bonds"]["aid1"][i];
  93. var n2 = molecule_data["PC_Compounds"][0]["bonds"]["aid2"][i];
  94. order[n1.toString() + ' ' + n2.toString()] = molecule_data["PC_Compounds"][0]["bonds"]["order"][i];
  95. }
  96.  
  97. var info2 = [];
  98. j = 0;
  99. for (i = 0; i < molecule_data["PC_Compounds"][0]["atoms"]["aid"].length; i++) {
  100. bond = bond_arr[i].toString().replace(/,/g, ' ');
  101. var num = (i+1).toString();
  102. var elem = molecule_data["PC_Compounds"][0]["atoms"]["element"][i].toString() + "element";
  103. var x = molecule_data["PC_Compounds"][0]["coords"][0]["conformers"][0]["x"][i].toString();
  104. var y = molecule_data["PC_Compounds"][0]["coords"][0]["conformers"][0]["y"][i].toString();
  105. var z = molecule_data["PC_Compounds"][0]["coords"][0]["conformers"][0]["z"][i].toString();
  106. info2.push(num + " " + elem + " " + x + " " + y + " "+ z + " " + bond )
  107. }
  108.  
  109. var info = [];
  110. info.push('1 C -0.231579 -0.350841 -0.037475 2 4 5 6');
  111. info.push('2 C 0.229441 -0.373160 1.224850 1 3 7 8');
  112. info.push('3 O 0.868228 -0.551628 2.114423 2 9');
  113. info.push('4 H 0.619613 -0.833754 -0.565710 1');
  114. info.push('5 H -0.709445 0.352087 -0.754607 1');
  115. info.push('6 H -0.976393 -1.144198 0.191635 1');
  116. info.push('7 H -0.628785 0.860022 1.736350 2');
  117. info.push('8 H 0.952253 1.174538 0.962081 2');
  118. info.push('9 H 0.204846 -1.119563 2.483509 3');
  119.  
  120. info = info2;
  121. // info.push('1 C -0.231579 -0.350841 -0.037475 2');
  122. // info.push('2 C 0.229441 -0.373160 1.224850 1 3');
  123. // info.push('3 C 0.204846 -1.119563 2.483509 2');
  124.  
  125. //добавляем информацию в виде массива
  126. var arr = [];
  127. for (var i = 0; i < info.length; i++) {
  128. arr[i] = info[i].match(/\S+/g);
  129. }
  130.  
  131. //выводим все атомы
  132. for (var i = 0; i < arr.length; i++) {
  133. var Name = arr[i][1]; //номер элемента
  134. var Punct = new THREE.Mesh(geometries[atoms[Name][0]], materials[atoms[Name][0]]);
  135. Punct.position.set(arr[i][2], arr[i][3], arr[i][4]);
  136. molecule.add(Punct);
  137. }
  138.  
  139. //соединяем точки pointX и pointY цилиндром
  140. function cylinderMesh(pointX, pointY) {
  141. var direction = new THREE.Vector3().subVectors(pointX, pointY);
  142. var arrow = new THREE.ArrowHelper(
  143. direction.clone().normalize(), pointX, direction.length());
  144.  
  145. var edgeGeometry = new THREE.CylinderGeometry(0.03, 0.03, direction.length(), 36, 4);
  146. var edgeMesh = new THREE.Mesh(edgeGeometry, new THREE.MeshBasicMaterial({color: 0x0000ff}));
  147. edgeMesh.position.set(
  148. (pointX.getComponent(0) + pointY.getComponent(0)) / 2,
  149. (pointX.getComponent(1) + pointY.getComponent(1)) / 2,
  150. (pointX.getComponent(2) + pointY.getComponent(2)) / 2);
  151. edgeMesh.setRotationFromEuler(arrow.rotation);
  152. return edgeMesh;
  153. }
  154.  
  155. //соединяем атом с номером в начале массива с атомами, номера которых стоят на 5 и далее местах
  156. for (i = 0; i < arr.length; i++) {
  157. var num = arr[i][0] - 1; //номер атома
  158. var x1 = parseFloat(arr[num][2]);
  159. var y1 = parseFloat(arr[num][3]);
  160. var z1 = parseFloat(arr[num][4]);
  161.  
  162. for (j = 5; j < arr[i].length; j++) {
  163.  
  164. // if (arr[i][j]<num) break;
  165. // var num2 = arr[i][j] - 1; //номер атома
  166. // var x2 = (parseFloat(arr[num2][2]));
  167. // var y2 = (parseFloat(arr[num2][3]));
  168. // var z2 = (parseFloat(arr[num2][4]));
  169.  
  170. var num2 = arr[i][j] - 1; //номер атома
  171. var x2 = (parseFloat(arr[num2][2]) + x1) / 2;
  172. var y2 = (parseFloat(arr[num2][3]) + y1) / 2;
  173. var z2 = (parseFloat(arr[num2][4]) + z1) / 2;
  174.  
  175. ord = (num+1).toString() + ' ' + (num2+1).toString();
  176. ord_reverse = (num2+1).toString() + ' ' + (num+1).toString();
  177.  
  178. if ((order[ord] === 1) || (order[ord_reverse] === 1)) {
  179. var Vec1 = new THREE.Vector3(x1, y1, z1);
  180. var Vec2 = new THREE.Vector3(x2, y2, z2);
  181.  
  182. var fingerLength = cylinderMesh(Vec1, Vec2);
  183. fingerLength.material = materials[atoms[arr[i][1]][0]];
  184. molecule.add(fingerLength);
  185. }
  186. if ((order[ord] === 2) || (order[ord_reverse] === 2)) {
  187. var Vec1 = new THREE.Vector3(x1-0.1, y1-0.1, z1-0.1);
  188. var Vec2 = new THREE.Vector3(x2-0.1, y2-0.1, z2-0.1);
  189.  
  190. var fingerLength = cylinderMesh(Vec1, Vec2);
  191. fingerLength.material = materials[atoms[arr[i][1]][0]];
  192. molecule.add(fingerLength);
  193.  
  194. var Vec1 = new THREE.Vector3(x1+0.1, y1+0.1, z1+0.1);
  195. var Vec2 = new THREE.Vector3(x2+0.1, y2+0.1, z2+0.1);
  196.  
  197. var fingerLength = cylinderMesh(Vec1, Vec2);
  198. fingerLength.material = materials[atoms[arr[i][1]][0]];
  199. molecule.add(fingerLength);
  200. }
  201. }
  202. }
  203. scene.add(molecule);
  204. /////////////////////////////////////////////////////////////////////
  205.  
  206. var rotationSpeed = 6;
  207. var scaleSpeed = 1;
  208.  
  209. var isMouseDown = false;
  210.  
  211. document.addEventListener('mousemove', onDocumentMouseMove, false);
  212. document.addEventListener('mousedown', onDocumentMouseDown, false);
  213. document.addEventListener('mouseup', onDocumentMouseUp, false);
  214. document.addEventListener('mousewheel', onDocumentMouseWheel, false);
  215.  
  216. function moleculeMove() {
  217. var radiansX = Math.atan(mouse.x - molecule.rotation.y);
  218. var radiansY = Math.atan(mouse.y - molecule.rotation.x);
  219.  
  220. molecule.rotation.x = molecule.rotation.x + radiansY;
  221. molecule.rotation.y = molecule.rotation.y + radiansX;
  222. }
  223.  
  224. function onDocumentMouseWheel(event) {
  225. event.preventDefault();
  226. var s = Math.sign(event.wheelDeltaY);
  227. if ((camera.position.z + s * scaleSpeed) > 0) {
  228. camera.position.z += s * scaleSpeed;
  229. } else {
  230. camera.position.z = scaleSpeed;
  231. event.wheelDeltaY = 0;
  232. }
  233. }
  234.  
  235. function onDocumentMouseDown(event) {
  236. event.preventDefault();
  237. isMouseDown = true;
  238. }
  239.  
  240. function onDocumentMouseUp(event) {
  241. event.preventDefault();
  242. isMouseDown = false;
  243. }
  244.  
  245. function onDocumentMouseMove(event) {
  246. event.preventDefault();
  247. if (isMouseDown) {
  248. mouse.x = -(event.clientX / window.innerWidth) * rotationSpeed;
  249. mouse.y = (event.clientY / window.innerHeight) * rotationSpeed;
  250. }
  251. }
  252.  
  253. function render() {
  254.  
  255. requestAnimationFrame(render);
  256.  
  257. moleculeMove();
  258.  
  259. light.position = camera.position;
  260. renderer.render(scene, camera);
  261. }
  262.  
  263. render();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement