Нарисуйте прокладку Аполлония в C#

Пример Найти круги, которые касаются трех заданных кругов (проблема Аполлония) в C# , показывают, как найти до восьми кругов, которые касаются трех заданных кругов. В этом примере используется этот метод для сборки прокладки Аполлония.

Это также называется упаковкой Аполлония. Если вы думаете о каждом круге, как обрезать отверстие в охватывающем круге, чтобы получить фигурку в виде кружева, это прокладка Аполлония. Если вы считаете, что заполняете круг, окруженный другими кругами, это упаковка.

Следующий метод FindApollonianPacking управляет чертежом и возвращает Bitmap, удерживающий упаковку.

Этот метод начинается с создания растрового изображения нужного размера. Затем он создает три больших круга внутри окружающего круга. Он делает небольшую математику, чтобы правильно распределить круги, устраивает их так, чтобы они касались друг друга, а затем рисует их.

Далее код вызывает метод FindApollonianCircle, используемый в предыдущем примере, чтобы найти круг, касательный к трем большим кругам. Он передает параметры -1, -1 и -1, чтобы найти касательную окружность, содержащую все три больших круга, поэтому результатом является круг, который охватывает аполлоновскую прокладку. Затем программа рисует окружность.

Затем код вызывает метод FindCircleOutsideAll, чтобы найти и нарисовать маленький круг, который находится между тремя начальными кругами. Он заканчивается, вызывая FindCircleOutsideTwo три раза, чтобы найти круги, которые лежат внутри окружного круга, но вне двух внутренних больших кругов.

В следующем коде показан метод FindCircleOutsideAll.

Метод FindCircleOutsideAll находит круг, касательный к трем другим кругам, который не содержит ни одного из трех. В этой программе это круг, который находится между тремя другими кругами. Например, самый центральный круг лежит между тремя большими кругами.

Код вызывает метод FindApollonianCircle, используемый предыдущей примерной программой, передавая ему параметры 1, 1, 1, чтобы найти нужный круг. Если он найдет такой круг, код рисует его.

Затем код уменьшает параметр level и, если он еще больше 0, метод вызывает себя рекурсивно три раза, чтобы найти круги между новым кругом и парами исходных трех кругов , (Изучите картину, чтобы увидеть, где находятся эти области.)

В следующем коде показан метод FindCircleOutsideTwo.

Этот метод находит круг, который находится внутри одного круга и снаружи двух других. Например, на рисунке этот метод рисует круг среднего размера в правом верхнем углу, который лежит внутри окружного круга и за пределами двух больших кругов.

Код вызывает метод FindApollonianCircle, передавая ему параметры 1, 1 и -1, чтобы найти соответствующий круг. Обратите внимание, что порядок, в котором код передает круги этому методу, важен, потому что последний круг является тем, который должен содержать новый круг.

Источник: http://csharphelper.com/blog/2016/09/draw-an-apollonian-gasket-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *