• [Unity] 3D数学基础


    2D矩阵的旋转:

    NewX = X * Cos(α) - Y * Sin(α)

    NewY = X * Sin(α) + Y * Cos(α)

    一般在三角函数中使用的是弧度,我们可以通过下面的公式将角度转为弧度:

    α = (degrees / 360 * PI)

    示例代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
    
    namespace MatrixTransForm
    {
        /// <summary>
        /// 三角形
        /// </summary>
        class Triangle
        {
            PointF A, B, C;
    
            public Triangle(PointF A, PointF B, PointF C)
            {
                this.A = A;
                this.B = B;
                this.C = C;
            }
    
            /// <summary>
            /// 绘制三角形
            /// </summary>
            /// <param name="g"></param>
            public void Draw(Graphics g)
            {
                Pen pen = new Pen(Color.Red);
                pen.Width = 4;
                g.DrawLine(pen, A, B);
                g.DrawLine(pen, B, C);
                g.DrawLine(pen, C, A);
            }
    
    
            /// <summary>
            /// 旋转三角形
            /// </summary>
            /// <param name="degrees">要旋转的角度</param>
            public void Rotate(int degrees)
            {
                // 将角度转为弧度
                float angle = (float)(degrees / 360.0f * Math.PI);
    
                float newX = (float)(A.X * Math.Cos(angle) - A.Y * Math.Sin(angle));
                float newY = (float)(A.X * Math.Sin(angle) + A.Y * Math.Cos(angle));
    
                A.X = newX;
                A.Y = newY;
    
                newX = (float)(B.X * Math.Cos(angle) - B.Y * Math.Sin(angle));
                newY = (float)(B.X * Math.Sin(angle) + B.Y * Math.Cos(angle));
    
                B.X = newX;
                B.Y = newY;
    
                newX = (float)(C.X * Math.Cos(angle) - C.Y * Math.Sin(angle));
                newY = (float)(C.X * Math.Sin(angle) + C.Y * Math.Cos(angle));
    
                C.X = newX;
                C.Y = newY;
    
            }
        }
    }

    窗口代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace MatrixTransForm
    {
        public partial class Form1 : Form
        {
            Triangle t;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (t == null)
                    t = new Triangle(new PointF(0, -100), new PointF(100, 100), new PointF(-100, 100));
                Invalidate();
            }
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                if (t != null)
                {
                    e.Graphics.TranslateTransform(200, 200);
                    t.Draw(e.Graphics);
                }
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                if (t != null)
                {
                    t.Rotate(1);
                    Invalidate();
                }
            }
        }
    }

    效果:

  • 相关阅读:
    IO(文件)处理
    集合 (set) 的增删改查及 copy()方法
    字典 (dict) 的增删改查及其他方法
    列表(List) 的增删改查及其他方法
    细数Python中的数据类型以及他们的方法
    CCNA基础 IP地址子网划分
    [转] SSH原理与运用(2):远程操作与端口转发
    记俩次连续失误操作造成的数据丢失损坏解决
    CentOS 下 MySQL DateBasic 抢救
    China Mobile 免流原理
  • 原文地址:https://www.cnblogs.com/yangyxd/p/5412965.html
Copyright © 2020-2023  润新知