Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.79 KB | None | 0 0
  1. /*
  2. *Autor: Ary Andrade Neto
  3. *Objetivo:
  4. * Dado um numero n (aleatorio) o programa desenha n linhas (aleatorias)
  5. *computa as intesecoes, quantos polignos existem e informa quais sao os tipo
  6. *e colore cada um de uma cor diferente
  7. *desafio1.js puxado por index.html
  8. * Estutura de dados:
  9. *l = [[x0,y0],[vx,vy],[t1,t2,...,tn]]; //lista das retas
  10. *p = [[a,ta,b,tb],[a,ta,b,tb],...]
  11. *-lista dos pontos, onde a e b sao as retas que se cruzam e ta e tb o a "distancia" do ponto inicial (entre 0 e 1)
  12. *OBS:
  13. obs: terminar de implementar as funcoes
  14. e procurar se precisa de mais alguma
  15. ou se tem alguma redundante!
  16.  
  17. Proximo passo limitar
  18. a formla de intersecao estende uma linha imaginaria
  19. falta limitar esse valor ate o tamaho maximo da linha (seus estremos)
  20. fazer umma condicao para criar esse limite
  21.  
  22. */
  23. //ver se precisa mesmo dessas variaveis
  24. var j=0;
  25. var cont=0, k=1, jponto=0;
  26. var n;
  27. var l=[], p=[];
  28.  
  29. function setup() {
  30. createCanvas(640, 480);
  31. //n = random(10);
  32. n = 3;
  33. }
  34.  
  35. function draw() {
  36. var pontos=[];
  37. poligno();
  38.  
  39.  
  40. //linha pronta
  41. pontos=linhaPronta(j);
  42. j++;
  43. /*
  44. linhaAleatoria();
  45. */
  46. // console.log(l);
  47. intersecLine(l);
  48. /*
  49. if (cont<Math.trunc(n)){
  50. var x = intersecLine(l);
  51. console.log(x);
  52. stroke(0);
  53. point(x[0], x[1]);
  54. }
  55. ponto(p);
  56. //console.log(x);
  57. //desenhar linhas aleatorias
  58. */
  59. }
  60. function intersecLine(lista){
  61. //dado uma lista (l) com as retas
  62. //adiciona os pontos de intersecao na lista p
  63. //adiciona os t nas listas e os ordena
  64. if (cont<Math.trunc(n)-1){
  65. var pontoR;
  66. pontoR = intersec(lista[cont], lista[k++]);
  67. if (pontoR != 0){
  68. p.push([cont, pontoR[0], k-1, pontoR[1]]);
  69. console.log(p);
  70. l[cont][2].push(pontoR[0]);
  71. l[k-1][2].push(pontoR[1]);
  72. insertionSort(l[cont][2],l[cont][2].length);
  73. insertionSort(l[k-1][2],l[k-1][2].length);
  74. }
  75. }else{
  76. return;
  77. }
  78. if(k>Math.trunc(n)-1){
  79. cont++;
  80. k=cont+1;
  81. }
  82. return;
  83. }
  84. function orientacao(x, y, z){
  85. var det;
  86. det = (y[0]*z[1])+(z[0]*x[1])+(x[0]*y[1])-(x[1]*y[0])-(y[1]*z[0])-(z[1]*x[0]);
  87. if (det>0){
  88. return 1;
  89. }else if(det<0){
  90. return -1;
  91. }else{
  92. return 0;
  93. }
  94. }
  95. function poligno(){
  96. var interna, contador, posicao, pontinho;
  97. interna = p[jponto];
  98. if (interna != null){
  99. contador = l[interna[0]][2];
  100. posicao = pesquisaBinaria(interna[1], contador, 0, contador.length);
  101. //console.log(contador.length, posicao);
  102. if(posicao+1<contador.length){
  103. // console.log(contador, posicao, contador[posicao+1]);
  104. pontinho = buscarPonto(interna[0], l[interna[0]][2][posicao+1], 0);
  105. // console.log("pontinho",pontinho);
  106. }else if(posicao-1>=0){
  107. // console.log(contador, posicao, contador[posicao+1]);
  108. pontinho = buscarPonto(interna[0], l[interna[0]][2][posicao-1], 0);
  109. //console.log("pontinhoN",pontinho);
  110. }
  111. }
  112.  
  113.  
  114. }
  115. function colorir(lista){
  116. //pegar os pontos dessa lista e colorir todos por beginShape()
  117. var r,g,b;
  118. r = random(255);
  119. g = random(255);
  120. b = random(255);
  121.  
  122. }
  123. function intersec(a, b){
  124. //dado duas lista (l)
  125. //tira o determinante, se ele for 0: nao cruza e retorna 0,
  126. // caso contrario, retorna lista com t da primeira reta e o da segunda
  127. //retorna 0 se alguma lista passada for null
  128. /*problemaa a funcao retorna o ponto de intersecao entre duas linhas pequena como se elas se esedessem
  129. limitar com mais testes para verificar se o ponto esta na reta (linha)
  130. */
  131. var det;
  132. if (a==null || b==null){
  133. return 0;
  134. }
  135. var ax0 = a[0][0];
  136. var ax1 = a[0][0] + a[1][0];
  137. var ay0 = a[0][1];
  138. var ay1 = a[0][1] +a[1][1];
  139.  
  140. var bx0 = b[0][0];
  141. var bx1 = b[0][0] + b[1][0];
  142. var by0 = b[0][1];
  143. var by1 = b[0][1] + b[1][1];
  144.  
  145. det = (bx1 - bx0) * (ay1 - ay0) - (by1 - by0) * (ax1 - ax0);
  146.  
  147. if (det == 0.0){
  148. return 0; // não há intersecção
  149. }
  150.  
  151. var s, x, y;
  152. s = ((bx1 - bx0) * (by0 - ay0) - (by1 - by0) * (bx0 - ax0))/det;
  153. x = ax0 + (ax1 - ax0) * s;
  154. y = ay0 + (ay1 - ay0) * s;
  155.  
  156. if (min(ax0,ax1)<= x && max(ax0,ax1) >= x && min(ay0,ay1)<= y && max(ay0,ay1) >= y){
  157. if (min(bx0,bx1)<= x && max(bx0,bx1) >= x && min(by0,by1)<= y && max(by0,by1) >= y){
  158. stroke(0);
  159. point(x,y);
  160. var ta, tb;
  161. ta = (x - ax0)/ a[1][0];
  162. tb = (x - bx0)/ b[1][0];
  163. console.log("ta = ", ta, tb);
  164. return [ta, tb];
  165. }
  166. }
  167. return 0;
  168. }
  169. function linhaAleatoria(){
  170. //tralca uma linha aleatoria se o argumento dado for menor que n.
  171. //e retorna uma uma lista de lista com os 4 pontos aleatorios
  172. var v = [];
  173. if (j<Math.trunc(n)){
  174. r1 = random(640);
  175. r2 = random(400);
  176. r3 = random(640);
  177. r4 = random(400);
  178. stroke(200);
  179.  
  180. v[0] = r3-r1;
  181. v[1] = r4-r2;
  182.  
  183. l[j]=[[r1, r2], v, []];
  184. line(r1, r2, r3, r4);
  185. console.log("vai ", j, l[j]);
  186. j++;
  187. linhaAleatoria();
  188. return;
  189. }else{
  190. return;
  191. }
  192. }
  193. function linhaPronta(i){
  194. //3 linhas fixas
  195. if (i<1){
  196. var x0, x1, y0, y1;
  197. var li=[]
  198. stroke(200);
  199. line(x0=50, y0=300, x1=600, y1=300); //linha paralela esquerda - 1
  200. l[0]=[[x0,y0],[x1-x0,y1-y0],[]];
  201. line(x0=200, y0=50, x1=500, y1=400); //linha paralela direita - 3
  202. l[1]=[[x0,y0],[x1-x0,y1-y0],[]];
  203. line(x0=100, y0=400, x1=400, y1=50); //linha cruza direita - 4
  204. l[2]=[[x0,y0],[x1-x0,y1-y0],[]];
  205. }
  206. }
  207. function insertionSort(lista, n) {
  208. //ordena um lista de tamanho n em ordem crescente
  209. var aux, i, x;
  210. for (i=1; i<n; i++){
  211. aux = lista[i];
  212. x = i-1;
  213. while (x>=0 && lista[x]>aux){
  214. lista[x+1] = lista[x];
  215. x--;
  216. }
  217. lista[x+1] = aux;
  218. }
  219. }// x => chave | v[] => vetor ordenado | e => Limite inferior (esquerda) | d => Limite Superior (direita)
  220. function pesquisaBinaria(x, v, e, d){
  221. var i = Math.trunc((e + d)/2);
  222. console.log();
  223. if (v[i] == x)
  224. return i;
  225. if (e >= d)
  226. return -1; // Não foi encontrado
  227. else
  228. if (v[i] < x)
  229. return pesquisaBinaria(x, v, i+1, d);
  230. else
  231. return pesquisaBinaria(x, v, e, i-1);
  232. }
  233. function buscarPonto(reta, t, contador){
  234. if ((p[contador][0] == reta && p[contador][1] == t) || (p[contador][2] == reta && p[contador][3] == t)){
  235. return contador;
  236. }else{
  237. buscarPonto(reta, t, contador+1);
  238. }
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement