Advertisement
StreetKatya

f

May 20th, 2022
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.87 KB | None | 0 0
  1. open System
  2. open System.Drawing
  3. open System.Windows.Forms
  4.  
  5.  
  6. let mutable bit = new Bitmap(1000,1000)
  7. let mutable g = Graphics.FromImage(bit)
  8. let mutable count = 0 //счётчик количества шагов отрисовки
  9. let brush = new SolidBrush(Color.Red)
  10.  
  11. let rec DrawFrac (rect: RectangleF) (c:int) =
  12. // пока мы можем нормально отрисовать(условно это квадратик три на три, берём с избытком)
  13. if (c=0) then
  14. g.FillRectangle(brush, rect)//если рекурсия закончилась, закрашиваем квадрат
  15. else
  16. //новые размеры квадратика
  17. let width = rect.Width / (float32 3)
  18. let height = rect.Height / (float32 3)
  19.  
  20. // (x1, y1) - координаты левой верхней вершины прямоугольника от нее будем отсчитывать остальные вершины маленьких прямоугольников
  21. let x1 = rect.Left
  22. let x2 = x1 + width
  23. let x3 = x1 + (float32 2) * width
  24.  
  25. let y1 = rect.Top
  26. let y2 = y1 + height
  27. let y3 = y1 + (float32 2) * height
  28.  
  29. DrawFrac (new RectangleF(new PointF(x1, y1), new SizeF(width, height))) (c-1)// левый 1(верхний)
  30. DrawFrac (new RectangleF(new PointF(x2, y1), new SizeF(width, height))) (c-1)// средний 1
  31. DrawFrac (new RectangleF(new PointF(x3, y1), new SizeF(width, height))) (c-1)// правый 1
  32. DrawFrac (new RectangleF(new PointF(x1, y2), new SizeF(width, height))) (c-1)// левый 2
  33. DrawFrac (new RectangleF(new PointF(x3, y2), new SizeF(width, height))) (c-1)// правый 2
  34. DrawFrac (new RectangleF(new PointF(x1, y3), new SizeF(width, height))) (c-1)// левый 3
  35. DrawFrac (new RectangleF(new PointF(x2, y3), new SizeF(width, height))) (c-1)// средний 3
  36. DrawFrac (new RectangleF(new PointF(x3, y3), new SizeF(width, height))) (c-1)// правый 3
  37.  
  38. let form =
  39. let temp = new Form()
  40. temp.SizeChanged.Add(fun e -> temp.Invalidate())//если размер окна поменялся, перерисовываем
  41. temp.Shown.Add(fun e -> temp.WindowState <- FormWindowState.Maximized)//как только форма показывается, делаем её максимального размера
  42. //отрисовка
  43. temp.Paint.Add(fun e -> bit <- new Bitmap(temp.Width, temp.Height))//создаём новый битмап
  44. temp.Paint.Add(fun e ->g <- Graphics.FromImage(bit))//и графику из этого битмапа
  45. 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)
  46. temp.Paint.Add(fun e -> e.Graphics.DrawImage(bit, 0, 0))//отрисовываем битмап
  47. //обработка клика
  48. temp.MouseClick.Add(fun e ->
  49. 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евая кнопка, увеличиваем количество шагов, иначе - уменьшаем
  50. //если ожидаемый размер самого маленького квадратика больше трёх, тогда увеличиваем количество шагов, иначе не увеличиваем
  51. temp.MouseClick.Add(fun e -> temp.Invalidate())//перерисовываем
  52. temp
  53.  
  54.  
  55. [<STAThread>]
  56. do Application.Run(form)
  57.  
  58.  
  59.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement