using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Quiz4
{
public partial class pinboard : Form
{
PinBoard board = new PinBoard(); //建立板子
public pinboard()
{
InitializeComponent();
}
private void btn_calculate_Click(object sender, EventArgs e)
{
Triangle tri = new Triangle();
int[] row = new int[3];
int[] col = new int[3];
col[0] = int.Parse(txtCol1.Text);
row[0] = int.Parse(txtRow1.Text);
col[1] = int.Parse(txtCol2.Text);
row[1] = int.Parse(txtRow2.Text);
col[2] = int.Parse(txtCol3.Text);
row[2] = int.Parse(txtRow3.Text);
for (int i = 0; i <= 2; i++)
{
tri.pointArray[i] = board.pinArray[row[i], col[i]];
}
board.SetPinsPosition();
txtX1.Text = tri.pointArray[0].xCoordinate.ToString();
txtY1.Text = tri.pointArray[0].yCoordinate.ToString();
txtX2.Text = tri.pointArray[1].xCoordinate.ToString();
txtY2.Text = tri.pointArray[1].yCoordinate.ToString();
txtX3.Text = tri.pointArray[2].xCoordinate.ToString();
txtY3.Text = tri.pointArray[2].yCoordinate.ToString();
if (!tri.ConditionsOfTriangle())
txt_Display.AppendText("以上三點無法構成三角形,重新產生三點\n");
double Perimeter=tri.Perimeter();
txt_Display.AppendText(DisplayStringPerimeter(Perimeter));
double Area = tri.Area();
txt_Display.AppendText(DisplayStringArea(Area));
double radius = tri.RadiusOfCircumcircle();
txt_Display.AppendText(DisplayStringradius(radius));
}
private string DisplayStringValue(double Value)
{
string StrDisplay = "";
StrDisplay += Value;
StrDisplay += "\n";
return StrDisplay;
}
private string DisplayStringPerimeter(double Perimeter)
{
string StrDisplay = "";
StrDisplay += "周長";
StrDisplay += Perimeter;
StrDisplay += "\n";
return StrDisplay;
}
private string DisplayStringArea(double Area)
{
string StrDisplay = "";
StrDisplay += "面積";
StrDisplay += Area;
StrDisplay += "\n";
return StrDisplay;
}
private string DisplayStringradius(double radius)
{
string StrDisplay = "";
StrDisplay += "外接圓半徑";
StrDisplay += radius;
StrDisplay += "\n";
return StrDisplay;
}
private void button1_Click(object sender, EventArgs e)
{
board.rows = int.Parse(txt_rows.Text);
board.cols = int.Parse(txt_cols.Text);
board.rowInterval = double.Parse(txt_rowInterval.Text);
board.colInterval = double.Parse(txt_colInterval.Text);
Triangle tri = new Triangle(); //建立三角形
Random rand = new Random(); //產生亂數
board.CreatePins();
int[] row = new int[3];
int[] col = new int[3];
for(int i=0;i<=2;i++)
{
row[i] = rand.Next(board.rows);
col[i] = rand.Next(board.cols);
tri.pointArray[i] = board.pinArray[row[i], col[i]];
}
txtCol1.Text = col[0].ToString();
txtRow1.Text = row[0].ToString();
txtCol2.Text = col[1].ToString();
txtRow2.Text = row[1].ToString();
txtCol3.Text = col[2].ToString();
txtRow3.Text = row[2].ToString();
board.SetPinsPosition();
txtX1.Text=tri.pointArray[0].xCoordinate.ToString();
txtY1.Text=tri.pointArray[0].yCoordinate.ToString();
txtX2.Text=tri.pointArray[1].xCoordinate.ToString();
txtY2.Text=tri.pointArray[1].yCoordinate.ToString();
txtX3.Text=tri.pointArray[2].xCoordinate.ToString();
txtY3.Text=tri.pointArray[2].yCoordinate.ToString();
if (!tri.ConditionsOfTriangle())
txt_Display.AppendText("以上三點無法構成三角形,重新產生三點\n");
}
}
}
Point
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz4
{
class Point
{
public double xCoordinate;
public double yCoordinate;
public double DistanceBetweenTwoPoints(Point pin) //計算該點和某點之間的距離
{
double Distance = Math.Sqrt(Math.Pow((pin.xCoordinate - this.xCoordinate), 2) + Math.Pow((pin.yCoordinate - this.yCoordinate), 2));
return Distance;
}
}
}
PinBoard
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz4
{
class PinBoard
{
public int rows = 0;
public int cols = 0;
public Double rowInterval = 0;
public Double colInterval = 0;
public Point[,] pinArray = null;
public void CreatePins() //產生矩陣各點之位置
{
pinArray = new Point[rows, cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
pinArray[i, j] = new Point();
}
}
}
public void SetPinsPosition() //依行列間距計算出各點x.y之座標
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
pinArray[i, j].yCoordinate = (i * rowInterval);
pinArray[i, j].xCoordinate = (j * colInterval);
}
}
}
}
}
Triangle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz4
{
class Triangle
{
public Point[] pointArray = new Point[3]; //建立三角形的三個點
public bool ConditionsOfTriangle()//判斷是否符合構成三角形的條件
{
double lengthA = pointArray[0].DistanceBetweenTwoPoints(pointArray[1]);
double lengthB = pointArray[1].DistanceBetweenTwoPoints(pointArray[2]);
double lengthC = pointArray[2].DistanceBetweenTwoPoints(pointArray[0]);
double temp = 0;
while (true)
{
if (lengthB > lengthA) //將lengthA變為最長邊
{
temp = lengthB;
lengthB = lengthA;
lengthA = temp;
}
else if (lengthC > lengthB)//lengthC變為最短邊
{
temp = lengthC;
lengthC = lengthB;
lengthB = temp;
}
else
{
break;
}
}
if (lengthA < (lengthB + lengthC)) //三角形兩邊和大於第三邊
{
return true;
}
else
{
return false;
}
}
public double Perimeter() //計算三角形的周長
{
//由DistanceTo()計算兩點間的距離算出三角形三邊之邊長
double lengthA = pointArray[0].DistanceBetweenTwoPoints(pointArray[1]);
double lengthB = pointArray[1].DistanceBetweenTwoPoints(pointArray[2]);
double lengthC = pointArray[2].DistanceBetweenTwoPoints(pointArray[0]);
double Perimeter = lengthA + lengthB + lengthC;
return Perimeter;
}
public double Area()
{
double lengthA = pointArray[0].DistanceBetweenTwoPoints(pointArray[1]);
double lengthB = pointArray[1].DistanceBetweenTwoPoints(pointArray[2]);
double lengthC = pointArray[2].DistanceBetweenTwoPoints(pointArray[0]);
double Perimeter = lengthA + lengthB + lengthC;
//以海龍公式計算三角形面積
double Area = Math.Sqrt((0.5 * Perimeter) * (0.5 * Perimeter - lengthA) * (0.5 * Perimeter - lengthB) * (0.5 * Perimeter - lengthC));
return Area;
}
public double RadiusOfCircumcircle()
{
double lengthA = pointArray[0].DistanceBetweenTwoPoints(pointArray[1]);
double lengthB = pointArray[1].DistanceBetweenTwoPoints(pointArray[2]);
double lengthC = pointArray[2].DistanceBetweenTwoPoints(pointArray[0]);
//由餘弦公式計算出角A之餘弦值
double cosA = (lengthB * lengthB + lengthC * lengthC - lengthA * lengthA) / (2 * lengthB * lengthC);
double sinA = Math.Sqrt(1 - cosA * cosA);
//求得外接圓半徑
double radius = 0.5 * lengthA / sinA;
return radius;
}
}
}
Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Quiz4
{
static class Program
{
///
/// 應用程式的主要進入點。
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new pinboard());
}
}
}