程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#窗體程序畫傾斜一定角度的橢圓,

C#窗體程序畫傾斜一定角度的橢圓,

編輯:C#入門知識

C#窗體程序畫傾斜一定角度的橢圓,


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

        
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved