三角形面积计算器(c#实现)

前言

上星期人机交互课老师布置了一个作业,让我们实现一个三角形面积计算器,有界面的那种,编程语言不限,并且透露说用c#实现比较方便。由于之前也没有学过c#,抱着试一试的态度开始了c#的“Hello World”之旅。

WinForm or WPF?

装好了VS2015打算写c#,建工程的时候却不知道建c#的什么工程好,上网查了一下,基本上有两个选择,WinForm和WPF,稍微了解了一下两者的区别,WPF晚于WinForm出现,比WinForm对线程的处理更加成熟,同时绘图能力也大有提升。答案似乎显而易见了,我最初是用WPF的,不过到了最后一步画三角形的时候,由于没有找到对应的控件,迫使我转向了WinForm,也许有别的解决办法,暂时不去研究了。

界面设计&添加事件

看着微软的c#教程,就开始编写代码了。果然简单,控件都是直接从工具箱拽入页面的,然后在属性窗口可以设置各种属性,相比于上学期学的java GUI设计,实在是太方便,大大提高了开发效率。

拖拽几个简单的控件,设计好布局,下面要做的就是为控件添加事件。用于输入的三个TextBox我都添加了Textchanged事件,用于判断用户当前输入是否合法等,Button控件添加了Click事件,点击之后可以计算三角形的面积,同时在控件PictureBox中绘出大致的三角形。

关于绘制三角形这一块,倒是浪费了我不少时间。一开始是System.Drawing这个命名空间找不到,搞了半天发现要自己添加引用,还有就是从WPF转向WinForm的原因,WPF下没找到合适的存放绘制好的三角形的控件,但发现了WinForm下的Picturebox控件可以解决这个问题,遂转向了WinForm。另外则是绘制三角形的函数通常需要知道点的坐标,而我们给出的是边长,这里我采用了固定最长边在某一水平线的方法,计算出三个点的坐标,然后绘图。

具体实现效果如下:
输入边长不合法的情况
输入边长不能构成三角形的情况
计算出面积的情况

部分事件代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using System;
using System.Drawing;
using System.Windows.Forms;
namespace triangle_area
{
public partial class title : Form
{
public title()
{
InitializeComponent();
}
private void button_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(len_a.Text.Trim()) && !string.IsNullOrEmpty(len_b.Text.Trim()) && !string.IsNullOrEmpty(len_c.Text.Trim()))
{
double a, b, c;
a = double.Parse(len_a.Text);
b = double.Parse(len_b.Text);
c = double.Parse(len_c.Text);
if (a + b > c && a + c > b && b + c > a)
{
pictureBox1.Refresh();
double p = (a + b + c) / 2;
double s = Math.Sqrt(p * (p - a) * (p - b) * (p - c));
result.Text = "三角形面积为:" + s.ToString("f3");
double max_len = Math.Max(Math.Max(a, b), c);
double min_len = Math.Min(Math.Min(a, b), c);
double mid_len = a + b + c - max_len - min_len;
double cos_theda = (Math.Pow(max_len, 2) + Math.Pow(min_len, 2) - Math.Pow(mid_len, 2))/(2*max_len*min_len);
double sin_theda = Math.Sqrt(1 - Math.Pow(cos_theda, 2));
double h = 2 * s / max_len;
double pos = min_len * cos_theda;
double factor = 300/max_len;
double left_margin = 200 - max_len / 2 * factor;
double right_margin = 200 + max_len / 2 * factor;
Graphics g = pictureBox1.CreateGraphics();
SolidBrush blueBrush = new SolidBrush(Color.Blue);
Point point1 = new Point((int)left_margin, 270);
Point point2 = new Point((int)(right_margin), 270);
Point point3 = new Point((int)(left_margin + pos*factor), (int)(270 - h * factor));
Point[] curvePoints = { point1, point2, point3 };
g.FillPolygon(blueBrush, curvePoints);
}
else
{
result.Text = "输入的边长不合法!";
}
}
else
{
result.Text = "请输入三角形三边长!";
}
}
private void len_a_TextChanged(object sender, EventArgs e)
{
result.Text = "";
System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex(@"^[+]?\d*[.]?\d+$");
if (!rex.IsMatch(len_a.Text))
{
result.Text = "请输入数字!";
}
else if (!string.IsNullOrEmpty(len_a.Text.Trim()) && !string.IsNullOrEmpty(len_b.Text.Trim()) && !string.IsNullOrEmpty(len_c.Text.Trim()))
{
double a, b, c;
a = double.Parse(len_a.Text);
b = double.Parse(len_b.Text);
c = double.Parse(len_c.Text);
if (a + b <= c || a + c <= b || b + c <= a)
{
result.Text = "输入的边长不合法!";
}
}
}
private void len_b_TextChanged(object sender, EventArgs e)
{
result.Text = "";
System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex(@"^[+]?\d*[.]?\d+$");
if (!rex.IsMatch(len_b.Text))
{
result.Text = "请输入数字!";
}
else if (!string.IsNullOrEmpty(len_a.Text.Trim()) && !string.IsNullOrEmpty(len_b.Text.Trim()) && !string.IsNullOrEmpty(len_c.Text.Trim()))
{
double a, b, c;
a = double.Parse(len_a.Text);
b = double.Parse(len_b.Text);
c = double.Parse(len_c.Text);
if (a + b <= c || a + c <= b || b + c <= a)
{
result.Text = "输入的边长不合法!";
}
}
}
private void len_c_TextChanged(object sender, EventArgs e)
{
result.Text = "";
System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex(@"^[+]?\d*[.]?\d+$");
if (!rex.IsMatch(len_c.Text))
{
result.Text = "请输入数字!";
}
else if (!string.IsNullOrEmpty(len_a.Text.Trim()) && !string.IsNullOrEmpty(len_b.Text.Trim()) && !string.IsNullOrEmpty(len_c.Text.Trim()))
{
double a, b, c;
a = double.Parse(len_a.Text);
b = double.Parse(len_b.Text);
c = double.Parse(len_c.Text);
if (a + b <= c || a + c <= b || b + c <= a)
{
result.Text = "输入的边长不合法!";
}
}
}
}
}

最后还是要吐槽一下vs里面的c#代码规范,大括号换行什么的看得好不习惯呢!
(完)

文章目录
  1. 1. 前言
  2. 2. WinForm or WPF?
  3. 3. 界面设计&添加事件
|