Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2014
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.59 KB | None | 0 0
  1. package delightex.geomshapes.tree;
  2.  
  3.  
  4. import delightex.graphics.GeometryDefinition;
  5. import delightex.graphics.GeometryDefinitionBase;
  6.  
  7. import java.util.*;
  8. import java.util.List;
  9.  
  10.  
  11. public class Tree {
  12. public List<Tree> childs;
  13. private Vector currentVertex;
  14. private static final int RADIUS = 10;
  15. /* Радиус влияния (выбираем ближайшие) */
  16. private static final double D_I = 0.4;
  17. private static final double x = 5.9;
  18. /* Радиус узла */
  19. private static final double D = 0.01;
  20. /* Радиус уничтожения */
  21. private static final double D_K = 20* D;
  22. private static final int MAGIC_COUNT = 500;
  23. private static double[] circle;
  24. private static class TreeNear {
  25. Tree node;
  26. HashSet<Vector> near;
  27. Vector summary;
  28.  
  29. public TreeNear(Tree node) {
  30. this.node = node;
  31. near = new HashSet<Vector>();
  32. summary = new Vector(0, 0, 0);
  33. }
  34. public void addPoint(Vector a) {
  35. near.add(a);
  36. }
  37. public void addVector(Vector a) {
  38. summary = summary.add(a.sub(node.currentVertex).norm());
  39. }
  40. public void subVector(Vector a) {
  41. summary = summary.sub(a.sub(node.currentVertex).norm());
  42. }
  43. }
  44. private static int subdivisionsCircle = 5;
  45. private ArrayList<Double> points = new ArrayList<>();
  46. private ArrayList<Integer> indixes = new ArrayList<>();
  47. private int iLeft = -1;
  48. private int iRight = -1;
  49.  
  50. public Tree() {
  51. points = new ArrayList<>();
  52. indixes = new ArrayList<>();
  53. }
  54. public GeometryDefinition getTree() {
  55. return new GeometryDefinition(getPoints(), GeometryDefinition.VertexType.POINT3, getIndices(), GeometryDefinition.FaceType.TRIANGLES);
  56. }
  57. public static Tree createTree(int n) {
  58. Tree tree = new Tree(0, 0, 0);
  59. circle = getCircle(subdivisionsCircle);
  60.  
  61. int lastDelete = 0;
  62. int currentDelete = 0;
  63. TreeNear tn = new TreeNear(tree);
  64. List<Vector> currentPoint = Generate.generatePoints(RADIUS, n);
  65. boolean flag = true;
  66. List<TreeNear> treeNode = new ArrayList<TreeNear>();
  67. treeNode.add(tn);
  68. HashMap<Vector, TreeNear> nearestNode = new HashMap<Vector, TreeNear>();
  69. TreeNear[] nearest = new TreeNear[currentPoint.size()];
  70. for (int i = 0; i < currentPoint.size(); i++) {
  71. Vector p = currentPoint.get(i);
  72. double curMin = p.dist(tn.node.currentVertex);
  73. if (curMin < D_I * D_I) {
  74. tn.addPoint(p);
  75. tn.addVector(p);
  76. nearest[i] = tn;
  77. }
  78. }
  79. while (flag && currentPoint.size() > 0) {
  80. System.out.println(currentPoint.size() +" " + treeNode.size());
  81. flag = false;
  82. /* Здесь находим для каждой точки ближайший Node и записываем в Node ближайшие к нему точки .... пункт b*/
  83. //это метод updateNear..
  84. /*c and d and e*/
  85. List<TreeNear> newTreeNode = new ArrayList<TreeNear>();
  86. for (TreeNear i : treeNode) {
  87. Vector curVector = new Vector(0, 0, 0);
  88. curVector = i.summary;
  89. /*
  90. for (Vector j : i.near) {
  91. curVector = curVector.add(j.sub(i.node.currentVertex).norm());
  92. } */
  93. //i.near.clear();
  94. if (curVector.sqLength() == 0) {
  95. continue;
  96. }
  97. flag = true;
  98. curVector = curVector.norm();
  99. Tree t = new Tree(curVector.mul(D).add(i.node.currentVertex));
  100.  
  101. i.node.childs.add(t);
  102. TreeNear q = new TreeNear(t);
  103. newTreeNode.add(q);
  104. updateNearNode(nearest, q, i, currentPoint);
  105. }
  106. treeNode.addAll(newTreeNode);
  107. /* f and g */
  108. Iterator<Vector> it = currentPoint.iterator();
  109. currentDelete++;
  110. while (it.hasNext()) {
  111. Vector p = it.next();
  112. boolean delete = false;
  113. for (TreeNear i : newTreeNode/*treeNode*/) {
  114. if (D_K * D_K >= p.dist(i.node.currentVertex)) {
  115. delete = true;
  116. break;
  117. }
  118. }
  119. if (delete) {
  120. it.remove();
  121. lastDelete = currentDelete;
  122. }
  123. }
  124. if (currentDelete - lastDelete > MAGIC_COUNT) {
  125. break;
  126. }
  127.  
  128.  
  129. }
  130. System.out.println("OK");
  131. return tree;
  132. }
  133. private Tree(int x, int y, int z) {
  134. currentVertex = new Vector(x, y, z);
  135. childs = new ArrayList<Tree>();
  136. }
  137.  
  138. public Tree(Vector a) {
  139. currentVertex = a;
  140. childs = new ArrayList<Tree>();
  141. }
  142. public Vector getCurrentVertex() {
  143. return currentVertex;
  144. }
  145.  
  146. private static void updateNearNode(TreeNear[] nearest, TreeNear t,TreeNear parent, List<Vector> currentPoint) {
  147. /*
  148. HashSet<Vector> e = new HashSet<Vector>(parent.near);
  149. for (Vector p : e) { ;
  150. double curMin = p.dist(t.node.currentVertex);
  151. double hasMin = 0;
  152. if (nearest[p.number] != null) {
  153. hasMin = p.dist(nearest[p.number].node.currentVertex);
  154. }
  155. else {
  156. hasMin = D_K * 2;
  157. }
  158. if (curMin < hasMin && curMin < D_I * D_I) {
  159. t.addPoint(p);
  160. t.addVector(p);
  161. if (nearest[p.number] != null) {
  162. nearest[p.number].near.remove(p);
  163. nearest[p.number].subVector(p);
  164. }
  165. nearest[p.number] = t;
  166. }
  167.  
  168.  
  169. }*/
  170. for (int i = 0; i < currentPoint.size(); i++) {
  171. Vector p = currentPoint.get(i);
  172. double curMin = p.dist(t.node.currentVertex);
  173. double hasMin = 0;
  174. if (nearest[p.number] != null) {
  175. hasMin = p.dist(nearest[p.number].node.currentVertex);
  176. }
  177. else {
  178. hasMin = D_K * 2;
  179. }
  180. if (curMin < hasMin && curMin < D_I * D_I) {
  181. t.addPoint(p);
  182. t.addVector(p);
  183. if (nearest[p.number] != null) {
  184. nearest[p.number].near.remove(p);
  185. nearest[p.number].subVector(p);
  186. }
  187. nearest[p.number] = t;
  188. }
  189.  
  190.  
  191. }
  192. }
  193.  
  194. public float[] getPoints() {
  195. getRadiusCylinder(this, this);
  196. float[] res = new float[points.size()];
  197. for (int i = 0; i < res.length; i++) {
  198. res[i] = points.get(i).floatValue();
  199. }
  200. return res;
  201. }
  202. public int[] getIndices() {
  203. int[] res = new int[indixes.size()];
  204. for (int i = 0; i < res.length; i++) {
  205. res[i] = indixes.get(i);
  206. }
  207. return res;
  208. }
  209. private double getRadiusCylinder(Tree node, Tree parent) {
  210. double sum = 0.0f, self = 0.2f;
  211. for (Tree i : node.childs) {
  212. sum += Math.pow(getRadiusCylinder(i, node), x);
  213. }
  214.  
  215. if (sum > 0.0f) {
  216. self = Math.pow(sum, 1.0 / x);
  217. }
  218. if (node.childs.size() != 0) {
  219. // System.out.println("node.size = " + node.childs.size() + "r = " + self);
  220. }
  221. if (node.iLeft == -1) {
  222. node.iLeft = points.size();
  223. addPoints(node, self);
  224. node.iRight = points.size();
  225. }
  226. if (parent.iLeft == -1) {
  227. parent.iLeft = points.size();
  228. addPoints(parent, self);
  229. parent.iRight = points.size();
  230. }
  231.  
  232. connectNodes(node, parent);
  233. return self;
  234.  
  235.  
  236. }
  237.  
  238. private void addPoints(Tree node, double r) {
  239.  
  240. for (int i = 0; i < circle.length; i += 3) {
  241. points.add(circle[i] * r + node.currentVertex.x);
  242. points.add(circle[i + 1] * r + node.currentVertex.y);
  243. points.add(circle[i + 2] * r + node.currentVertex.z);
  244. }
  245.  
  246. }
  247.  
  248. private void connectNodes(Tree node, Tree parent) {
  249. int diff = parent.iLeft;
  250. if (parent.iLeft != node.iLeft) {
  251. for (int i = parent.iLeft; i < parent.iRight; i++) {
  252. indixes.add(i - diff + node.iLeft + 1);
  253. indixes.add(i - diff + node.iLeft);
  254. indixes.add(i);
  255. //System.out.println("triangle = " + (i - diff + node.iLeft + 1));
  256. //System.out.println("triangle = " + (i - diff + node.iLeft));
  257. //System.out.println("triangle = " + (i));
  258.  
  259. indixes.add(i);
  260. indixes.add(i + 1);
  261. indixes.add(i - diff + node.iLeft + 1);
  262.  
  263. }
  264. }
  265. }
  266.  
  267. private static double[] getCircle(int subdivisions) {
  268. double[] result = new double [3 * (subdivisions + 1)];
  269. double step = 2 * Math.PI / (subdivisions);
  270. for (int i = 0; i <= subdivisions; i++) {
  271. if (i == subdivisions) {
  272. result[i * 3] = 0;
  273. result[i * 3 + 1] = 0;
  274. result[i * 3 + 2] = 0;
  275. } else {
  276. result[i * 3] = Math.cos(step * i);
  277. result[i * 3 + 1] = Math.sin(step * i);
  278. result[i * 3 + 2] = 0;
  279. }
  280. }
  281. return result;
  282. }
  283.  
  284.  
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement