Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.83 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5. #include "geometria.h"
  6.  
  7. float dist_dots(dot_t p0, dot_t p1)
  8. {
  9. /********************************************************************************
  10. * FUNSÃO: Calcula a distância entre dois pontos *
  11. * ENTRADA: Ponto (dot_t) P0 e Ponto (dot_t) P1 *
  12. * SAÍDA: Distancia (float) dist *
  13. * *
  14. * DESENVOLVEDOR: Vitor Rodrigues Di Toro" *
  15. * ULTIMA ALTERAÇÃO: 21/10/2016 *
  16. ********************************************************************************/
  17.  
  18. float dist;
  19. int dx, dy;
  20.  
  21. dx = (p1.x - p0.x);
  22. dy = (p1.y - p0.y);
  23.  
  24. dist = pow(dx,2) + pow(dy,2);
  25. dist = pow(dist, 0.5); //Square Root
  26.  
  27. return dist;
  28. }
  29.  
  30.  
  31. int cross_product_dots(dot_t p0, dot_t p1, dot_t p2)
  32. {
  33. /********************************************************************************
  34. * FUNSÃO: Calcular o produto vetorial entre os vetores definidos por 3 pontos *
  35. * ENTRADA: Ponto (dot_t) P0, Ponto (dot_t) P1 e Ponto (dot_t) P2 *
  36. * SAÍDA: Inteiro (int) det *
  37. * *
  38. * DESENVOLVEDOR: Vitor Rodrigues Di Toro" *
  39. * ULTIMA ALTERAÇÃO: 21/10/2016 *
  40. ********************************************************************************/
  41.  
  42. int det = 0;
  43.  
  44. det += ((p0.x * p1.y) + (p0.y * p2.x) + (p1.x * p2.y)); // Positive part
  45. det -= ((p0.x * p2.y) + (p1.x * p0.y) + (p2.x * p1.y)); // Negative part
  46.  
  47. return det;
  48. }
  49.  
  50. int cross_product(line_t u, line_t v)
  51. {
  52. /********************************************************************************
  53. * FUNSÃO: Calcular o produto vetorial entre dois vetores. *
  54. * ENTRADA: Vetor (line_t) U e vetor(line_t) V *
  55. * SAÍDA: Inteiro (int) det *
  56. * *
  57. * DESENVOLVEDOR: Vitor Rodrigues Di Toro" *
  58. * ULTIMA ALTERAÇÃO: 21/10/2016 *
  59. ********************************************************************************/
  60.  
  61. if((u.p0.x != v.p0.x) || (u.p0.y != v.p0.y))
  62. {
  63. printf("IN CROSS_PRODUCT:\nArgumentos invalidos. Os vetores nao possuem o mesmo ponto de origem.");
  64. return NULL; //Zero
  65. }
  66.  
  67. return cross_product_dots(u.p0, u.p1, v.p1);
  68. }
  69.  
  70. line_t trans_vet(line_t u)
  71. {
  72. /********************************************************************************
  73. * FUNSÃO: Retorna o vetor transposto do vetor argumento. *
  74. * ENTRADA: Vetor (line_t) u *
  75. * SAÍDA: Vetor (line_t) ut *
  76. * *
  77. * DESENVOLVEDOR: Vitor Rodrigues Di Toro" *
  78. * ULTIMA ALTERAÇÃO: 21/10/2016 *
  79. ********************************************************************************/
  80.  
  81. line_t ut;
  82.  
  83. ut.p0 = u.p1;
  84. ut.p1 = u.p0;
  85.  
  86. return ut;
  87. }
  88.  
  89. int area_rectangle(dot_t p0, dot_t p1)
  90. {
  91. /********************************************************************************
  92. * FUNSÃO: Calcular a área do retando de origem em P0 e fim em P1. *
  93. * ENTRADA: 2 Pontos (dot_t) de definição do retangulo, P0 e P1. *
  94. * SAÍDA: Area (int) do retangulo. *
  95. * *
  96. * DESENVOLVEDOR: Vitor Rodrigues Di Toro" *
  97. * ULTIMA ALTERAÇÃO: 21/10/2016 *
  98. ********************************************************************************/
  99.  
  100. int area = (abs(p1.x - p0.x) * abs(p1.y - p0.y));
  101. return area;
  102. }
  103.  
  104. float area_triangle(dot_t p0, dot_t p1, dot_t p2)
  105. {
  106. /********************************************************************************
  107. * FUNSÃO: Calcular a área do triangulo formado pelos pontos P0, P1 e P2 *
  108. * ENTRADA: 3 pontos (dot_t), P0, P1 e P2. *
  109. * SAÍDA: Area (float) do triangulo. *
  110. * *
  111. * DESENVOLVEDOR: Vitor Rodrigues Di Toro" *
  112. * ULTIMA ALTERAÇÃO: 21/10/2016 *
  113. ********************************************************************************/
  114.  
  115. float area = 0.5 * abs(cross_product_dots(p0, p1, p2));
  116. return area;
  117. }
  118.  
  119. int relative_position(dot_t p, dot_t p0, dot_t p1)
  120. {
  121. /********************************************************************************
  122. * FUNSÃO: Determina a posição relativa do ponto P ao segmento suporte formado *
  123. * pelos pontos P0 e P1. *
  124. * ENTRADA: 3 pontos (dot_t), P, P1 e P2. *
  125. * SAÍDA: Inteiro (int) no valor de: *
  126. * 0 - se os 3 pontos forem colineares; *
  127. * 1 - se P estiver à direito do segmento suporte (P1 e P2); *
  128. * -1 - se P estiver à esquerda do segmento suporte (P1 e P2); *
  129. * *
  130. * DESENVOLVEDOR: Vitor Rodrigues Di Toro" *
  131. * ULTIMA ALTERAÇÃO: 21/10/2016 *
  132. ********************************************************************************/
  133.  
  134. float s;
  135.  
  136. s = cross_product_dots(p, p0, p1);
  137.  
  138. if(s==0)
  139. {
  140. return 0; // line
  141. }
  142. else if(s>0)
  143. {
  144. return -1; // left side
  145. }
  146. else
  147. {
  148. return 1; // right side
  149. }
  150. }
  151.  
  152. int pontoEmTriangulo(dot_t p, dot_t p0, dot_t p1, dot_t p2)
  153. {
  154. /********************************************************************************
  155. * FUNSÃO: Determinar se um dado ponto P está contido no triangulo formado *
  156. * pelos pontos P0, P1 e P2. *
  157. * ENTRADA: 4 pontos (dot_t). P, P0, P1 e P3. *
  158. * SAÍDA: Inteiro (int). 0 se falso e 1 se verdadeiro. *
  159. * *
  160. * DESENVOLVEDOR: Vitor Rodrigues Di Toro" *
  161. * ULTIMA ALTERAÇÃO: 22/10/2016 *
  162. ********************************************************************************/
  163.  
  164. int d1, d2, d3;
  165.  
  166. d1 = relative_position(p,p0,p1);
  167. d2 = relative_position(p,p1,p2);
  168. d3 = relative_position(p,p2,p0);
  169.  
  170. if((d1 == d2) && (d2 == d3))
  171. {
  172. return TRUE;
  173. }
  174. else
  175. {
  176. return FALSE;
  177. }
  178. }
  179.  
  180. int pontoEmQuadrilatero(dot_t p, dot_t p0, dot_t p1, dot_t p2, dot_t p3)
  181. {
  182. /********************************************************************************
  183. * FUNSÃO: Determinar se um dado ponto P está contido no quadrilatero formado *
  184. * pelos pontos P0, P1, P2 e P3. *
  185. * ENTRADA: 5 pontos (dot_t), P, P0, P1, P2 e P3. *
  186. * SAÍDA: Inteiro (int). 0 se falso e 1 se verdadeiro *
  187. * *
  188. * DESENVOLVEDOR: Vitor Rodrigues Di Toro" *
  189. * ULTIMA ALTERAÇÃO: 22/10/2016 *
  190. ********************************************************************************/
  191.  
  192. int result;
  193. float dist0, dist1, dist2, dist3;
  194.  
  195. dist0 = dist_dots(p,p0);
  196. dist1 = dist_dots(p,p1);
  197. dist2 = dist_dots(p,p2);
  198. dist3 = dist_dots(p,p3);
  199.  
  200.  
  201. result = ((pontoEmTriangulo(p,p0,p1,p2) || pontoEmTriangulo(p,p2,p3,p0)) || //Realia a análise dividindo o quadrilatero em 2 triangulos
  202. (pontoEmTriangulo(p,p0,p1,p3) || pontoEmTriangulo(p,p1,p2,p3)) || //Realia a análise dividindo o quadrilatero em 2 triangulos
  203. ((dist0 == dist1) && (dist1 == dist2) && (dist2 == dist3))); //Realia a análise do ponto central
  204.  
  205. return result;
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement