Решил довольно 2 способами.
1. Рекурсивный алгоритм Отсеканием по граням, Top -> Right -> Bottom -> Left ->...
1. Запускаю функцию drawTriangle(a,b,c, Plane.Top); Начинаю обход с Верхнего разбиения.
1. проверить все ли точки внутри, тогда нарисовать, выйти.
2. Для каждой точки вычисляю маску ее положения как по Сазерленду, хотя я сам сначала такой способ битовой локализации знал.
//x0 y0 x1 y1 координаты точек прямоугольника.
byte b0 = (byte)((p0.X < x0 ? 8 : 0) | (p0.X > x1 ? 4 : 0) | (p0.Y < y0 ? 2 : 0) | (p0.Y > y1 ? 1 : 0));
byte b1 = (byte)((p1.X < x0 ? 8 : 0) | (p1.X > x1 ? 4 : 0) | (p1.Y < y0 ? 2 : 0) | (p1.Y > y1 ? 1 : 0));
byte b2 = (byte)((p2.X < x0 ? 8 : 0) | (p2.X > x1 ? 4 : 0) | (p2.Y < y0 ? 2 : 0) | (p2.Y > y1 ? 1 : 0));
3. По плоскости(линии) разрезания, перехожу к функции ее разрезания. Нахожу точки которые к ней относятся. Составляю из них маску.
// например для верхней, взять те где y меньше y0. то есть чекаю 2 бит
int _btop = ((b0 & 2) >>1 ) | ((b1&2) ) | ((b2&2)<<1);
4. В swith проверяю 8 комбинаций. (разрезаем треугольники, есть 2 типа разреза, на 2-1 и на 1-2 по сторонам)
- Комбинация равная 0b111 = 7 означает что все 3 точки за плоскостью, завершить функцию
-Комбинация 0b000 = 0 означает, что ни одной точки там нету, тогда повернуть по часовой стрелки, и перейти к 3.
- Комбинации 1,2,4 означают что одна точка за плоскостью, она локализована значениями 1,2,4. Тогда разрезать на 2 треугольника. Нахожу точки пересечения с данной линии разреза, решаю простое уравнение прямой по 2 точкам, от этой точки, к 2 внутренним точки (a,b)=>(Ab'), (a,c)=>(Ac' ). Нахожу значение функции на пересечении с линией разрезании. то есть подставляю в функцию, для Top Bottom, считаю по y от y0,y1...
public static float FunByX(float x,Vector2 p0, ,Vector2 p1){
var dp = p1 - p0;
return (dp.Y / dp.X) * (x - p0.X) + p0.Y;
}
public static float FunByY(float y, ,Vector2 p0, ,Vector2 p1){}
Вызываю рекурсивно 2 функции drawTriangle для новых вершин {Ab',Ac',C}, {Ab',a,b} c следующей по часовой стрелки линии разрезания Top-> Right.
-Для комбинаций, 3,5,6 - 2 точки за линий разрезания. Делю на 1 треугольник, для точек a,b нахожу пересечение линий (a,c) (b,c) с линией разрезания Вызываю drawTriangle для точек {Ac', Bc', c} выхожу из функции.
Так же способ масштабируется для деления по выпуклому 4 угольнику.
Второй способ намного сложнее, куча if-ов что забываешь через минуту куда попал.