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

}
}

C#窗体程序画倾斜一定角度的椭圆的更多相关文章

  1. 如何给windows窗体程序打包成一个安装包

    http://blog.csdn.net/xyy410874116/article/details/6341787 给windows窗体程序打包成一个安装包:具体操作在:http://hi.baidu ...

  2. 学习java随笔第十一篇:java窗体程序

    要开java的窗体程序,就要下载开发窗体的工具. 这里我用的是的myeclipse,可以直接在网上下载安装即可. 我用的是10.0版本的,如果需要汉化的话,可以看一下这篇文章:myeclipse.10 ...

  3. VS2010 win32项目windows窗体程序 向导生成代码解析

    目录: 1.Win32项目的windows窗体程序的向导生成了如下代码 2.手工生成代码如下 3.当消息队列中没有消息需要处理,我们可以利用这段时间处理我们自己的任务 1.Win32项目的window ...

  4. 使用控制台调试WinForm窗体程序

    .程序代码结构 .Win32DebuggerHelper.cs using System.Runtime.InteropServices; /* TODO:使用方法 Win32.AllocConsol ...

  5. 两种方法:VS2008下C++窗体程序显示控制台的方法——在QT程序中使用cout和cin

    老蔡写了一个基于QT的窗体程序,而过去写的类的调试信息都是用cout显示的,苦于窗体程序无法显示cout信息很多信息都看不到,于是就想到让控制台和窗体同时显示.显示控制台方法如下 1.项目(或者叫“工 ...

  6. C#窗体程序与sql sever 数据库链接

    一.所用工具 Visual Studio 2017和SQL Server Management Studio 2012 二.连接 打开SQL Server Management Studio 2012 ...

  7. winform窗体程序运行后怎样隐藏?

    运行winform窗体,我们是怎样隐藏的呢? 例子: 1)创建简单winform窗体 2)编写隐藏窗体程序的代码 3)效果演示 1)创建一个简单的winform窗体MainForm,

  8. MFC窗体程序中添加调试控制台

    在编写复杂程序的过程中,我们经常需要将一些信息输出到文件或者屏幕上.较控制台应用程序,MFC窗体程序要显得麻烦一些! 下面有2种方法来实现为MFC窗体程序添加调试控制台,方便程序员调试程序和了解当前程 ...

  9. c# WinForm窗体编程中对窗体程序设置快捷键

    c# WinForm窗体编程中对窗体程序设置快捷键http://www.cnblogs.com/bison1989/archive/2011/09/19/2180977.html /// <su ...

随机推荐

  1. Unity NGUI UILabel文字变色 及相关问题

    在同一个UILabel中可以有不同颜色的文字只需要添加BBCode标记[ff0000]Red Label[-],那么在这个标记之间的RedLabel 就会变成红色 注意: 1.文本最终显示的颜色=Co ...

  2. oracle AWR深入研究分析,如何使用

    AWR的前身是statspack,当然现在还在,只不过大家都在使用AWR,因为它方便,简单,直观,形象. AWR是oracle内置工具,安装oracle时已经自动安装完毕,无需额外安装了. SELEC ...

  3. HDU 4288 线段树+离散化

    题意: n个操作 在[1, 100000]  的区间上add 或del数( 必不会重复添加或删除不存在的数) sum 求出整个集合中 (下标%5 == 3 位置) 的数   的和 注意数据类型要64位 ...

  4. [RxJS] Filtering operators: takeLast, last

    Operators take(), skip(), and first() all refer to values emitted in the beginning of an Observable ...

  5. android ui定义自己的dialog(项目框架搭建时就写好,之后事半功倍)

    自定义一个dialog: 之前有很多博客都有过这方面的介绍,可是个人觉得通常不是很全面,通用性不是很强,一般会定义一个自己的dialog类,然后去使用,难道每一个dialog都要定义一个class吗? ...

  6. android软键盘的用法总结

    1.软键盘的显示原理 软键盘其实是一个Dialog.InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部 或者全屏显示.当我们点击输入框时 ...

  7. systemtap [主设备号,次设备好,inode]监控文件

    SystemTap 是监控和跟踪运行中的linux 内核的操作的动态方法,SystemTap 应用:对管理员,SystemTap可用于监控系统性能,找出系统瓶颈,而对于开发者,可以查看他们的程序运行时 ...

  8. MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图

    http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...

  9. mapreduce实战:统计美国各个气象站30年来的平均气温项目分析

    气象数据集 我们要写一个气象数据挖掘的程序.气象数据是通过分布在美国各地区的很多气象传感器每隔一小时进行收集,这些数据是半结构化数据且是按照记录方式存储的,因此非常适合使用 MapReduce 程序来 ...

  10. spring mvc DispatcherServlet详解之一--request通过HandlerMaping获取控制器Controller过程

    整个spring mvc的架构如下图所示: 现在来讲解DispatcherServletDispatcherServlet的第一步:获取控制器. HandlerMapping HandlerMappi ...