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 - 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 textBox1_TextChanged(object sender, EventArgs e)//输入倾斜的角度
  {
  angle = int.Parse(this.textBox1.Text);
  }
  }
  }