2015年4月9日 星期四

[2015][Quiz][Week07]Quiz04-60373006H

namespace Quiz_4_9
{
    public class Point//Point 類別
    {
        public double PointX;
        public double PointY;

        //計算輸入點與成員變數的距離
        public double DistanceTo(Point Input)
        {
            return Math.Sqrt((Input.PointX - PointX) * (Input.PointX - PointX) + (Input.PointY - PointY) * (Input.PointY - PointY));
        }
    }
}
 namespace Quiz_4_9
{
    class PinBoard //釘版類別
    {

        public int Row;//列
        public int Column;//行
        public double RowInterval;
        public double ColumnInterval;
        public Point[,] PinArray;

      
        public void CreatPinArray()
        {
            PinArray = new Point[Row, Column];
            for (int i = 0; i < Row; i++)
            {
                for (int j = 0; j < Column; j++)
                    PinArray[i, j] = new Point();
            }
        }
        public void SetPointPostion()
        {
            for (int i = 0; i < Row; )
            {
                for (double ValueRow = 0; i < Row; i++, ValueRow += RowInterval)
                {
                    for (int j = 0; j < Column; )
                    {
                        for (double ValueCol = 0; j < Column; j++, ValueCol += ColumnInterval)
                        {
                            PinArray[i, j].PointX = ValueRow;
                            PinArray[i, j].PointY = ValueCol;
                        }
                    }
                }
            }
        }
    }
}
namespace Quiz_4_9
{
    class Triangle //三角形類別
    {
        //成員三點
        public Point[] PointofTriangle = new Point[3];

        public bool IsRight()
        {
            double s1 = PointofTriangle[0].DistanceTo(PointofTriangle[1]);
            double s2 = PointofTriangle[1].DistanceTo(PointofTriangle[2]);
            double s3 = PointofTriangle[0].DistanceTo(PointofTriangle[2]);
            if ((s1 + s2 > s3) && (s2 + s3 > s1) && (s1 + s3 > s2))
                return true;
            else
                return false;
        }//判斷三角形是否合法
        public double Preimeter()
        {
            double s1 = PointofTriangle[0].DistanceTo(PointofTriangle[1]);
            double s2 = PointofTriangle[1].DistanceTo(PointofTriangle[2]);
            double s3 = PointofTriangle[0].DistanceTo(PointofTriangle[2]);
            return (s1 + s2 + s3);
        }//周長
        public double Area()
        {
            double s1 = PointofTriangle[0].DistanceTo(PointofTriangle[1]);
            double s2 = PointofTriangle[1].DistanceTo(PointofTriangle[2]);
            double s3 = PointofTriangle[2].DistanceTo(PointofTriangle[0]);
            double s = (s1 + s2 + s3) / 2;
            return Math.Sqrt(s * (s - s1) * (s - s2) * (s - s3));
        }//面積
        public double RadiusOfCircumcircle()
        {
            double a = PointofTriangle[0].DistanceTo(PointofTriangle[1]);
            double b = PointofTriangle[1].DistanceTo(PointofTriangle[2]);
            double c = PointofTriangle[2].DistanceTo(PointofTriangle[0]);
            double cosAlpha = (b * b + c * c - a * a) / (2 * b * c);
            double sinAlpha = Math.Sqrt(1 - cosAlpha * cosAlpha);
            return (0.5 * a / sinAlpha);
        }//外接圓半徑
    }
}
namespace Quiz_4_9
{
    public partial class Form1 : Form
    {
        private PinBoard board;
        Triangle triangle;
        Random rand;

        public Form1()
        {
            InitializeComponent();
            board = new PinBoard();
            triangle = new Triangle();
            rand = new Random();
        }

        //btn_GenerateTriangle功能創造PinArray
        private void btn_GenerateTriangle_Click(object sender, EventArgs e)
        {
            if (txt_RowKeyin.Text != "" && txt_ColumnKeyin.Text != "" && txt_RowIntervalKeyin.Text != "" && txt_ColumnIntervalKeyin.Text != "")
            {
                //讀取txt
                board.Row = Convert.ToInt16(txt_RowKeyin.Text);
                board.Column = Convert.ToInt16(txt_ColumnKeyin.Text);
                board.RowInterval = Convert.ToDouble(txt_RowIntervalKeyin.Text);
                board.ColumnInterval = Convert.ToDouble(txt_ColumnIntervalKeyin.Text);
                //創造PinBoard
                board.CreatPinArray();
                board.SetPointPostion();
                PrintPoint();
            }
            else
                MessageBox.Show("缺參數"); 
        }

        //亂數選擇三點作為三角形,並將三點塞進Triangle類別中,同時print出來
        private void PrintPoint()
        {
            //亂數選點 && 塞進txt
            txt_Point1Row.Text = rand.Next(board.Row).ToString();
            txt_Point1Column.Text = rand.Next(board.Column).ToString();
            txt_Point2Row.Text = rand.Next(board.Row).ToString();
            txt_Point2Column.Text = rand.Next(board.Column).ToString();
            txt_Point3Row.Text = rand.Next(board.Row).ToString();
            txt_Point3Column.Text = rand.Next(board.Column).ToString();
            //用選點結果,提出PinBoard點,並塞進Triangle類別
            triangle.PointofTriangle[0] = board.PinArray[Convert.ToInt16(txt_Point1Row.Text), Convert.ToInt16(txt_Point1Column.Text)];
            triangle.PointofTriangle[1] = board.PinArray[Convert.ToInt16(txt_Point2Row.Text), Convert.ToInt16(txt_Point2Column.Text)];
            triangle.PointofTriangle[2] = board.PinArray[Convert.ToInt16(txt_Point3Row.Text), Convert.ToInt16(txt_Point3Column.Text)];
            //顯示三角形的三點
            txt_Point1X.Text = triangle.PointofTriangle[0].PointX.ToString();
            txt_Point1Y.Text = triangle.PointofTriangle[0].PointY.ToString();
            txt_Point2X.Text = triangle.PointofTriangle[1].PointX.ToString();
            txt_Point2Y.Text = triangle.PointofTriangle[1].PointY.ToString();
            txt_Point3X.Text = triangle.PointofTriangle[2].PointX.ToString();
            txt_Point3Y.Text = triangle.PointofTriangle[2].PointY.ToString();
        }

        //將Triangle類別中的數字提出來做運算,並放進txtbox裡。
        private void btn_Calulate_Click(object sender, EventArgs e)
        {
            //判斷三點是否為空
            if (txt_Point1X.Text != "" && txt_Point1Y.Text != "" && txt_Point2X.Text != "" &&
                txt_Point2Y.Text != "" && txt_Point3X.Text != "" && txt_Point3Y.Text != "")
            {//判斷手動輸入數字是否超過板子大小
                if (Convert.ToInt16(txt_Point1Row.Text) < board.Row && Convert.ToInt16(txt_Point1Column.Text) < board.Column &&
                    Convert.ToInt16(txt_Point2Row.Text) < board.Row && Convert.ToInt16(txt_Point2Column.Text) < board.Column &&
                    Convert.ToInt16(txt_Point3Row.Text) < board.Row && Convert.ToInt16(txt_Point3Column.Text) < board.Column)
                {
                    txt_ResultPrint.Text = "";
                    //為手動輸入所以必須再寫一次
                    triangle.PointofTriangle[0] = board.PinArray[Convert.ToInt16(txt_Point1Row.Text), Convert.ToInt16(txt_Point1Column.Text)];
                    triangle.PointofTriangle[1] = board.PinArray[Convert.ToInt16(txt_Point2Row.Text), Convert.ToInt16(txt_Point2Column.Text)];
                    triangle.PointofTriangle[2] = board.PinArray[Convert.ToInt16(txt_Point3Row.Text), Convert.ToInt16(txt_Point3Column.Text)];
                    if (triangle.IsRight() == true)
                    {
                        txt_ResultPrint.Text += "周長:";
                        txt_ResultPrint.Text += triangle.Preimeter().ToString() + Environment.NewLine;
                        txt_ResultPrint.Text += "面積:";
                        txt_ResultPrint.Text += triangle.Area().ToString() + Environment.NewLine;
                        txt_ResultPrint.Text += "外接圓半徑:";
                        txt_ResultPrint.Text += triangle.RadiusOfCircumcircle().ToString() + Environment.NewLine;
                    }
                    else
                        txt_ResultPrint.Text = "the triangle is illegal";
                }
                else
                    MessageBox.Show("輸入數字超過板子大小");
            }
            else
                MessageBox.Show("缺參數");
        }

    }
}

沒有留言:

張貼留言