public NumeroComplejo parsearComplejo(string complejo)
        {
            Regex ERPolar    = new Regex("^[[](?<a>[-]?[0-9]+([,][0-9]+)?)[;](?<b>[-]?[0-9]+([,][0-9]+)?)[]]$");
            Regex ERBinomica = new Regex("^[(](?<a>[-]?[0-9]+([,][0-9]+)?)[;](?<b>[-]?[0-9]+([,][0-9]+)?)[)]$");

            if (ERPolar.IsMatch(complejo))
            {
                NumeroComplejo z = new NumeroComplejo(0, 0, NumeroComplejo.Forma.Polar);

                foreach (Match mt in ERPolar.Matches(complejo))
                {
                    z.a = Double.Parse(mt.Groups["a"].Value);
                    z.b = Double.Parse(mt.Groups["b"].Value);
                }
                return(z);
            }
            else //if(ERBinomica.IsMatch(complejo))
            {
                NumeroComplejo z = new NumeroComplejo(0, 0, NumeroComplejo.Forma.Binomica);

                foreach (Match mt in ERBinomica.Matches(complejo))
                {
                    z.a = Double.Parse(mt.Groups["a"].Value);
                    z.b = Double.Parse(mt.Groups["b"].Value);
                }
                return(z);
            }
        }
        public Funcion sumarFunciones(Funcion unaFuncion, Funcion otraFuncion)
        {
            var faseUnaFuncion  = unaFuncion.fase;
            var faseOtraFuncion = otraFuncion.fase;


            //Voy a trabajar todo a senos o pasarlo según necesite
            if (unaFuncion.tipoFuncion == TipoFuncion.Cos)
            {
                faseUnaFuncion = faseUnaFuncion + Math.PI / 2;
            }

            if (otraFuncion.tipoFuncion == TipoFuncion.Cos)
            {
                faseOtraFuncion = faseOtraFuncion + Math.PI / 2;
            }

            //Los convierto a complejos
            var fasorDeUnaFuncion  = new NumeroComplejo(unaFuncion.amplitud, faseUnaFuncion, NumeroComplejo.Forma.Polar);
            var fasorDeOtraFuncion = new NumeroComplejo(otraFuncion.amplitud, faseOtraFuncion, NumeroComplejo.Forma.Polar);

            var resultadoSuma = fasorDeOtraFuncion.sumarComplejos(fasorDeOtraFuncion);

            var resultadoFase = resultadoSuma.b;

            return(new Funcion(resultadoSuma.a, TipoFuncion.Sen, otraFuncion.frecuencia, resultadoFase));
        }
        public NumeroComplejo DividirComplejos(NumeroComplejo z2)
        {
            NumeroComplejo z3 = new NumeroComplejo(0, 0, Forma.Binomica);
            NumeroComplejo z  = new NumeroComplejo(0, 0, Forma.Binomica);

            z    = this.formaBinomica();
            z2   = z2.formaBinomica();
            z3.a = ((z.a * z2.a) + (z.b * z2.b)) / (Math.Pow(z2.a, 2) + Math.Pow(z2.b, 2));
            z3.b = ((z.b * z2.a) - (z.a * z2.b)) / (Math.Pow(z2.a, 2) + Math.Pow(z2.b, 2));
            return(z3);
        }
        public NumeroComplejo multiplicarComplejos(NumeroComplejo z2)
        {
            NumeroComplejo z3 = new NumeroComplejo(0, 0, Forma.Binomica);
            NumeroComplejo z  = new NumeroComplejo(0, 0, Forma.Binomica);

            z    = this.formaBinomica();
            z2   = z2.formaBinomica();
            z3.a = (z.a * z2.a) - (z.b * z2.b);
            z3.b = (z.a * z2.b) + (z2.a * z.b);
            return(z3);
        }
        private void buttonOperar_Click(object sender, EventArgs e)
        {
            if (textBoxComplejo.Text == "" || textBoxIndice.Text == "")
            {
                MessageBox.Show("Debe Ingresar los 2 campos para operar!");
            }
            else
            {
                OperacionesBasicas OB = new OperacionesBasicas();
                if (!OB.esComplejoValido(this.textBoxComplejo.Text) || !this.esIndiceValido(textBoxIndice.Text)) // || !OperacionesBasicas.esComplejoValido(textBoxIndice.Text)
                {
                    MessageBox.Show("Debe ingresar el número complejo de la siguiente manera: forma binómica (a;b) o forma polar [a;b] - El índice debe ser un entero");
                }
                else
                {
                    int            n;
                    NumeroComplejo z1 = OB.parsearComplejo(textBoxComplejo.Text);
                    Int32.TryParse(textBoxIndice.Text, out n);

                    if (comboBoxOperaciones.SelectedIndex == -1)
                    {
                        MessageBox.Show("Debe seleccionar una operación!");
                    }
                    else
                    {
                        switch (comboBoxOperaciones.SelectedIndex)
                        {
                        case 0:     //Potenciación
                            NumeroComplejo zres = new NumeroComplejo(0, 0, NumeroComplejo.Forma.Binomica);
                            zres = z1.potencia(n);
                            comboBox1.Items.Clear();
                            comboBox1.Items.Add("(" + Math.Round(zres.formaBinomica().a, 3) + " ; " + Math.Round(zres.formaBinomica().b, 3) + ")" + " - [" + Math.Round(zres.formaPolar().a, 3) + " ; " + Math.Round(zres.formaPolar().b, 3) + " rad]");
                            comboBox1.SelectedIndex = 0;
                            break;

                        case 1:     //Radicación
                            List <NumeroComplejo> listaResultados = z1.raiz(n);
                            int k = 0;
                            comboBox1.Items.Clear();

                            listaResultados.ForEach(delegate(NumeroComplejo Z)
                            {
                                comboBox1.Items.Add("K=" + k + "-> (" + Math.Round(Z.formaBinomica().a, 3) + " ; " + Math.Round(Z.formaBinomica().b, 3) + ")" + " - [" + Math.Round(Z.formaPolar().a, 3) + " ; " + Math.Round(Z.formaPolar().b, 3) + " rad]");
                                k++;
                            });
                            comboBox1.SelectedIndex = 0;
                            break;
                        }
                    }
                }
            }
        }
 public NumeroComplejo formaPolar()
 {
     if (this.forma == Forma.Polar)
     {
         return(this);
     }
     else
     {
         //si no está en forma polar, calcular su módulo y argumento
         //a : modulo, b:argumento
         NumeroComplejo z         = new NumeroComplejo(0, 0, Forma.Polar);
         double         parteReal = this.a;
         double         parteIm   = this.b;
         int            cuadrante = this.cuadrante();
         z.a = Math.Sqrt((parteReal * parteReal) + (parteIm * parteIm));
         //si no es imaginario puro
         if (parteReal != 0)
         {
             if (parteIm != 0)
             {
                 z.b = Math.Atan(parteIm / parteReal);
                 z   = z.corregirArgumento(cuadrante);
             }
             else //está sobre el eje real
             {
                 if (parteReal > 0)
                 {
                     z.b = 0;
                 }
                 else
                 {
                     z.b = Math.PI;
                 }
             }
         }
         //si es imaginario puro
         else
         {
             if (parteIm > 0)
             {
                 z.b = Math.PI / 2;
             }
             else if (parteIm < 0)
             {
                 z.b = Math.PI * 3 / 4;
             }
         }
         return(z);
     }
 }
        public NumeroComplejo potencia(int exponente)
        {
            NumeroComplejo zres = new NumeroComplejo(0, 0, Forma.Polar);
            double         modulo;
            double         argumento;

            modulo    = Math.Pow(this.formaPolar().a, exponente); //el modulo es el modulo^n
            argumento = exponente * this.formaPolar().b;

            zres.a = modulo;
            zres.b = argumento;

            return(zres);
        }
        public NumeroComplejo formaBinomica()
        {
            if (this.forma == Forma.Binomica)
            {
                return(this);
            }
            else
            {
                //si no está en forma binómica, calcular su Re(z) e Im(z)
                NumeroComplejo z = new NumeroComplejo(0, 0, Forma.Binomica);

                //z.forma = Forma.Binomica;
                z.a = this.a * Math.Cos(this.b);
                z.b = this.a * Math.Sin(this.b);
                return(z);
            }
        }
        public NumeroComplejo restarComplejos(NumeroComplejo z2)
        {
            NumeroComplejo z3 = new NumeroComplejo(0, 0, Forma.Binomica);

            if (this.forma == Forma.Binomica)
            {
                if (z2.forma == Forma.Binomica)
                {
                    z3.a = this.a - z2.a;
                    z3.b = this.b - z2.b;
                    return(z3);
                }
                else
                {
                    z2   = z2.formaBinomica();
                    z3.a = this.a - z2.a;
                    z3.b = this.b - z2.b;
                    return(z3);
                }
            }
            else //this en forma polar
            {
                NumeroComplejo z = new NumeroComplejo(0, 0, Forma.Binomica);
                z = this.formaBinomica(); //lo que tngo en this, lo paso a binomica y lo asigno a z
                if (z2.forma == Forma.Binomica)
                {
                    z3.a = z.a - z2.a;
                    z3.b = z.b - z2.b;
                    return(z3.formaPolar());
                }
                else
                {
                    z2   = z2.formaBinomica();
                    z3.a = z.a - z2.a;
                    z3.b = z.b - z2.b;
                    return(z3.formaPolar());
                }
            }
        }
Пример #10
0
        private void buttonTransformar_Click(object sender, EventArgs e)
        {
            OperacionesBasicas OB = new OperacionesBasicas();

            if (!OB.esComplejoValido(this.textBoxComplejo.Text))
            {
                MessageBox.Show("Debe ingresar el número complejo de la siguiente manera: forma binómica (a;b) o forma polar [a;b]");
            }
            else
            {
                NumeroComplejo z1 = OB.parsearComplejo(textBoxComplejo.Text);

                if (z1.forma == NumeroComplejo.Forma.Binomica)
                {
                    NumeroComplejo zRes = z1.formaPolar();
                    labelResultado.Text = "[" + Math.Round(zRes.a, 3) + ";" + Math.Round(zRes.b, 3) + "]";
                }
                else
                {
                    NumeroComplejo zRes = z1.formaBinomica();
                    labelResultado.Text = "(" + Math.Round(zRes.a, 3) + ";" + Math.Round(zRes.b, 3) + ")";
                }
            }
        }
        private void buttonOperar_Click(object sender, EventArgs e)
        {
            if (textBoxComplejo1.Text == "" || textBoxComplejo2.Text == "")
            {
                MessageBox.Show("Debe Ingresar los 2 números complejos para operar!");
            }
            else
            {
                if (!this.esComplejoValido(textBoxComplejo1.Text) || !this.esComplejoValido(textBoxComplejo2.Text))
                {
                    MessageBox.Show("Debe Ingresar los números complejos de la siguiente manera: forma binómica (a;b) o forma polar [a;b]");
                    //MessageBox.Show(textBoxComplejo1.Text, textBoxComplejo2.Text);
                }
                else
                {
                    //aca se sacarian los numeros de cada textbox, de su expresion regular, se crean los complejos y se ejecuta la operacion correspondiente

                    //luego opero

                    //por ahora los hardcodeo...
                    //NumeroComplejo z1 = new NumeroComplejo(2, 3, NumeroComplejo.Forma.Binomica);
                    //algo asi
                    NumeroComplejo z1 = this.parsearComplejo(textBoxComplejo1.Text);
                    NumeroComplejo z2 = this.parsearComplejo(textBoxComplejo2.Text);

                    NumeroComplejo zres = new NumeroComplejo(0, 0, NumeroComplejo.Forma.Binomica);

                    if (comboBoxOperaciones.SelectedIndex == -1)
                    {
                        MessageBox.Show("Debe seleccionar una operación!");
                    }
                    else
                    {
                        switch (comboBoxOperaciones.SelectedIndex)
                        {
                        case 0:     //sumar
                            zres = z1.sumarComplejos(z2);

                            break;

                        case 1:     //restar
                            zres = z1.restarComplejos(z2);

                            break;

                        case 2:     //mult
                            zres = z1.multiplicarComplejos(z2);

                            break;

                        case 3:     //dividir
                            zres = z1.DividirComplejos(z2);

                            break;
                        }
                        //Despues distinguir si imprimir [a,b] o (a,b)
                        labelResultado.Text = "(" + Math.Round(zres.formaBinomica().a, 3) + " ; " + Math.Round(zres.formaBinomica().b, 3) + ")" + " - [" + Math.Round(zres.formaPolar().a, 3) + " ; " + Math.Round(zres.formaPolar().b, 3) + " rad]";

                        //armo un case con todas las posibles operaciones seleccionadas
                        //por cada operacion, opero con los complejos
                    }
                }
            }
        }