Browse Source

README-es.md edited online with Bitbucket

Jose R Ortiz Ubarri 8 years ago
parent
commit
b7117fd690
1 changed files with 29 additions and 24 deletions
  1. 29
    24
      README-es.md

+ 29
- 24
README-es.md View File

5
 ![rsz_mariposa1.png](images/rsz_mariposa1.png)
5
 ![rsz_mariposa1.png](images/rsz_mariposa1.png)
6
 ![rsz_mariposa.png](images/rsz_mariposa.png)
6
 ![rsz_mariposa.png](images/rsz_mariposa.png)
7
 
7
 
8
-[version 2016.02.02]
8
+[Version 2016- Tatiana]
9
 
9
 
10
 Una buena manera de organizar y estructurar los programas de computadoras es dividiéndolos en partes más pequeñas utilizando funciones. Cada función realiza una tarea específica del problema que estamos resolviendo.
10
 Una buena manera de organizar y estructurar los programas de computadoras es dividiéndolos en partes más pequeñas utilizando funciones. Cada función realiza una tarea específica del problema que estamos resolviendo.
11
 
11
 
12
-Haz visto que todos los programas en C++ deben contener la función `main` que es donde comienza el programa. Probablemente ya haz utilizado funciones como `pow`, `sin`, `cos`  o `sqrt` de la biblioteca de matemática `cmath`. Dado que en casi todas las experiencias de laboratorio futuras estarás utilizando funciones que ya han sido creadas, necesitas aprender cómo trabajar con ellas. Más adelante aprenderás cómo diseñarlas y validarlas. En esta experiencia de laboratorio invocarás y definirás funciones que calculan las coordenadas de los puntos de las gráficas de algunas curvas. También practicarás la implementación de expresiones aritméticas en C++.
12
+Haz visto que todos los programas en C++ deben contener la función `main` que es donde comienza el programa. Probablemente ya has utilizado funciones como `pow`, `sin`, `cos`  o `sqrt` de la biblioteca de matemática `cmath`. Dado que en casi todas las experiencias de laboratorio futuras estarás utilizando funciones que ya han sido creadas, necesitas aprender cómo trabajar con ellas. Más adelante aprenderás cómo diseñarlas y validarlas. En esta experiencia de laboratorio invocarás y definirás funciones que calculan las coordenadas de los puntos de las gráficas de algunas curvas. También practicarás la implementación de expresiones aritméticas en C++.
13
 
13
 
14
 
14
 
15
 ## Objetivos:
15
 ## Objetivos:
52
 
52
 
53
 ## Funciones
53
 ## Funciones
54
 
54
 
55
-En matemática, una función $$f$$ es una regla que se usa para asignar a cada elemento $$x$$ de un conjunto que se llama *dominio*, uno (y solo un) elemento $$y$$ de un conjunto que se llama *campo de valores*. Por lo general, esa regla se representa como una ecuación, $$y=f(x)$$. La variable $$x$$ es el parámetro de la función y la variable $$y$$ contendrá el resultado de la función. Una función puede tener más de un parámetro pero solo un resultado. Por ejemplo, una función puede tener la forma $$y=f(x_1,x_2)$$ en donde hay dos parámetros y para cada par $$(a,b)$$ que se use como argumento de la función, la función tiene un solo valor de $$y=f(a,b)$$. El dominio de la función te dice el tipo de valor que debe tener el parámetro y el campo de valores el tipo de valor que tendrá el resultado que devuelve la función.
55
+En matemática, una función $$f$$ es una regla que se usa para asignar a cada elemento $$x$$ de un conjunto que se llama *dominio*, uno (y solo un) elemento $$y$$ de un conjunto que se llama *campo de valores*. Por lo general, esa regla se representa como una ecuación, $$y=f(x)$$. La variable $$x$$ es el parámetro de la función y la variable $$y$$ contendrá el resultado de la función. Una función puede tener más de un parámetro pero solo un resultado. Por ejemplo, una función puede tener la forma $$y=f(x_1,x_2)$$ en donde hay dos parámetros y para cada par $$(a,b)$$ que se use como argumento de la función, la función tendrá un solo valor de $$y=f(a,b)$$. El dominio de la función te dice el tipo de valor que debe tener el parámetro y el campo de valores el tipo de valor que tendrá el resultado que devuelve la función.
56
 
56
 
57
 Las funciones en lenguajes de programación de computadoras son similares. Una función
57
 Las funciones en lenguajes de programación de computadoras son similares. Una función
58
-tiene una serie de instrucciones que toman los valores asignados a los parámetros y realiza alguna tarea. En C++ y en algunos otros lenguajes de programación,  las funciones pueden devolver a lo sumo un resultado, tal y como sucede en matemáticas. La única diferencia es que una función en programación puede que no devuelva valor (en este caso la función se declara `void`). Si la función va a devolver algún valor, se hace con la instrucción `return`. Al igual que en matemática tienes que especificar el dominio y el campo de valores, en programación tienes que especificar los tipos de valores que tienen los parámetros y el resultado que devuelve la función; esto lo haces al declarar la función.
58
+tiene una serie de instrucciones que toman los valores asignados a los parámetros y realiza alguna tarea. En C++ y en algunos otros lenguajes de programación,  las funciones pueden devolver a lo sumo un resultado, tal y como sucede en matemáticas. La única diferencia es que una función en programación puede que no devuelva un valor (en este caso la función se declara `void`). Si la función va a devolver algún valor, se hace con la instrucción `return`. Al igual que en matemática tienes que especificar el dominio y el campo de valores, en programación tienes que especificar los tipos de valores que tienen los parámetros y el resultado que devuelve la función; esto lo haces al declarar la función.
59
 
59
 
60
 ### Encabezado de una función:
60
 ### Encabezado de una función:
61
 
61
 
67
 
67
 
68
 `int ejemplo(int var1, float var2, char &var3)`
68
 `int ejemplo(int var1, float var2, char &var3)`
69
 
69
 
70
-sería el encabezado de la función llamada `ejemplo`, que devuelve un valor entero. La función recibe como argumentos un valor entero (y guardará una copia en `var1`), un valor de tipo `float` (y guardará una copia en `var2`) y la referencia a una variable de tipo  `char` que se guardará en la variable de referencia `var3`. Nota que `var3` tiene el signo `&` antes del nombre de la variable. Esto indica que `var3` contendrá la referencia a un caracter.
70
+sería el encabezado de la función llamada `ejemplo`, que devuelve un valor entero. La función recibe como argumentos un valor entero (y guardará una copia en `var1`), un valor de tipo `float` (y guardará una copia en `var2`) y la referencia a una variable de tipo  `char` que se guardará en la variable de referencia `var3`. Nota que `var3` tiene el signo `&` antes del nombre de la variable. Esto indica que `var3` contendrá la referencia a un carácter.
71
 
71
 
72
 ### Invocación
72
 ### Invocación
73
 
73
 
75
 
75
 
76
 `resultado = ejemplo(2, 3.5, unCar);`
76
 `resultado = ejemplo(2, 3.5, unCar);`
77
 
77
 
78
-Nota que al invocar funciones no incluyes el tipo de las variables en los argumentos. Como en la definición de la función `ejemplo` el tercer parámetro `&var3` es una variable de referencia, lo que se está enviando en el tercer argumento de la invocación es una *referencia* a la variable `unCar`. Los cambios que se hagan en la variable `var3` están cambiando el contenido de la variable `unCar`.
78
+Nota que al invocar funciones no incluyes el tipo de las variables en los argumentos como en la definición de la función `ejemplo`. El tercer parámetro `&var3` es una variable de referencia, esto significa que lo que se está enviando en el tercer argumento de la invocación es una *referencia* a la variable `unCar`. Los cambios que se hagan en la variable `var3` están cambiando el contenido de la variable `unCar`.
79
 
79
 
80
 También puedes usar el resultado de la función sin tener que guardarlo en una variable. Por ejemplo puedes imprimirlo:
80
 También puedes usar el resultado de la función sin tener que guardarlo en una variable. Por ejemplo puedes imprimirlo:
81
 
81
 
125
 
125
 
126
 Todas las funciones de arriba tienen el mismo nombre, `ejemplo`, pero distintos parámetros.  La primera y segunda función tienen la misma cantidad de parámetros, pero los argumentos son de distintos tipos.  La cuarta y quinta función tienen argumentos de tipo `char` e `int`, pero en cada caso están en distinto orden.
126
 Todas las funciones de arriba tienen el mismo nombre, `ejemplo`, pero distintos parámetros.  La primera y segunda función tienen la misma cantidad de parámetros, pero los argumentos son de distintos tipos.  La cuarta y quinta función tienen argumentos de tipo `char` e `int`, pero en cada caso están en distinto orden.
127
 
127
 
128
-En este último ejemplo la función ejemplo es sobrecargada ya que hay 5 funciones con firma distinta pero con el mismo nombre.
128
+En este último ejemplo la función ejemplo es sobrecargada ya que hay cinco funciones con firma distinta pero con el mismo nombre.
129
 
129
 
130
 
130
 
131
 
131
 
132
-### Valores por defecto
132
+### Valores predeterminados
133
 
133
 
134
-Se pueden asignar valores por defecto ("default") a los parámetros de las funciones comenzando desde el parámetro más a la derecha. No hay que inicializar todos los parámetros pero los que se inicializan deben ser consecutivos: no se puede dejar parámetros sin inicializar entre dos parámetros que estén inicializados. Esto permite la invocación de la función sin tener que enviar los valores en las posiciones que corresponden a parámetros inicializados.
134
+Se pueden asignar valores predeterminados ("default") a los parámetros de las funciones comenzando desde el parámetro que está más a la derecha. No hay que inicializar todos los parámetros pero los que se inicializan deben ser consecutivos: no se puede dejar parámetros sin inicializar entre dos parámetros que estén inicializados. Esto permite la invocación de la función sin tener que enviar los valores en las posiciones que corresponden a parámetros inicializados.
135
 
135
 
136
 **Ejemplos de encabezados de funciones e invocaciones válidas:**
136
 **Ejemplos de encabezados de funciones e invocaciones válidas:**
137
 
137
 
141
 
141
 
142
     a. `ejemplo(5, 3.3, 12)` Esta invocación asigna el valor 5 a `var1`, el valor 3.3 a `var2`, y el valor 12 a `var3`.
142
     a. `ejemplo(5, 3.3, 12)` Esta invocación asigna el valor 5 a `var1`, el valor 3.3 a `var2`, y el valor 12 a `var3`.
143
 
143
 
144
-    b. `ejemplo(5, 3.3)`  Esta invocación envía valores para los primeros dos parámetros y el valor del último parámetro será el valor por defecto asignado en el encabezado. Esto es, los valores de las variables en la función serán: `var1` tendrá 5, `var2` tendrá 3.3, y `var3` tendrá 10.
144
+    b. `ejemplo(5, 3.3)`  Esta invocación envía valores para los primeros dos parámetros y el valor del último parámetro será el valor predeterminado asignado en el encabezado. Esto es, los valores de las variables en la función serán: `var1` tendrá 5, `var2` tendrá 3.3, y `var3` tendrá 10.
145
 
145
 
146
 2. **Encabezado:** `int ejemplo(int var1, float var2=5.0, int var3 = 10)`
146
 2. **Encabezado:** `int ejemplo(int var1, float var2=5.0, int var3 = 10)`
147
 
147
 
149
 
149
 
150
     a. `ejemplo(5, 3.3, 12)` Esta invocación asigna el valor 5 a `var1`, el valor 3.3 a `var2`, y el valor 12 a  `var3`.
150
     a. `ejemplo(5, 3.3, 12)` Esta invocación asigna el valor 5 a `var1`, el valor 3.3 a `var2`, y el valor 12 a  `var3`.
151
 
151
 
152
-    b. `ejemplo(5, 3.3)` En esta invocación solo se envían valores para los primeros dos parámetros, y el valor del último parámetro es el valor por defecto.  Esto es, el valor de `var1` dentro de la función será 5, el de `var2` será 3.3 y el de `var3` será 10.
152
+    b. `ejemplo(5, 3.3)` En esta invocación solo se envían valores para los primeros dos parámetros, y el valor del último parámetro es el valor predeterminado.  Esto es, el valor de `var1` dentro de la función será 5, el de `var2` será 3.3 y el de `var3` será 10.
153
 
153
 
154
-    c. `ejemplo(5)` En esta invocación solo se envía valor para el primer parámetro, y los últimos dos parámetros tienen valores por defecto.  Esto es,  el valor de `var1` dentro de la función será 5, el de `var2` será 5.0 y el de `var3` será 10.
154
+    c. `ejemplo(5)` En esta invocación solo se envía valor para el primer parámetro, y los últimos dos parámetros tienen valores predetermiandos.  Esto es,  el valor de `var1` dentro de la función será 5, el de `var2` será 5.0 y el de `var3` será 10.
155
 
155
 
156
 **Ejemplo de un encabezado de funciones válido con invocaciones inválidas:**
156
 **Ejemplo de un encabezado de funciones válido con invocaciones inválidas:**
157
 
157
 
165
 
165
 
166
 **Ejemplos de encabezados de funciones inválidos:**
166
 **Ejemplos de encabezados de funciones inválidos:**
167
 
167
 
168
-1. `int ejemplo(int var1=1, float var2, int var3)` Este encabezado es inválido porque los valores por defecto solo se pueden asignar comenzando por el parámetro más a la derecha.
168
+1. `int ejemplo(int var1=1, float var2, int var3)` Este encabezado es inválido porque los valores predeterminados sólo se pueden asignar comenzando por el parámetro que está más a la derecha.
169
 
169
 
170
-2. `int ejemplo(int var1=1, float var2, int var3=10)` Este encabezado es inválido porque no se pueden poner parámetros sin valores en medio de parámetros con valores por defecto. En este caso  `var2` no tiene valor pero `var1` y `var3` si.
170
+2. `int ejemplo(int var1=1, float var2, int var3=10)` Este encabezado es inválido porque no se pueden poner parámetros sin valores en medio de parámetros con valores predeterminados. En este caso  `var2` no tiene valor pero `var1` y `var3` si tienen.
171
 
171
 
172
 
172
 
173
 
173
 
177
 
177
 
178
 ## Ecuaciones paramétricas
178
 ## Ecuaciones paramétricas
179
 
179
 
180
-Las *ecuaciones paramétricas* nos permiten representar una cantidad como función de una o más variables independientes llamadas *parámetros*. En muchas ocasiones resulta útil representar curvas utilizando un conjunto de ecuaciones paramétricas que expresen las coordenadas de los puntos de la curva como funciones de los parámetros. Por ejemplo, en tu curso de trigonometría debes haber estudiado que la ecuación de un círculo con radio $$r$$ y centro en el origen tiene una forma así:
180
+Las *ecuaciones paramétricas* nos permiten representar una cantidad como función de una o más variables independientes llamadas *parámetros*. En muchas ocasiones resulta útil representar curvas utilizando un conjunto de ecuaciones paramétricas que expresan las coordenadas de los puntos de la curva como funciones de los parámetros. Por ejemplo, en tu curso de trigonometría debes haber estudiado que la ecuación de un círculo con radio $$r$$ y centro en el origen tiene una forma así:
181
 
181
 
182
 $$x^2+y^2=r^2.$$
182
 $$x^2+y^2=r^2.$$
183
 
183
 
184
 
184
 
185
-Los puntos $$(x,y)$$ que satisfacen esta ecuación son los puntos que forman el círculo de radio $$r$$ y centro en el origen.  Por ejemplo, el círculo con $$r=2$$ y centro en el origen tiene ecuación
185
+Los puntos $$(x,y)$$ que satisfacen esta ecuación son los puntos que forman el círculo de radio $$r$$ y su centro en el origen.  Por ejemplo, el círculo con $$r=2$$ y centro en el origen tiene ecuación
186
 
186
 
187
 $$x^2+y^2=4,$$
187
 $$x^2+y^2=4,$$
188
 
188
 
192
 
192
 
193
 $$y=r \sin(t),$$
193
 $$y=r \sin(t),$$
194
 
194
 
195
-donde $$t$$ es un parámetro que corresponde a la medida (en radianes) del ángulo positivo con lado inicial que coincide con la parte positiva del eje de $$x$$, y lado terminal que contiene el punto $$(x,y)$$, como se muestra en la Figura 1.
195
+donde $$t$$ es un parámetro que corresponde a la medida (en radianes) del ángulo positivo con un lado inicial que coincide con la parte positiva del eje de $$x$$, y un lado terminal que contiene el punto $$(x,y)$$, como se muestra en la Figura 1.
196
 
196
 
197
 
197
 
198
 ---
198
 ---
247
 
247
 
248
 **Instrucciones**
248
 **Instrucciones**
249
 
249
 
250
-1. Descarga la carpeta `Functions-PrettyPlots` de `Bitbucket` usando un terminal, moviéndote al directorio `Documents/eip`,  y escribiendo el comando `git clone http://bitbucket.org/eip-uprrp/functions-prettyplots`.
250
+1. Carga a `QtCreator` el proyecto `prettyPlot`. Hay dos maneras de hacer esto: 
251
+		*Utilizando la máquina virtual: Haz doble “click” en el archivo `prettyPlot.pro` que se encuentra en el directorio `home/eip/labs/functions-prettyplots` de la máquina virtual.
252
+		*Descargando la carpeta de `Bitbucket`: Utiliza un terminal y escribe el comando `git clone http://bitbucket.org/eip-uprrp/functions-prettyplots` para descargar la carpeta `functions-prettyplots` de `Bitbucket`. En esa carpeta, haz doble “click” en el archivo `prettyPlot.pro`.
251
 
253
 
252
 2. Carga a Qt Creator el proyecto `prettyPlot`  haciendo doble "click" en el archivo `prettyPlot.pro` que se encuentra en la carpeta `Documents/eip/functions-prettyplots` de tu computadora.
254
 2. Carga a Qt Creator el proyecto `prettyPlot`  haciendo doble "click" en el archivo `prettyPlot.pro` que se encuentra en la carpeta `Documents/eip/functions-prettyplots` de tu computadora.
253
 
255
 
254
-3. Configura el proyecto y ejecuta el programa marcando la flecha verde en el menú de la izquierda de la interface de Qt Creator. El programa debe mostrar una ventana parecida a la Figura 3.
256
+3. Configura el proyecto y ejecuta el programa marcando la flecha verde en el menú de la izquierda de la interface de `QtCreator`. El programa debe mostrar una ventana parecida a la Figura 3.
255
 
257
 
256
    ---
258
    ---
257
 
259
 
270
                  << "The content of paramRef is: " << paramRef << endl;
272
                  << "The content of paramRef is: " << paramRef << endl;
271
         }
273
         }
272
 
274
 
273
-5. Ejecuta el programa y observa lo que se despliega en la ventana `Application Output`. Nota la diferencia entre el contenido las variables `argValue` y `argRef` a pesar de que ambas tenían el mismo valor inicial y de que a `paramValue` y `paramRef` se les asignó el mismo valor. Explica por qué el contenido de `argValue` no cambia, mientras que el contenido de `argRef` cambia de 0 a 1.
275
+5. Ejecuta el programa y observa lo que se despliega en la ventana `Application Output`. Nota la diferencia entre el contenido las variables `argValue` y `argRef` a pesar de que ambas tenían el mismo valor inicial y que a `paramValue` y `paramRef` se les asignó el mismo valor. Explica por qué el contenido de `argValue` no cambia, mientras que el contenido de `argRef` cambia de 0 a 1.
274
 
276
 
275
 ### Ejercicio 2
277
 ### Ejercicio 2
276
 
278
 
278
 
280
 
279
 **Instrucciones**
281
 **Instrucciones**
280
 
282
 
281
-1. Estudia el código de la función `main()` del archivo `main.cpp`. La línea `XYPlotWindow wCircleR5;` crea el objeto `wCircleR5` que será la ventana en donde se dibujará una gráfica, en este caso la gráfica de un círculo de radio 5. De manera similar se crean los objetos `wCircle` y `wButterfly`. Observa el ciclo `for`. En este ciclo se genera una serie de valores para el ángulo $$t$$ y se invoca la función `circle`, pasándole el valor de $$t$$ y las referencias a $$x$$ y $$y$$. La función `circle` no devuelve valor pero, usando parámetros por referencia, calcula valores para las coordenadas $$xCoord$$ y $$yCoord$$ del círculo con centro en el origen y radio 5 y permite que la función `main` tenga esos valores en las variables `x` , `y`.
283
+1. Estudia el código de la función `main()` del archivo `main.cpp`. La línea `XYPlotWindow wCircleR5;` crea el objeto `wCircleR5` que será la ventana en donde se dibujará una gráfica, en este caso la gráfica de un círculo de radio 5. De manera similar se crean los objetos `wCircle` y `wButterfly`. Observa el ciclo `for`. En este ciclo se genera una serie de valores para el ángulo $$t$$ y se invoca la función `circle`, pasándole el valor de $$t$$ y las referencias a $$x$$ y $$y$$. La función `circle` no devuelve valor pero, usando parámetros por referencia, calcula valores para las coordenadas $$xCoord$$ y $$yCoord$$ del círculo con centro en el origen y radio 5. Además, permite que la función `main` tenga esos valores en las variables `x` , `y`.
282
 
284
 
283
         XYPlotWindow wCircleR5;
285
         XYPlotWindow wCircleR5;
284
         XYPlotWindow wCircle;
286
         XYPlotWindow wCircle;
306
             // añade el punto (x,y) a la gráfica del círculo
308
             // añade el punto (x,y) a la gráfica del círculo
307
             wCircleR5.AddPointToGraph(x,y);
309
             wCircleR5.AddPointToGraph(x,y);
308
 
310
 
309
-    Luego de la invocación, cada par ordenado $$(x,y)$$  es añadido a la gráfica del círculo por el método `AddPointToGraph(x,y)`. Luego del ciclo se invoca el método `Plot()`, que "dibuja" los puntos, y el método `show()`, que muestra la gráfica. Los *métodos* son funciones que nos permiten trabajar con los datos de los objetos. Nota que cada uno de los métodos se escribe luego de `wCircleR5`, seguido de un punto. En una experiencia de laboratorio posterior aprenderás más sobre objetos y practicarás cómo crearlos e invocar sus métodos.
311
+    Luego de la invocación, cada par ordenado $$(x,y)$$  es añadido a la gráfica del círculo por el método `AddPointToGraph(x,y)`. Luego del ciclo se invoca el método `Plot()`, que "dibuja" los puntos, y el método `show()`, que muestra la gráfica. Los *métodos* son funciones que nos permiten trabajar con los datos de los objetos. Nota que cada uno de los métodos se escribe luego de `wCircleR5`, seguido de un punto. En una experiencia de laboratorio posterior, aprenderás más sobre objetos y practicarás cómo crearlos e invocar sus métodos.
310
 
312
 
311
     La función `circle` implementada en el programa es muy restrictiva ya que siempre calcula los valores para las coordenadas $$x$$ y $$y$$ del mismo círculo: el círculo con centro en el origen y radio 5.
313
     La función `circle` implementada en el programa es muy restrictiva ya que siempre calcula los valores para las coordenadas $$x$$ y $$y$$ del mismo círculo: el círculo con centro en el origen y radio 5.
312
 
314
 
313
-2. Ahora crearás una función sobrecargada `circle` que reciba como argumentos el valor del ángulo $$t$$, la referencia a las variables $$x$$ y $$y$$, y el valor para el radio del círculo. Invoca desde `main()` la función sobrecargada  `circle` que acabas de implementar para calcular los valores de las coordenadas $$x$$ y $$y$$ del círculo con radio 15 y dibujar su gráfica. Grafica el círculo dentro del objeto `wCircle`. Para esto, debes invocar desde `main()` los métodos `AddPointToGraph(x,y)`, `Plot` y `show`. Recuerda que éstos deben ser precedidos por `wCircle`, por ejemplo, `wCircle.show()`.
315
+2. Ahora crearás una función sobrecargada `circle` que reciba como argumentos el valor del ángulo $$t$$, la referencia a las variables $$x$$ y $$y$$, y el valor para el radio del círculo. Invoca desde `main()` la función sobrecargada  `circle` que acabas de implementar para calcular los valores de las coordenadas $$x$$ y $$y$$ del círculo con radio 15 y dibujar su gráfica. Gráfica el círculo dentro del objeto `wCircle`. Para esto, debes invocar desde `main()` los métodos `AddPointToGraph(x,y)`, `Plot` y `show`. Recuerda que éstos deben ser precedidos por `wCircle`, por ejemplo, `wCircle.show()`.
314
 
316
 
315
 ### Ejercicio 3
317
 ### Ejercicio 3
316
 
318
 
317
-En este ejercicio implantarás otra función para calcular las coordenadas de los puntos de la gráfica de una curva.
319
+En este ejercicio implementarás otra función para calcular las coordenadas de los puntos de la gráfica de una curva.
318
 
320
 
319
 **Instrucciones**
321
 **Instrucciones**
320
 
322
 
358
 [2] http://paulbourke.net/geometry/butterfly/
360
 [2] http://paulbourke.net/geometry/butterfly/
359
 
361
 
360
 [3] http://en.wikipedia.org/wiki/Parametric_equation
362
 [3] http://en.wikipedia.org/wiki/Parametric_equation
363
+
364
+
365
+