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(); }
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 }