using System.Collections.Generic;
public static Random random;
public static void Main()
var Vertices = new List<string>();
var Faces = new List<string>();
var p = new Vector2(551, -17);
var p1 = new Vector3(561.5292, 214.9312, -19.92188);
var p2 = new Vector3(537.413, 215.8389, -10.5);
var p3 = new Vector3(550.4863, 214.7789, -21.1875);
if (GetBarycentricCoordinate(p1, p2, p3, p))
var v4 = new Vector4(p.X, GetDeterminant(p1, p2, p3, p), p.Y, random.NextDouble() * 2 * Math.PI - Math.PI);
Console.WriteLine(v4.X.ToString("F3") + " " + v4.Y.ToString("F3") + " " + v4.Z.ToString("F3") + " " + v4.W.ToString("F3"));
public static bool GetBarycentricCoordinate(Vector3 p1, Vector3 p2, Vector3 p3, Vector2 p)
double lambda1 = ((p2.Z - p3.Z)*(p.X - p3.X) + (p3.X - p2.X)*(p.Y - p3.Z)) /
((p2.Z - p3.Z)*(p1.X - p3.X) + (p3.X - p2.X)*(p1.Z - p3.Z));
double lambda2 = ((p3.Z - p1.Z)*(p.X - p3.X) + (p1.X - p3.X)*(p.Y - p3.Z)) /
((p2.Z - p3.Z)*(p1.X - p3.X) + (p3.X - p2.X)*(p1.Z - p3.Z));
double lambda3 = 1 - lambda1 - lambda2;
if (lambda1 > 0 && lambda2 > 0 && lambda3 > 0)
public static double GetDeterminant(Vector3 p1, Vector3 p2, Vector3 p3, Vector2 p)
double aei = (p.X - p1.X)*(p2.Y - p1.Y)*(p3.Z - p1.Z);
double fg = (p2.Z - p1.Z)*(p3.X - p1.X);
double cdh = (p.Y - p1.Z)*(p2.X - p1.X)*(p3.Y - p1.Y);
double ceg = (p.Y - p1.Z)*(p2.Y - p1.Y)*(p3.X - p1.X);
double di = (p2.X - p1.X)*(p3.Z - p1.Z);
double afh = (p.X - p1.X)*(p2.Z - p1.Z)*(p3.Y - p1.Y);
return (double)((aei + cdh - ceg - afh) / (di - fg)) + p1.Y;
public Vector2(double x, double y)
public double X { get; set; }
public double Y { get; set; }
public Vector3(double x, double y, double z)
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public Vector4(double x, double y, double z, double w)
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public double W { get; set; }