示例#1
0
        private void btnCalculate_Click(object sender, EventArgs e)
        {
            TriangleCalculator calc;
            float _AB, _BC, _AC, _A, _B, _C;

            _AB = (!txtAB.ReadOnly) ? Parse(txtAB.Text) : 0;
            _BC = (!txtBC.ReadOnly) ? Parse(txtBC.Text) : 0;
            _AC = (!txtAC.ReadOnly) ? Parse(txtAC.Text) : 0;
            _A  = (!txtA.ReadOnly) ? Parse(txtA.Text) : 0;
            _B  = (!txtB.ReadOnly) ? Parse(txtB.Text) : 0;
            _C  = (!txtC.ReadOnly) ? Parse(txtC.Text) : 0;

            txtAB.Text = (_AB != 0) ? _AB.ToString() : "";
            txtBC.Text = (_BC != 0) ? _BC.ToString() : "";
            txtAC.Text = (_AC != 0) ? _AC.ToString() : "";
            txtA.Text  = (_A != 0) ? _A.ToString() : "";
            txtB.Text  = (_B != 0) ? _B.ToString() : "";
            txtC.Text  = (_C != 0) ? _C.ToString() : "";

            try
            {
                switch (cmbType.SelectedIndex)
                {
                case 1:
                    calc = new TriangleCalculator(ItemsType.AB_BC_A, _AB, _BC, _A);
                    break;

                case 2:
                    calc = new TriangleCalculator(ItemsType.AB_BC_B, _AB, _BC, _B);
                    break;

                case 3:
                    calc = new TriangleCalculator(ItemsType.AB_BC_C, _AB, _BC, _C);
                    break;

                case 4:
                    calc = new TriangleCalculator(ItemsType.BC_AC_A, _BC, _AC, _A);
                    break;

                case 5:
                    calc = new TriangleCalculator(ItemsType.BC_AC_B, _BC, _AC, _B);
                    break;

                case 6:
                    calc = new TriangleCalculator(ItemsType.BC_AC_C, _BC, _AC, _C);
                    break;

                case 7:
                    calc = new TriangleCalculator(ItemsType.AB_AC_A, _AB, _AC, _A);
                    break;

                case 8:
                    calc = new TriangleCalculator(ItemsType.AB_AC_B, _AB, _AC, _B);
                    break;

                case 9:
                    calc = new TriangleCalculator(ItemsType.AB_AC_C, _AB, _AC, _C);
                    break;

                case 10:
                    calc = new TriangleCalculator(ItemsType.AB_A_B, _AB, _A, _B);
                    break;

                case 11:
                    calc = new TriangleCalculator(ItemsType.AB_B_C, _AB, _B, _C);
                    break;

                case 12:
                    calc = new TriangleCalculator(ItemsType.AB_A_C, _AB, _A, _C);
                    break;

                case 13:
                    calc = new TriangleCalculator(ItemsType.BC_A_B, _BC, _A, _B);
                    break;

                case 14:
                    calc = new TriangleCalculator(ItemsType.BC_B_C, _BC, _B, _C);
                    break;

                case 15:
                    calc = new TriangleCalculator(ItemsType.BC_A_C, _BC, _A, _C);
                    break;

                case 16:
                    calc = new TriangleCalculator(ItemsType.AC_A_B, _AC, _A, _B);
                    break;

                case 17:
                    calc = new TriangleCalculator(ItemsType.AC_B_C, _AC, _B, _C);
                    break;

                case 18:
                    calc = new TriangleCalculator(ItemsType.AC_A_C, _AC, _A, _C);
                    break;

                default:
                    calc = new TriangleCalculator(ItemsType.AB_BC_AC, _AB, _BC, _AC);
                    break;
                }
                calc.AmbigiousObtuse = chkAmbigious.Checked;
                calc.CalculateTriangle();
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            txtA.Text         = Math.Round(calc.AngleA, Convert.ToInt32(numDigits.Value)).ToString();
            txtAB.Text        = Math.Round(calc.SideAB, Convert.ToInt32(numDigits.Value)).ToString();
            txtBC.Text        = Math.Round(calc.SideBC, Convert.ToInt32(numDigits.Value)).ToString();
            txtAC.Text        = Math.Round(calc.SideAC, Convert.ToInt32(numDigits.Value)).ToString();
            txtA.Text         = Math.Round(calc.AngleA, Convert.ToInt32(numDigits.Value)).ToString();
            txtB.Text         = Math.Round(calc.AngleB, Convert.ToInt32(numDigits.Value)).ToString();
            txtC.Text         = Math.Round(calc.AngleC, Convert.ToInt32(numDigits.Value)).ToString();
            txtPerimeter.Text = Math.Round(calc.Perimeter, Convert.ToInt32(numDigits.Value)).ToString();
            txtArea.Text      = Math.Round(calc.Area, Convert.ToInt32(numDigits.Value)).ToString();
            if ((chkMedian.Checked == false))
            {
                txtAltidudeAB.Text = Math.Round(calc.Height(Bases.AB), Convert.ToInt32(numDigits.Value)).ToString();
                txtAltidudeBC.Text = Math.Round(calc.Height(Bases.BC), Convert.ToInt32(numDigits.Value)).ToString();
                txtAltidudeAC.Text = Math.Round(calc.Height(Bases.AC), Convert.ToInt32(numDigits.Value)).ToString();
            }
            else
            {
                txtAltidudeAB.Text = Math.Round(calc.Median(Bases.AB), Convert.ToInt32(numDigits.Value)).ToString();
                txtAltidudeBC.Text = Math.Round(calc.Median(Bases.BC), Convert.ToInt32(numDigits.Value)).ToString();
                txtAltidudeAC.Text = Math.Round(calc.Median(Bases.AC), Convert.ToInt32(numDigits.Value)).ToString();
            }

            DrawingData           = new TriangleData(calc);
            DrawingData.Altitudes = !chkMedian.Checked;
            this.bitmap           = DrawingData.Draw((Panel1.Height - 2));
            this.Refresh();
        }
示例#2
0
        public TriangleData(TriangleCalculator calc)
        {
            this.Angles          = new AnglesData();
            this.Altitudes       = true;
            this.Angles.Right    = Angle.None;
            this.Angles.Rotation = 0;
            this.Angles.Scale    = 1;

            float max = Math.Max(Math.Max(calc.SideAB, calc.SideBC), calc.SideAC);
            float myAB, myBC, myAC, myArea;

            myAB   = calc.SideAB / max;
            myBC   = calc.SideBC / max;
            myAC   = calc.SideAC / max;
            myArea = calc.Area / max / max;
            //------------------------------------------------------
            //distance from point C to side AB
            float CD = 2 * myArea / myAB;
            //distance from point A to side BC
            float AE = 2 * myArea / myBC;
            //distance from point B to side AC
            float BF = 2 * myArea / myAC;

            //distance from point A to the height (assuming it is from C)
            float AD = myAB - (float)Math.Cos(calc.RadB) * myBC;

            this.Angles.radiusA = (0.4f * AE);
            this.Angles.radiusB = (0.4f * BF);
            this.Angles.radiusC = (0.4f * CD);

            this.offsetX = (AD < 0) ? (-AD) : 0;
            this.PosA    = new PointF(0, (CD));
            this.PosB    = new PointF((myAB), (CD));
            this.PosC    = new PointF((AD), 0);

            if (2 * calc.RadA == PI)
            {
                this.Angles.Right = Angle.A;
            }
            else if (2 * calc.RadB == PI)
            {
                this.Angles.Right = Angle.B;
            }
            else if (2 * calc.RadC == PI)
            {
                this.Angles.Right    = Angle.C;
                this.Angles.Rotation = (calc.AngleB);
            }
            else
            {
                this.Angles.Right = Angle.None;
            }

            if (this.Angles.Right == Angle.C || this.Angles.Right == Angle.None)
            {
                this.PosD = new PointF((AD), (CD));
            }

            if (this.Angles.Right == Angle.A || this.Angles.Right == Angle.None)
            {
                float CosEAB = (AE / myAB);
                float SinEAB = (float)Math.Sqrt((1 - (CosEAB * CosEAB)));
                if (((2 * calc.RadB) > PI))
                {
                    SinEAB = (SinEAB * -1);
                }

                this.PosE = new PointF(((CosEAB * AE)), ((CD - (SinEAB * AE))));
            }

            if (this.Angles.Right == Angle.B || this.Angles.Right == Angle.None)
            {
                float CosFBA = (BF / myAB);
                float SinFBA = (float)Math.Sqrt((1
                                                 - (CosFBA * CosFBA)));
                if (((2 * calc.RadA) > PI))
                {
                    SinFBA = (SinFBA * -1);
                }

                this.PosF = new PointF((myAB - (CosFBA * BF)), (CD - (SinFBA * BF)));
            }

            float y = Math.Min(this.PosF.Y, this.PosE.Y);

            this.offsetY = (y < 0) ? -y : 0;
        }