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);
}
}
}