Exemple #1
0
        private void Draw_fract()
        {
            if (error)
            {
                return;
            }
            //calc_fract();
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
            Gl.glClearColor(255, 255, 255, 1);
            Gl.glLoadIdentity();
            Gl.glPushMatrix();
            Gl.glScaled(zoom, zoom, 0);
            Gl.glTranslated(a - 1, b - 1, 0);


            Gl.glBegin(Gl.GL_QUADS);
            //ниже стартовый четырехугольник
            Gl.glColor3d(0, 0, 0);
            Gl.glVertex2d(startA.x, startA.y);
            Gl.glVertex2d(startB.x, startB.y);
            Gl.glVertex2d(startC.x, startC.y);
            Gl.glVertex2d(startD.x, startD.y);
            //end

            Gl.glColor3d(1, 1, 1);
            int schet = 0;

            for (int i = 0; i < mass.Count; i++)
            {
                fAngle temp = (fAngle)mass[i];
                if (epilepsia)
                {
                    Gl.glColor3d(rnd.Next(0, 10000) / 10000.0, rnd.Next(0, 10000) / 10000.0, rnd.Next(0, 10000) / 10000.0);
                }
                else
                {
                    Gl.glColor3d(epilepsR[temp.n], epilepsG[temp.n], epilepsB[temp.n]);
                }


                Gl.glVertex2d(temp.A.x, temp.A.y);
                Gl.glVertex2d(temp.B.x, temp.B.y);
                Gl.glVertex2d(temp.C.x, temp.C.y);
                Gl.glVertex2d(temp.D.x, temp.D.y);
            }
            Gl.glEnd();
            Gl.glPopMatrix();
            Gl.glFlush();
            fractPicture.Invalidate();
        }
Exemple #2
0
        private void calc(Pair A, Pair B, Pair C, Pair D, int n)
        {
            isCalc = true;
            if (error)
            {
                return;
            }
            if (n <= 0)
            {
                return;
            }
            //TODO: Добавить функцию которая будет располагать точки в правильной последовательности

            #region Основные линии
            Line AB = new Line(A, B);
            Line BC = new Line(B, C);
            Line CD = new Line(C, D);
            Line DA = new Line(D, A);
            #endregion
            #region Доп точки
            var A1 = new Pair(A.x + AB.x / 3, A.y + AB.y / 3);  // A + AB/3
            var A2 = new Pair(A.x - DA.x / 3, A.y - DA.y / 3);  // A - DA/3

            var B1 = new Pair(B.x - AB.x / 3, B.y - AB.y / 3);  // B - AB/3
            var B2 = new Pair(B.x + BC.x / 3, B.y + BC.y / 3);  // B + BC/3

            var C1 = new Pair(C.x - BC.x / 3, C.y - BC.y / 3);  // C - BC/3
            var C2 = new Pair(C.x + CD.x / 3, C.y + CD.y / 3);  // C + CD/3

            var D1 = new Pair(D.x + DA.x / 3, D.y + DA.y / 3);  // D + DA/3
            var D2 = new Pair(D.x - CD.x / 3, D.y - CD.y / 3);  // D - CD/3

            #endregion
            #region Доп линии
            var A2B2 = new Line(A2, B2);
            var D1C1 = new Line(D1, C1);
            var B1C2 = new Line(B1, C2);
            var A1D2 = new Line(A1, D2);

            #endregion


            var one   = new Pair(B.x + (BC.x - A2B2.x) / 3, B.y + (BC.y - A2B2.y) / 3);
            var two   = new Pair(C.x + (-BC.x - D1C1.x) / 3, C.y + (-BC.y - D1C1.y) / 3);
            var three = new Pair(A.x + (-DA.x + A2B2.x) / 3, A.y + (-DA.y + A2B2.y) / 3);
            var four  = new Pair(D.x + (DA.x + D1C1.x) / 3, D.y + (DA.y + D1C1.y) / 3);

            //Добавление в массив четырехугольника который надо закрасить.
            var temp = new fAngle(one, two, four, three);
            temp.n = n;
            mass.Add(temp);


            #region  екурсия
            //Вызов самой себя для оставшихся 8 четырехугольников
            calc(A, A1, three, A2, n - 1);      //Нижний левый
            calc(A1, B1, one, three, n - 1);    //Левый
            calc(B1, B, B2, one, n - 1);        //Верхний левый
            calc(one, B2, C1, two, n - 1);      //Верхний
            calc(two, C1, C, C2, n - 1);        //Верхний правый
            calc(four, two, C2, D2, n - 1);     //Правый
            calc(D1, four, D2, D, n - 1);       //Нижний правый
            calc(A2, three, four, D1, n - 1);   //Нижний
            #endregion
        }