示例#1
0
 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);
 }
示例#2
0
        // создание треугольниов с помощью 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);
                        }
                    }
                }
            }
        }
示例#3
0
 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);
 }
示例#4
0
 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);
 }
示例#5
0
 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);
 }
示例#6
0
 // определение размеров
 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);
 }
示例#7
0
        // подсчет косинуса угла между нормалью и скалярным произведением
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        // вычисление нормали
        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));
        }
示例#10
0
        // создание треугольников
        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);
                    }
                }
            }
        }
示例#11
0
 // считываем и записываем полигоны
 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);
 }
示例#12
0
 public clsBarycentricCoordinates(clsPolygon polyg)
 {
     polygon = polyg;
 }