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;
}
}
}
C#之绘制三角形
猜你喜欢
转载自blog.csdn.net/Rose_Girls/article/details/51880851
今日推荐
周排行