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(); }
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; }