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); }
// создание треугольниов с помощью 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 int functionMaximumY(clsPolygon poligon, cls2D_Picture Picture) { maximalY = Math.Max(Math.Max(poligon[0].Y, poligon[1].Y), poligon[2].Y); if (maximalY > Picture.height) { maximalY = Picture.height; } return(maximalY); }
public static int functionMaximumX(clsPolygon poligon, cls2D_Picture Picture) { maximalX = Math.Max(Math.Max(poligon[0].X, poligon[1].X), poligon[2].X); if (maximalX > Picture.width) { maximalX = Picture.width; } return(maximalX); }
public static int functionMinimumY(clsPolygon poligon) { minimalY = Math.Min(Math.Min(poligon[0].Y, poligon[1].Y), poligon[2].Y); if (minimalY < 0) { minimalY = 0; } return(minimalY); }
// определение размеров public static int functionMinimumX(clsPolygon poligon) { minimalX = Math.Min(Math.Min(poligon[0].X, poligon[1].X), poligon[2].X); if (minimalX < 0) { minimalX = 0; } return(minimalX); }
// подсчет косинуса угла между нормалью и скалярным произведением public static double cosDirectionEarthNormal(clsPolygon polygon) { clsVector normaliseVector = getVectorNormal(polygon); // скалярное произведение double scalarMulty = normaliseVector.X * vectorLight.X + normaliseVector.Y * vectorLight.Y + normaliseVector.Z * vectorLight.Z; // норма вектора double normalVectorLength = Math.Sqrt(normaliseVector.X * normaliseVector.X + normaliseVector.Y * normaliseVector.Y + normaliseVector.Z * normaliseVector.Z); return(scalarMulty / normalVectorLength); }
public static cls2D_Picture drawPolygonsFromObjectFile(List <clsPolygon> polygons) { cls2D_Picture polygonsImage = new cls2D_Picture(1800, 1500); // фон for (int i = 0; i < polygons.Count - 1; i++) // рисуем полигон по алгоритму Брезенхема { clsPolygon poligonchik = polygons[i]; clsAlgorithmDrawLine.line4(poligonchik[0].X, poligonchik[0].Y, poligonchik[1].X, poligonchik[1].Y, polygonsImage, new clsRGB(0, 0, 255)); clsAlgorithmDrawLine.line4(poligonchik[0].X, poligonchik[0].Y, poligonchik[2].X, poligonchik[2].Y, polygonsImage, new clsRGB(0, 0, 255)); clsAlgorithmDrawLine.line4(poligonchik[1].X, poligonchik[1].Y, poligonchik[2].X, poligonchik[2].Y, polygonsImage, new clsRGB(0, 0, 255)); } return(polygonsImage); }
// вычисление нормали public static clsVector getVectorNormal(clsPolygon polygon) { double x0 = polygon[0].X; double y0 = polygon[0].Y; double z0 = polygon[0].Z; double x1 = polygon[1].X; double y1 = polygon[1].Y; double z1 = polygon[1].Z; double x2 = polygon[2].X; double y2 = polygon[2].Y; double z2 = polygon[2].Z; // нахождение координат нормали через определитель double x = (y1 - y0) * (z1 - z2) - (z1 - z0) * (y1 - y2); double y = (x1 - x0) * (z1 - z2) - (z1 - z0) * (x1 - x2); double z = (x1 - x0) * (y1 - y2) - (y1 - y0) * (x1 - x2); return(new clsVector(x, y, z)); }
// создание треугольников 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); } } } }
// считываем и записываем полигоны public static List <clsPolygon> loadPolygonsFromObjectFileWithOutCheck() { 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]; polygonsForLineTrans.Add(polygon); // сохраняем в лист } } return(polygonsForLineTrans); }
public clsBarycentricCoordinates(clsPolygon polyg) { polygon = polyg; }