Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open System
- open System.Drawing
- open System.Windows.Forms
- let mutable bit = new Bitmap(1000,1000)
- let mutable g = Graphics.FromImage(bit)
- let mutable count = 0 //счётчик количества шагов отрисовки
- let brush = new SolidBrush(Color.Red)
- let rec DrawFrac (rect: RectangleF) (c:int) =
- // пока мы можем нормально отрисовать(условно это квадратик три на три, берём с избытком)
- if (c=0) then
- g.FillRectangle(brush, rect)//если рекурсия закончилась, закрашиваем квадрат
- else
- //новые размеры квадратика
- let width = rect.Width / (float32 3)
- let height = rect.Height / (float32 3)
- // (x1, y1) - координаты левой верхней вершины прямоугольника от нее будем отсчитывать остальные вершины маленьких прямоугольников
- let x1 = rect.Left
- let x2 = x1 + width
- let x3 = x1 + (float32 2) * width
- let y1 = rect.Top
- let y2 = y1 + height
- let y3 = y1 + (float32 2) * height
- DrawFrac (new RectangleF(new PointF(x1, y1), new SizeF(width, height))) (c-1)// левый 1(верхний)
- DrawFrac (new RectangleF(new PointF(x2, y1), new SizeF(width, height))) (c-1)// средний 1
- DrawFrac (new RectangleF(new PointF(x3, y1), new SizeF(width, height))) (c-1)// правый 1
- DrawFrac (new RectangleF(new PointF(x1, y2), new SizeF(width, height))) (c-1)// левый 2
- DrawFrac (new RectangleF(new PointF(x3, y2), new SizeF(width, height))) (c-1)// правый 2
- DrawFrac (new RectangleF(new PointF(x1, y3), new SizeF(width, height))) (c-1)// левый 3
- DrawFrac (new RectangleF(new PointF(x2, y3), new SizeF(width, height))) (c-1)// средний 3
- DrawFrac (new RectangleF(new PointF(x3, y3), new SizeF(width, height))) (c-1)// правый 3
- let form =
- let temp = new Form()
- temp.SizeChanged.Add(fun e -> temp.Invalidate())//если размер окна поменялся, перерисовываем
- temp.Shown.Add(fun e -> temp.WindowState <- FormWindowState.Maximized)//как только форма показывается, делаем её максимального размера
- //отрисовка
- temp.Paint.Add(fun e -> bit <- new Bitmap(temp.Width, temp.Height))//создаём новый битмап
- temp.Paint.Add(fun e ->g <- Graphics.FromImage(bit))//и графику из этого битмапа
- temp.Paint.Add(fun e -> DrawFrac (new RectangleF(new PointF((float32 ((temp.Width+20)/2)) - (float32 (Math.Min(temp.Width, temp.Height)/2)), (float32 ((temp.Height+20)/2)) - (float32 (Math.Min(temp.Width, temp.Height)/2))), new SizeF((float32 (Math.Min(temp.Width, temp.Height)-60)), (float32 (Math.Min(temp.Width, temp.Height)-60))))) count)
- temp.Paint.Add(fun e -> e.Graphics.DrawImage(bit, 0, 0))//отрисовываем битмап
- //обработка клика
- temp.MouseClick.Add(fun e ->
- if(e.Button <> MouseButtons.Left) then (if (count <> 0) then count <- count-1 )else if(float(Math.Min(temp.Width, temp.Height)-60)/(Math.Pow(2., (float count))) >= 2.) then count <- count+1)//если нажата lевая кнопка, увеличиваем количество шагов, иначе - уменьшаем
- //если ожидаемый размер самого маленького квадратика больше трёх, тогда увеличиваем количество шагов, иначе не увеличиваем
- temp.MouseClick.Add(fun e -> temp.Invalidate())//перерисовываем
- temp
- [<STAThread>]
- do Application.Run(form)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement