C#之绘制三角形

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShaderDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Vector3 t1 = Vector3.Zero();
            Vector3 t2 = new Vector3(0, 10, 0);
            Vector3 t3 = new Vector3(15, 5, 0);



            Vector3 t11 = new Vector3(-5, -5, 0);
            Vector3 t12 = new Vector3(5, -5, 0);
            Vector3 t13 = new Vector3(5, 5, 0);

            List<Vector3> vec3 = new List<Vector3>();
            vec3.Add(t1);
            vec3.Add(t2);
            vec3.Add(t3);
            vec3.Add(t11);
            vec3.Add(t12);
            vec3.Add(t13);


            while (true)
            {
                Console.Clear();//清楚画面
                for (int i = 0; i < vec3.Count/3; i++)
                {
                    DrawTri(vec3[i * 3], vec3[i * 3 + 1], vec3[i * 3 + 2], i % 2 == 0 ? ',' : '0');
                }
                System.Threading.Thread.Sleep(100);
            }

        }

        /// <summary>
        /// 绘制三角形
        /// </summary>
        /// <param name="p0"></param>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="tag"></param>
        static void DrawTri(Vector3 p0, Vector3 p1, Vector3 p2, char tag)
        {
            //求出三角形的包围盒
            float minx = Math.Min(p0.x, p1.x);
            float maxx = Math.Max(p0.x, p1.x);

            float miny = Math.Min(p0.y, p1.y);
            float maxy = Math.Max(p0.y, p1.y);

            minx = Math.Min(minx, p2.x);
            maxx = Math.Max(maxx, p2.x);

            miny = Math.Min(miny, p2.y);
            maxy = Math.Max(maxy, p2.y);

            for (int i = (int)minx; i < (int)maxx; i++)
            {
                for (int j = (int)miny; j < (int)maxy; j++)
                {
                    if (i < 0 || i >= 80)
                        continue;
                    if (j < 0 || j >= 25)
                        continue;
                    Vector3 p = new Vector3(i, j, 0);
                    if (PointInTriangle(p0, p1, p2, p))
                    {
                        Console.SetCursorPosition(i, j);
                        Console.Write(tag);
                    }
                }
            }

        }

        /// <summary>
        /// 三角形的点
        /// </summary>
        /// <param name="A"></param>
        /// <param name="B"></param>
        /// <param name="C"></param>
        /// <param name="P"></param>
        /// <returns></returns>
        static bool PointInTriangle(Vector3 A, Vector3 B, Vector3 C, Vector3 P)
        {
            return SameSide(A, B, C, P) && SameSide(B, C, A, P) && SameSide(C, A, B, P);
        }

        /// <summary>
        /// 点乘
        /// </summary>
        /// <param name="A"></param>
        /// <param name="B"></param>
        /// <param name="C"></param>
        /// <param name="P"></param>
        /// <returns></returns>
        static bool SameSide(Vector3 A,Vector3 B,Vector3 C,Vector3 P){
            Vector3 AB = B - A;
            Vector3 AC = C - A;
            Vector3 AP = P - A;
            //求出垂直于当前平面的向量
            Vector3 v1 = AB.Cross(AC);
            //求出垂直于当前平面的向量
            Vector3 v2 = AB.Cross(AP);
            //判断这两个平面的法向量的夹角 :0两个向量是垂直的(90度)   >0:形成的是锐角  <0:角度大于90度   
            return v1.Dot(v2) >= 0;
        }
    }
}

发布了70 篇原创文章 · 获赞 68 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/Rose_Girls/article/details/51880851