2015年4月13日 星期一

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

Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Quiz4
{
    public partial class Form1 : Form
    {
        PinBoard board = new PinBoard(); //建立板子
        Triangle tri = new Triangle();   //建立三角形
        Random rand = new Random();      //產生亂數
        public Form1()
        {
            InitializeComponent();
        }

        private void btnToWork1_Click(object sender, EventArgs e)
        {
            board.rows = int.Parse(txtRows.Text);
            board.cols = int.Parse(txtColumns.Text);
            board.rowInterval = Double.Parse(txtRowInterval.Text);
            board.colInterval = Double.Parse(txtColumnInterval.Text);
            board.CreatePins();
            txtPoint1Row.AppendText("");

        TrianglePin:
            for (int i = 0; i < 3; i++)
            {
                //以亂數產生三角形的三個點
                tri.pointArray[i] = board.pinArray[rand.Next(board.cols), rand.Next(board.rows)];
            }
            if (!tri.IsTriangulable())
            {
                goto TrianglePin;
            }
            txtPoint1Column.Text = tri.pointArray[0].x.ToString();
            txtPoint1Row.Text = tri.pointArray[0].y.ToString();
            txtPoint2Column.Text = tri.pointArray[1].x.ToString();
            txtPoint2Row.Text = tri.pointArray[1].y.ToString();
            txtPoint3Column.Text = tri.pointArray[2].x.ToString();
            txtPoint3Row.Text = tri.pointArray[2].y.ToString();

            txtPoint1X.Text = tri.pointArray[0].xCoordinate.ToString();
            txtPoint1Y.Text = tri.pointArray[0].yCoordinate.ToString();
            txtPoint2X.Text = tri.pointArray[1].xCoordinate.ToString();
            txtPoint2Y.Text = tri.pointArray[1].yCoordinate.ToString();
            txtPoint3X.Text = tri.pointArray[2].xCoordinate.ToString();
            txtPoint3Y.Text = tri.pointArray[2].yCoordinate.ToString();
        }

        private void btnToWork2_Click(object sender, EventArgs e)
        {
            txtDisplay.Clear();

            Triangle tri2 = new Triangle();
            tri2.pointArray[0] = board.pinArray[int.Parse(txtPoint1Column.Text), int.Parse(txtPoint1Row.Text)];
            tri2.pointArray[1] = board.pinArray[int.Parse(txtPoint2Column.Text), int.Parse(txtPoint2Row.Text)];
            tri2.pointArray[2] = board.pinArray[int.Parse(txtPoint3Column.Text), int.Parse(txtPoint3Row.Text)];

            txtPoint1X.Text = (Double.Parse(txtPoint1Column.Text) * Double.Parse(txtColumnInterval.Text)).ToString();
            txtPoint1Y.Text = (Double.Parse(txtPoint1Row.Text) * Double.Parse(txtRowInterval.Text)).ToString();
            txtPoint2X.Text = (Double.Parse(txtPoint2Column.Text) * Double.Parse(txtColumnInterval.Text)).ToString();
            txtPoint2Y.Text = (Double.Parse(txtPoint2Row.Text) * Double.Parse(txtRowInterval.Text)).ToString();
            txtPoint3X.Text = (Double.Parse(txtPoint3Column.Text) * Double.Parse(txtColumnInterval.Text)).ToString();
            txtPoint3Y.Text = (Double.Parse(txtPoint3Row.Text) * Double.Parse(txtRowInterval.Text)).ToString();

            txtDisplay.AppendText("三角形的周長是:" + tri2.Perimeter().ToString() + Environment.NewLine);
            txtDisplay.AppendText("三角形的面積是:" + tri2.Area().ToString() + Environment.NewLine);
            txtDisplay.AppendText("三角形的外接圓半徑是:" + tri2.RadiusOfCircumcircle().ToString() + Environment.NewLine);
        }
    }
}
Triangle.cs
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 IsTriangulable()//判斷是否符合構成三角形的條件
        {
            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]);
            return lengthA + lengthB + lengthC;
        }
        public double Area()
        {
            double lengthA = pointArray[0].DistanceBetweenTwoPoints(pointArray[1]);
            double lengthB = pointArray[1].DistanceBetweenTwoPoints(pointArray[2]);
            double lengthC = pointArray[2].DistanceBetweenTwoPoints(pointArray[0]);
            //以海龍公式計算三角形面積
            return Math.Sqrt((0.5 * this.Perimeter()) * (0.5 * this.Perimeter() - lengthA) * (0.5 * this.Perimeter() - lengthB) * (0.5 * this.Perimeter() - lengthC));
        }

        public double RadiusOfCircumcircle()
        {
            double lengthA = pointArray[0].DistanceBetweenTwoPoints(pointArray[1]);
            double lengthB = pointArray[1].DistanceBetweenTwoPoints(pointArray[2]);
            double lengthC = pointArray[2].DistanceBetweenTwoPoints(pointArray[0]);
            return (lengthA * lengthB * lengthC) / (4 * this.Area());
            //由餘弦公式計算出角A之餘弦值
            //double cosA = (lengthB * lengthB + lengthC * lengthC - lengthA * lengthA) / (2 * lengthB * lengthC);
            //double sinA = Math.Sqrt(1 - cosA * cosA);
            //求得外接圓半徑
            //return 0.5 * lengthA / sinA;
        }
    }
}
PinBoard.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Quiz4
{
    class PinBoard
    {
        public int rows;
        public int cols;
        public Double rowInterval;
        public Double colInterval;
        public Point[,] pinArray;

        public void CreatePins() //產生矩陣各點之位置,並依行列間距計算出各點x.y之座標,
        {
            pinArray = new Point[cols, rows];
            for (int i = 0; i < cols; i++)
            {
                for (int j = 0; j < rows; j++)
                {
                    pinArray[i, j] = new Point();
                    pinArray[i, j].x = i;
                    pinArray[i, j].y = j;
                    pinArray[i, j].xCoordinate = (pinArray[i, j].x * colInterval);
                    pinArray[i, j].yCoordinate = (pinArray[i, j].y * rowInterval);
                }
            }
        }
    }
}
MyPoint.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Quiz4
{
    class Point
    {
        public double x;
        public double y;
        public double xCoordinate;
        public double yCoordinate;

        public double DistanceBetweenTwoPoints(Point pin) //計算該點和某點之間的距離
        {
            return Math.Sqrt(Math.Pow((pin.xCoordinate - this.xCoordinate), 2) + Math.Pow((pin.yCoordinate - this.yCoordinate), 2));
        }
    }
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace Quiz4
{
    static class Program
    {
        /// 
        /// 應用程式的主要進入點。
        /// 
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Form1.Designer.cs(按我顯示)

沒有留言:

張貼留言