示例#1
0
 private void TrTr(Trojkat trojkat, Trojkat proj) // dla skalowania
 {
     for (int i = 0; i < 3; i++)
     {
         trojkat.listTrojkat[i].Z = proj.listTrojkat[i].Z + 8.0f;
     }
 }
示例#2
0
        // Zafarbowanie i cienowanie figur (algorytm malarski)
        public void FillUpTrokat(Trojkat trojkat, Bitmap bitmap)
        {
            float fl = trojkat.fl;
            float R  = fl * 255;
            float G  = fl * 255;
            float B  = fl * 255;

            if (R < 0)
            {
                R = 0;
            }
            if (G < 0)
            {
                G = 0;
            }
            if (B < 0)
            {
                B = 0;
            }

            SolidBrush myBrush = new SolidBrush(Color.FromArgb((int)R, (int)G, (int)B));

            Point pointFirst  = new Point((int)trojkat.listTrojkat[0].X, (int)trojkat.listTrojkat[0].Y);
            Point pointSecond = new Point((int)trojkat.listTrojkat[1].X, (int)trojkat.listTrojkat[1].Y);
            Point pointThird  = new Point((int)trojkat.listTrojkat[2].X, (int)trojkat.listTrojkat[2].Y);

            Point[] points = { pointFirst, pointSecond, pointThird };

            using (var figure = Graphics.FromImage(bitmap))
            {
                figure.FillPolygon(myBrush, points);
            }
        }
示例#3
0
        private void TrPr(Trojkat trojkat)  // dla skalowania
        {
            for (int i = 0; i < 3; i++)
            {
                trojkat.listTrojkat[i].X += 2.0f;
                trojkat.listTrojkat[i].Y += 2.0f;

                trojkat.listTrojkat[i].X *= 0.3f * (float)pictureBox.Width;
                trojkat.listTrojkat[i].Y *= 0.3f * (float)pictureBox.Height;
            }
        }
示例#4
0
        private void MatrixIncrease(Matrix4x4 projection, Trojkat a, Trojkat b)  // zapisuję się do b projekcja a
        {
            for (int i = 0; i < 3; i++)
            {
                b.listTrojkat[i].X = a.listTrojkat[i].X * projection.M11 + a.listTrojkat[i].Y * projection.M21 + a.listTrojkat[i].Z * projection.M31 + projection.M41;
                b.listTrojkat[i].Y = a.listTrojkat[i].X * projection.M12 + a.listTrojkat[i].Y * projection.M22 + a.listTrojkat[i].Z * projection.M32 + projection.M42;
                b.listTrojkat[i].Z = a.listTrojkat[i].X * projection.M13 + a.listTrojkat[i].Y * projection.M23 + a.listTrojkat[i].Z * projection.M33 + projection.M43;

                float width = a.listTrojkat[i].X * projection.M14 + a.listTrojkat[i].Y * projection.M24 + a.listTrojkat[i].Z * projection.M34 + projection.M44;

                if (width != 0.0f)
                {
                    b.listTrojkat[i].X /= width;
                    b.listTrojkat[i].Y /= width;
                    b.listTrojkat[i].Z /= width;
                }
            }
        }
示例#5
0
        public void TakeVectors()
        {
            string[] linesObj = File.ReadAllLines(sciezkaDoObj);

            foreach (var item in linesObj)
            {
                if (item[0] == 'v' && item[1] == ' ')
                {
                    string[] top = item.ToString().Split(' ');

                    Vector3 a = new Vector3(float.Parse(top[1], CultureInfo.InvariantCulture.NumberFormat), float.Parse(top[2], CultureInfo.InvariantCulture.NumberFormat), float.Parse(top[3], CultureInfo.InvariantCulture.NumberFormat));
                    myVectors.Add(a);
                }

                if (item[0] == 'f' && item[1] == ' ')
                {
                    string[] pointTrojat = item.Split(' ');

                    int trojkat1, trojkat2, trojkat3;

                    trojkat1 = int.Parse(pointTrojat[1]) - 1;
                    trojkat2 = int.Parse(pointTrojat[2]) - 1;
                    trojkat3 = int.Parse(pointTrojat[3]) - 1;

                    int[] idTrojkat = { trojkat1, trojkat2, trojkat3 };

                    indexesTrojkat.Add(idTrojkat);
                }
            }
            foreach (var oneIndeks in indexesTrojkat)
            {
                int ind1 = oneIndeks[0];
                int ind2 = oneIndeks[1];
                int ind3 = oneIndeks[2];

                Trojkat trojkat = new Trojkat(new Vector4(myVectors[ind1], 0f), new Vector4(myVectors[ind2], 0f), new Vector4(myVectors[ind3], 0f));
                myFigures.Add(trojkat);
            }
        }
示例#6
0
        public void Uzytkownik(TimeSpan time)
        {
            bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
            double eTime = time.TotalMilliseconds / 1000;

            theta += 1.0f * (float)eTime; // dla obracania sceny

            // strzałki do obracania sceny
            if ((Keyboard.GetKeyStates(Key.Up) & KeyStates.Down) > 0)
            {
                myCamera.Y += 0.01f + (float)eTime;
            }
            if ((Keyboard.GetKeyStates(Key.Down) & KeyStates.Down) > 0)
            {
                myCamera.Y -= 0.01f + (float)eTime;
            }

            if ((Keyboard.GetKeyStates(Key.Left) & KeyStates.Down) > 0)
            {
                myCamera.X += 0.01f + (float)eTime;
            }
            if ((Keyboard.GetKeyStates(Key.Right) & KeyStates.Down) > 0)
            {
                myCamera.X -= 0.01f + (float)eTime;
            }

            Vector4 vectorForaward = myDirection * (8.0f * (float)eTime);

            // obracanie ze względu kamery
            if ((Keyboard.GetKeyStates(Key.W) & KeyStates.Down) > 0)
            {
                myCamera = subsidiaryClass.VectorADD(myCamera, vectorForaward);
            }
            if ((Keyboard.GetKeyStates(Key.S) & KeyStates.Down) > 0)
            {
                myCamera = subsidiaryClass.VectorSUB(myCamera, vectorForaward);
            }

            if ((Keyboard.GetKeyStates(Key.A) & KeyStates.Down) > 0)
            {
                YawAngle += 0.05f + (float)eTime;
            }
            if ((Keyboard.GetKeyStates(Key.D) & KeyStates.Down) > 0)
            {
                YawAngle -= 0.05f + (float)eTime;
            }


            rotZ = subsidiaryClass.RotZ(theta);
            rotX = subsidiaryClass.RotX(theta);

            // camera
            Vector4   vectorUp   = new Vector4(0, 1, 0, 1);
            Vector4   target     = new Vector4(0, 0, 1, 1);
            Matrix4x4 cameraRotY = subsidiaryClass.RotY(YawAngle);

            myDirection = subsidiaryClass.VectorsMult(target, cameraRotY);
            target      = subsidiaryClass.VectorADD(myCamera, myDirection);
            Matrix4x4 matrixCamera = subsidiaryClass.PointAtMatrix(myCamera, target, vectorUp);

            //make view matrix from camera
            Matrix4x4 matrixView = subsidiaryClass.MatrixInverse(matrixCamera);

            List <Trojkat> fillTrokat = new List <Trojkat>();

            // rysujemy trójkąty za pomocą macierzy projekcji
            foreach (Trojkat item in szescian)
            {
                Trojkat trojkatPr, trojkatTr, trojkatRotZ, trojkatRotZX, trojkatViewed;

                trojkatViewed = new Trojkat(new Vector4(0f, 0f, 0f, 1f), new Vector4(0f, 0f, 0f, 1f), new Vector4(0f, 0f, 0f, 1f));
                trojkatRotZ   = new Trojkat(new Vector4(0f, 0f, 0f, 1f), new Vector4(0f, 0f, 0f, 1f), new Vector4(0f, 0f, 0f, 1f));
                trojkatRotZX  = new Trojkat(new Vector4(0f, 0f, 0f, 1f), new Vector4(0f, 0f, 0f, 1f), new Vector4(0f, 0f, 0f, 1f));
                MatrixIncrease(rotZ, item, trojkatRotZ);
                MatrixIncrease(rotX, trojkatRotZ, trojkatRotZX);

                trojkatPr = new Trojkat(new Vector4(0f, 0f, 0f, 1f), new Vector4(0f, 0f, 0f, 1f), new Vector4(0f, 0f, 0f, 1f));

                // zumowanie figury
                trojkatTr = trojkatRotZX;
                TrTr(trojkatTr, trojkatRotZX);

                Vector4 vectorNorm, v1, v2;
                v1 = new Vector4(0, 0, 0, 0);
                v2 = new Vector4(0, 0, 0, 0);

                v1.X = trojkatTr.listTrojkat[1].X - trojkatTr.listTrojkat[0].X;
                v1.Y = trojkatTr.listTrojkat[1].Y - trojkatTr.listTrojkat[0].Y;
                v1.Z = trojkatTr.listTrojkat[1].Z - trojkatTr.listTrojkat[0].Z;

                v2.X = trojkatTr.listTrojkat[2].X - trojkatTr.listTrojkat[1].X;
                v2.Y = trojkatTr.listTrojkat[2].Y - trojkatTr.listTrojkat[1].Y;
                v2.Z = trojkatTr.listTrojkat[2].Z - trojkatTr.listTrojkat[1].Z;

                vectorNorm = subsidiaryClass.VecCrossProduct(v1, v2);

                // normalizacja wektorów
                vectorNorm = subsidiaryClass.VectorNorm(vectorNorm);

                if (vectorNorm.X * (trojkatTr.listTrojkat[0].X - myCamera.X) +
                    vectorNorm.Y * (trojkatTr.listTrojkat[0].Y - myCamera.Y) +
                    vectorNorm.Z * (trojkatTr.listTrojkat[0].Z - myCamera.Z) < 0.0f) // bo widzimy tylko ujemne z-ety
                {
                    Vector4 light = new Vector4(0.0f, -1.0f, -1.0f, 1.0f);           // ustawienie kierunku światła
                    light = subsidiaryClass.VectorNorm(light);

                    float fl = vectorNorm.X * light.X + vectorNorm.Y * light.Y + vectorNorm.Z * light.Z;

                    MatrixIncrease(matrixView, trojkatTr, trojkatViewed);

                    int       ClippedT = 0;
                    Trojkat[] cliped   = new Trojkat[2] {
                        new Trojkat(new Vector4(0, 0, 0, 1), new Vector4(0, 0, 0, 1), new Vector4(0, 0, 0, 1)), new Trojkat(new Vector4(0, 0, 0, 1), new Vector4(0, 0, 0, 1), new Vector4(0, 0, 0, 1))
                    };;
                    Vector4 p_p = new Vector4(0.0f, 0.0f, 0.1f, 1.0f);
                    Vector4 p_n = new Vector4(0.0f, 0.0f, 1.0f, 1.0f);
                    ClippedT = subsidiaryClass.TClipAgainstPlane(p_p, p_n, trojkatViewed, ref cliped[0], ref cliped[1]);
                    for (int i = 0; i < ClippedT; i++)
                    {
                        MatrixIncrease(matrixPr, cliped[i], trojkatPr);
                        TrPr(trojkatPr);
                        trojkatPr.fl = fl;
                        fillTrokat.Add(trojkatPr);
                    }
                }
            }

            fillTrokat.Sort();

            foreach (var item in fillTrokat)
            {
                FillUpTrokat(item, bitmap);
            }

            pictureBox.Image = bitmap;
        }
示例#7
0
        public int TClipAgainstPlane(Vector4 plane_p, Vector4 plane_n, Trojkat in_tri, ref Trojkat out_tri1, ref Trojkat out_tri2)
        {
            plane_n = VectorNorm(plane_n);

            Vector4[] insidePoints        = new Vector4[3];
            Vector4[] outsidePoints       = new Vector4[3];
            int       nInsidePointCount   = 0;
            int       noutsidePointsCount = 0;

            float d0 = Distans(in_tri.listTrojkat[0], plane_n, plane_p);
            float d1 = Distans(in_tri.listTrojkat[1], plane_n, plane_p);
            float d2 = Distans(in_tri.listTrojkat[2], plane_n, plane_p);

            if (d0 >= 0)
            {
                insidePoints[nInsidePointCount++] = in_tri.listTrojkat[0];
            }
            else
            {
                outsidePoints[noutsidePointsCount++] = in_tri.listTrojkat[0];
            }
            if (d1 >= 0)
            {
                insidePoints[nInsidePointCount++] = in_tri.listTrojkat[1];
            }
            else
            {
                outsidePoints[noutsidePointsCount++] = in_tri.listTrojkat[1];
            }
            if (d2 >= 0)
            {
                insidePoints[nInsidePointCount++] = in_tri.listTrojkat[2];
            }
            else
            {
                outsidePoints[noutsidePointsCount++] = in_tri.listTrojkat[2];
            }

            if (nInsidePointCount == 0)
            {
                return(0);
            }

            if (nInsidePointCount == 3)
            {
                out_tri1 = in_tri;
                return(1);
            }

            if (nInsidePointCount == 1 && noutsidePointsCount == 2)
            {
                out_tri1.listTrojkat[0] = insidePoints[0];
                out_tri1.listTrojkat[1] = V_IntersectPlane(plane_p, plane_n, insidePoints[0], outsidePoints[0]);
                out_tri1.listTrojkat[2] = V_IntersectPlane(plane_p, plane_n, insidePoints[0], outsidePoints[1]);
                return(1);
            }

            if (nInsidePointCount == 2 && noutsidePointsCount == 1)
            {
                out_tri1.listTrojkat[0] = insidePoints[0];
                out_tri1.listTrojkat[1] = insidePoints[1];
                out_tri1.listTrojkat[2] = V_IntersectPlane(plane_p, plane_n, insidePoints[0], outsidePoints[0]);


                out_tri2.listTrojkat[0] = insidePoints[1];
                out_tri2.listTrojkat[1] = out_tri1.listTrojkat[2];
                out_tri2.listTrojkat[2] = V_IntersectPlane(plane_p, plane_n, insidePoints[1], outsidePoints[0]);

                return(2);
            }
            return(0);
        }