using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Drawing.Drawing2D;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace Ellipse{ public partial class Form1 : Form { PointF xyPoint = new PointF(); //左上角的X,Y坐標 PointF centerPoint = new PointF();//橢圓的中心點 PointF movePoint = new PointF(); PointF xiePointF=new PointF(); PointF xiedPointF = new PointF();//傾斜一定角度后的點 PRivate double perAngle = 0; private double nowAngle; PointF[] pointFs=new PointF[201]; PointF[] pointFs1=new PointF[201];//與pointFs對稱的點數組,橢圓是對稱的 PointF[] xiePointFs=new PointF[201];//傾斜的橢圓上半部分 PointF[] xiePointFs1 = new PointF[201];//傾斜的橢圓下半部分,對稱的部分 private float a =200; private float b =100; private float stepLength = 2;//通過X坐標逐次加2計算出Y坐標,將所有坐標存在數組中,用DrawCurve連接 private float xLength = 0;//點到坐標Y軸的線段距離 private float yLength = 0;//顛倒坐標X軸的線段距離 private float dbYlength = 0; private float xiedLength = 0;//點到橢圓中心點的線段長度 private int angle = 0;//傾斜的角度 public Form1() { InitializeComponent(); } private void panel1_Paint(object sender, PaintEventArgs e) { } private void panel1_MouseClick(object sender, MouseEventArgs e)////畫布鼠標鍵點擊事件,重畫圖形 { if (e.Button != MouseButtons.Left) { return; } if (this.textBox1.Text == "") { this.errorProvider1.SetError(this.textBox1, "請輸入傾斜的角度"); return; } else { this.errorProvider1.SetError(this.textBox1, ""); } xyPoint.X = this.panel1.Width/2-200; xyPoint.Y = this.panel1.Height/2-100; centerPoint.X = xyPoint.X + a; centerPoint.Y = xyPoint.Y + b; Graphics graphics = this.panel1.CreateGraphics(); graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.Clear(this.panel1.BackColor); Pen pen = new Pen(Color.Red); for (int index = 0; index < pointFs.Length; index++) { movePoint.X = index * stepLength + xyPoint.X; xLength = centerPoint.X - movePoint.X; yLength = (float)(Math.Sqrt((1 - (xLength * xLength) / 40000) * 10000)); movePoint.Y = b - yLength + xyPoint.Y; pointFs[index] = movePoint; } graphics.DrawCurve(pen, pointFs, 1.5f); for (int index = 0; index < pointFs1.Length; index++) { dbYlength = centerPoint.Y - pointFs[index].Y; pointFs1[index].Y = centerPoint.Y + dbYlength; pointFs1[index].X = pointFs[index].X; } graphics.DrawCurve(pen, pointFs1, 1.5f); for (int index = 0; index < pointFs.Length; index++) { xiePointF = pointFs[index]; double startAngle = Math.Atan2(xiePointF.Y - centerPoint.Y, xiePointF.X - centerPoint.X); string jiaodu = this.textBox1.Text; perAngle = int.Parse(jiaodu) * Math.PI / 180; nowAngle = startAngle + perAngle; xiedLength = (float)Math.Sqrt(Math.Pow(xiePointF.X - centerPoint.X, 2) + Math.Pow(xiePointF.Y - centerPoint.Y, 2)); xiedPointF.X = centerPoint.X - (float)(xiedLength * Math.Cos(nowAngle)); xiedPointF.Y = centerPoint.Y + (float)(xiedLength * Math.Sin(nowAngle)); xiePointFs[index] = xiedPointF; } graphics.DrawCurve(pen, xiePointFs, 1.5f); for (int index = 0; index < pointFs1.Length; index++) { xiePointF = pointFs1[index]; double startAngle = Math.Atan2(xiePointF.Y - centerPoint.Y, xiePointF.X - centerPoint.X); string jiaodu = this.textBox1.Text; perAngle = int.Parse(jiaodu) * Math.PI / 180; nowAngle = startAngle + perAngle; xiedLength = (float)Math.Sqrt(Math.Pow(xiePointF.X - centerPoint.X, 2) + Math.Pow(xiePointF.Y - centerPoint.Y, 2)); xiedPointF.X = centerPoint.X - (float)(xiedLength * Math.Cos(nowAngle)); xiedPointF.Y = centerPoint.Y + (float)(xiedLength * Math.Sin(nowAngle)); xiePointFs1[index] = xiedPointF; } graphics.DrawCurve(pen, xiePointFs1, 1.5f); } private void button1_Click(object sender, EventArgs e)//傾斜角度,每次遞增10度 { angle += 10; this.textBox1.Text = angle.ToString(); if (this.textBox1.Text == "") { this.errorProvider1.SetError(this.textBox1, "請輸入傾斜的角度"); return; } else { this.errorProvider1.SetError(this.textBox1, ""); } xyPoint.X = this.panel1.Width / 2-200; xyPoint.Y = this.panel1.Height / 2-100; centerPoint.X = xyPoint.X + a; centerPoint.Y = xyPoint.Y + b; Graphics graphics = this.panel1.CreateGraphics(); graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.Clear(this.panel1.BackColor); Pen pen = new Pen(Color.Red); for (int index = 0; index < pointFs.Length; index++) { movePoint.X = index * stepLength + xyPoint.X; xLength = centerPoint.X - movePoint.X; yLength = (float)(Math.Sqrt((1 - (xLength * xLength) / 40000) * 10000)); movePoint.Y = b - yLength + xyPoint.Y; pointFs[index] = movePoint; } graphics.DrawCurve(pen, pointFs, 1.5f); for (int index = 0; index < pointFs1.Length; index++) { dbYlength = centerPoint.Y - pointFs[index].Y; pointFs1[index].Y = centerPoint.Y + dbYlength; pointFs1[index].X = pointFs[index].X; } graphics.DrawCurve(pen, pointFs1, 1.5f); for (int index = 0; index < pointFs.Length; index++) { xiePointF = pointFs[index]; double startAngle = Math.Atan2(xiePointF.Y - centerPoint.Y, xiePointF.X - centerPoint.X); string jiaodu = this.textBox1.Text; perAngle = int.Parse(jiaodu) * Math.PI / 180; nowAngle = startAngle + perAngle; xiedLength = (float)Math.Sqrt(Math.Pow(xiePointF.X - centerPoint.X, 2) + Math.Pow(xiePointF.Y - centerPoint.Y, 2)); xiedPointF.X = centerPoint.X - (float)(xiedLength * Math.Cos(nowAngle)); xiedPointF.Y = centerPoint.Y + (float)(xiedLength * Math.Sin(nowAngle)); xiePointFs[index] = xiedPointF; } graphics.DrawCurve(pen, xiePointFs, 1.5f); for (int index = 0; index < pointFs1.Length; index++) { xiePointF = pointFs1[index]; double startAngle = Math.Atan2(xiePointF.Y - centerPoint.Y, xiePointF.X - centerPoint.X); string jiaodu = this.textBox1.Text; perAngle = int.Parse(jiaodu) * Math.PI / 180; nowAngle = startAngle + perAngle; xiedLength = (float)Math.Sqrt(Math.Pow(xiePointF.X - centerPoint.X, 2) + Math.Pow(xiePointF.Y - centerPoint.Y, 2)); xiedPointF.X = centerPoint.X - (float)(xiedLength * Math.Cos(nowAngle)); xiedPointF.Y = centerPoint.Y + (float)(xiedLength * Math.Sin(nowAngle)); xiePointFs1[index] = xiedPointF; } graphics.DrawCurve(pen, xiePointFs1, 1.5f); } private void button2_Click(object sender, EventArgs e)//傾斜角度,每次遞減10度 { angle -= 10; this.textBox1.Text = angle.ToString(); if (this.textBox1.Text == "") { this.errorProvider1.SetError(this.textBox1, "請輸入傾斜的角度"); return; } else { this.errorProvider1.SetError(this.textBox1, ""); } xyPoint.X = this.panel1.Width / 2-200; xyPoint.Y = this.panel1.Height / 2-100; centerPoint.X = xyPoint.X + a; centerPoint.Y = xyPoint.Y + b; Graphics graphics = this.panel1.CreateGraphics(); graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.Clear(this.panel1.BackColor); Pen pen = new Pen(Color.Red); for (int index = 0; index < pointFs.Length; index++) { movePoint.X = index * stepLength + xyPoint.X; xLength = centerPoint.X - movePoint.X; yLength = (float)(Math.Sqrt((1 - (xLength * xLength) / 40000) * 10000)); movePoint.Y = b - yLength + xyPoint.Y; pointFs[index] = movePoint; } graphics.DrawCurve(pen, pointFs, 1.5f); for (int index = 0; index < pointFs1.Length; index++) { dbYlength = centerPoint.Y - pointFs[index].Y; pointFs1[index].Y = centerPoint.Y + dbYlength; pointFs1[index].X = pointFs[index].X; } graphics.DrawCurve(pen, pointFs1, 1.5f); for (int index = 0; index < pointFs.Length; index++) { xiePointF = pointFs[index]; double startAngle = Math.Atan2(xiePointF.Y - centerPoint.Y, xiePointF.X - centerPoint.X); string jiaodu = this.textBox1.Text; perAngle = int.Parse(jiaodu) * Math.PI / 180; nowAngle = startAngle + perAngle; xiedLength = (float)Math.Sqrt(Math.Pow(xiePointF.X - centerPoint.X, 2) + Math.Pow(xiePointF.Y - centerPoint.Y, 2)); xiedPointF.X = centerPoint.X - (float)(xiedLength * Math.Cos(nowAngle)); xiedPointF.Y = centerPoint.Y + (float)(xiedLength * Math.Sin(nowAngle)); xiePointFs[index] = xiedPointF; } graphics.DrawCurve(pen, xiePointFs, 1.5f); for (int index = 0; index < pointFs1.Length; index++) { xiePointF = pointFs1[index]; double startAngle = Math.Atan2(xiePointF.Y - centerPoint.Y, xiePointF.X - centerPoint.X); string jiaodu = this.textBox1.Text; perAngle = int.Parse(jiaodu) * Math.PI / 180; nowAngle = startAngle + perAngle; xiedLength = (float)Math.Sqrt(Math.Pow(xiePointF.X - centerPoint.X, 2) + Math.Pow(xiePointF.Y - c
新聞熱點
疑難解答