calcul.c
Go to the documentation of this file.
1 /***************************************************/
2 /* Last Revised:
3 $Id: calcul.c 4129 2007-08-21 23:16:24Z gerkey $
4 */
5 /***************************************************/
6 
7 
8 #include "calcul.h"
9 
10 
11 
12 void transfor_directa_p(float x, float y,
13  Tsc *sistema, Tpf *sol){
14 
15  /* Esta funcion transforma el punto x,y en el sistema de coordenadas mas global*/
16  /* Es decir las coordenadas x y son vistas desde el sistema de coordenadas sistema*/
17  /* Y se las quiere transformar en el sistema de ref desde el que se sistema*/
18  /* Es la transformacion directa */
19 
20  float SinT,CosT;
21 
22  SinT=(float)sin(sistema->tita);
23  CosT=(float)cos(sistema->tita);
24 
25  sol->x=x*CosT-y*SinT+sistema->x;
26  sol->y=x*SinT+y*CosT+sistema->y;
27 
28  //fprintf(stderr,"input:<%f,%f> sis:<%f %f %f> sol:<%f %f>\n",x,y,sistema->x, sistema->y, sistema->tita,sol->x, sol->y);
29 
30 }
31 
32 void transfor_directa_pt0(float x, float y,
33  Tsc *sistema, Tpf *sol){
34 
35  /* Esta funcion transforma el punto x,y en el sistema de coordenadas mas global*/
36  /* Es decir las coordenadas x y son vistas desde el sistema de coordenadas sistema*/
37  /* Y se las quiere transformar en el sistema de ref desde el que se sistema*/
38  /* Es la transformacion directa */
39 
40  sol->x=x+sistema->x;
41  sol->y=y+sistema->y;
42 
43 }
44 
45 
46 void transfor_inversa_p(float x,float y,
47  Tsc *sistema, Tpf *sol){
48 
49  /* Esta funcion transforma el punto x,y en el sistema de coordenadas que entra*/
50  /* Las coordenadas x y se ven desde el sistema de coordenadas desde el que se tienen las */
51  /* las coordenadas de sistema */
52  /* Es la transformacion directa */
53 
54  float a13, a23;
55  float SinT,CosT;
56 
57  SinT=(float)sin(sistema->tita);
58  CosT=(float)cos(sistema->tita);
59 
60 
61  a13=-sistema->y*SinT-sistema->x*CosT;
62  a23=-sistema->y*CosT+sistema->x*SinT;
63 
64  sol->x=x*CosT+y*SinT+a13;
65  sol->y=-x*SinT+y*CosT+a23;
66 }
67 
68 float NormalizarPI(float ang){
69 
70  return (float)(ang+(2*M_PI)*floor((M_PI-ang)/(2*M_PI)));
71 }
72 
73 void inversion_sis(Tsc *sisIn, Tsc *sisOut){
74 
75  float c,s;
76 
77  c=(float)cos(sisIn->tita);
78  s=(float)sin(sisIn->tita);
79  sisOut->x =-c*sisIn->x-s*sisIn->y;
80  sisOut->y = s*sisIn->x-c*sisIn->y;
81  sisOut->tita = NormalizarPI(-sisIn->tita);
82 }
83 
84 void composicion_sis(Tsc *sis1,Tsc *sis2,Tsc *sisOut){
85 
86  Tpf sol;
87 
88  transfor_directa_p(sis2->x, sis2->y,
89  sis1, &sol);
90  sisOut->x=sol.x;
91  sisOut->y=sol.y;
92  sisOut->tita = NormalizarPI(sis1->tita+sis2->tita);
93 
94 }
95 
96 void car2pol(Tpf *in, Tpfp *out){
97 
98  out->r=(float)sqrt(in->x*in->x+in->y*in->y);
99  out->t=(float)atan2(in->y,in->x);
100 }
101 
102 void pol2car(Tpfp *in, Tpf *out){
103 
104  out->x=in->r*(float)cos(in->t);
105  out->y=in->r*(float)sin(in->t);
106 }
107 
108 
109 
110 
111 int corte_segmentos(float x1,float y1,float x2,float y2,
112  float x3,float y3,float x4,float y4,
113  Tpf *sol){
114 /* corte de segmentos */
115 /* TE DEVUELVE EL PUNTO DE CORTE EN EL SISTEMA QUE ESTEN LOS SEGMENTOS */
116 
117  float a1,a2,b1,b2,c1,c2,xm,ym,denominador,max1_x,max1_y,min1_x,min1_y;
118  float xerr,yerr;
119  int si1;
120  float error_redondeo;
121 
122  error_redondeo=(float)0.00001F;
123 
124  /* primera recta */
125  a1=y2-y1;
126  b1=x1-x2;
127  c1=y1*(-b1)-x1*a1;
128 
129  /* segunda recta */
130  a2=y4-y3;
131  b2=x3-x4;
132  c2=y3*(-b2)-x3*a2;
133 
134 
135  denominador=a1*b2-a2*b1;
136  if (denominador==0)
137  return 0;
138  else{
139  xm=(b1*c2-b2*c1)/denominador;
140  ym=(c1*a2-c2*a1)/denominador;
141 
142  xerr=xm+error_redondeo;
143  yerr=ym+error_redondeo;
144 
145  /* Comprobamos que cae entre los segmantos */
146  if (x1>x2){
147  max1_x=x1; min1_x=x2;
148  }
149  else{
150  max1_x=x2; min1_x=x1;
151  }
152  if (y1>y2){
153  max1_y=y1; min1_y=y2;
154  }
155  else{
156  max1_y=y2; min1_y=y1;
157  }
158  si1=0;
159  if (max1_x+error_redondeo>=xm && xerr>=min1_x && max1_y+error_redondeo>=ym && yerr>=min1_y)
160  si1=1;
161 
162 
163  if (si1){
164 
165  if (x3>x4){
166  max1_x=x3; min1_x=x4;
167  }
168  else{
169  max1_x=x4; min1_x=x3;
170  }
171  if (y3>y4){
172  max1_y=y3; min1_y=y4;
173  }
174  else{
175  max1_y=y4; min1_y=y3;
176  }
177 
178  if (max1_x+error_redondeo>=xm && xerr>=min1_x && max1_y+error_redondeo>=ym && yerr>=min1_y){
179  sol->x=xm;
180  sol->y=ym;
181  return 1;
182  }
183  }
184  return 0;
185  }
186 }
187 
void transfor_directa_p(float x, float y, Tsc *sistema, Tpf *sol)
Definition: calcul.c:12
float NormalizarPI(float ang)
Definition: calcul.c:68
float t
Definition: TData.h:34
float tita
Definition: TData.h:45
Definition: TData.h:26
#define M_PI
Definition: math_utils.h:7
float y
Definition: TData.h:28
void car2pol(Tpf *in, Tpfp *out)
Definition: calcul.c:96
float r
Definition: TData.h:33
void transfor_inversa_p(float x, float y, Tsc *sistema, Tpf *sol)
Definition: calcul.c:46
Definition: TData.h:42
float y
Definition: TData.h:44
float x
Definition: TData.h:43
void transfor_directa_pt0(float x, float y, Tsc *sistema, Tpf *sol)
Definition: calcul.c:32
void pol2car(Tpfp *in, Tpf *out)
Definition: calcul.c:102
void composicion_sis(Tsc *sis1, Tsc *sis2, Tsc *sisOut)
Definition: calcul.c:84
int corte_segmentos(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, Tpf *sol)
Definition: calcul.c:111
float x
Definition: TData.h:27
Definition: TData.h:32
void inversion_sis(Tsc *sisIn, Tsc *sisOut)
Definition: calcul.c:73


csm
Author(s): Andrea Censi
autogenerated on Tue May 11 2021 02:18:23