// создание треугольниов с помощью z буфера public static void createTriangleWithZBuffer(clsPolygon polygon, cls2D_Picture image, clsRGB colour, clsZbuffer zBuffer) { minimalX = functionMinimumX(polygon); maximalX = functionMaximumX(polygon, image); minimalY = functionMinimumY(polygon); maximalY = functionMaximumY(polygon, image); clsBarycentricCoordinates barycentricPoint = new clsBarycentricCoordinates(polygon); for (int x = minimalX; x < maximalX; x++) { for (int y = minimalY; y < maximalY; y++) { barycentricPoint.Calculating_lambda_coefficients(new cls3D_Point(x, y)); if (barycentricPoint.Lambda0 >= 0 && barycentricPoint.Lambda1 >= 0 && barycentricPoint.Lambda2 >= 0) { double z = barycentricPoint.Lambda0 * polygon[0].Z + barycentricPoint.Lambda1 * polygon[1].Z + barycentricPoint.Lambda2 * polygon[2].Z; if (z < zBuffer.getZBuffer(x, y)) { zBuffer.setZBuffer(x, y, z); image.setPixel(x, y, colour); } } } } }
public static List <clsPolygon> loadPolygonsFromObjectFileWithCheck() { pointsForLineTrans = loadTopsFromObjectFileForLineTrans(); // считываем информацию for (int i = 0; i < lines.Length; i++) { words = lines[i].Split(' '); if (words[0] == "f") { words = lines[i].Split(' ', '/'); // считываем координаты полигонов polygon1 = int.Parse(words[1]); polygon2 = int.Parse(words[4]); polygon3 = int.Parse(words[7]); clsPolygon polygon = new clsPolygon(); // записываем полигон polygon[0] = pointsForLineTrans[polygon1 - 1]; polygon[1] = pointsForLineTrans[polygon2 - 1]; polygon[2] = pointsForLineTrans[polygon3 - 1]; clsBarycentricCoordinates barycentricCoordinates = new clsBarycentricCoordinates(polygon); barycentricCoordinates.Calculating_lambda_coefficients(polygon[0]); if (Math.Abs(1 - barycentricCoordinates.Lambda0 - barycentricCoordinates.Lambda1 - barycentricCoordinates.Lambda2) > 0.001) { MessageBox.Show("Сумма барицентрических координат не равна 1!", "Ошибка", MessageBoxButtons.OK); } polygonsForLineTrans.Add(polygon); // сохраняем в лист } } return(polygonsForLineTrans); }
// создание треугольников public static void createTriangle(clsPolygon polygon, cls2D_Picture image, clsRGB colour) { minimalX = functionMinimumX(polygon); maximalX = functionMaximumX(polygon, image); minimalY = functionMinimumY(polygon); maximalY = functionMaximumY(polygon, image); clsBarycentricCoordinates barycentricPoint = new clsBarycentricCoordinates(polygon); for (int x = minimalX; x < maximalX; x++) { for (int y = minimalY; y < maximalY; y++) { barycentricPoint.Calculating_lambda_coefficients(new cls3D_Point(x, y)); if (barycentricPoint.Lambda0 >= 0 && barycentricPoint.Lambda1 >= 0 && barycentricPoint.Lambda2 >= 0) { image.setPixel(x, y, colour); } } } }