Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7

Как нарисовать 40 соприкасающихся окружностей?

08.02.2021, 19:33. Показов 6399. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача следующая: Три окружности равного радиуса ( = 1) попарно соприкасающихся друг с другом образуя таким образом некую область похожую на равносторонний треугольник стороны которого есть дуги вышеупомянутых окружностей.



Условие задачи (продолжение)
Итак, надо между тремя окружностями вписать ещё одну, которая будет касаться всех трёх. Это возможно. Кому интересно - пусть посмотрит в интернете: "теорема Декарта (геометрия)", есть и другое название этой теоремы - теорема Содди или теорема о соприкасающихся окружностях. А так же нужна ещё одна формула из "Комплексной теоремы Декарта".
А дальше всё просто. Нарисовав одну окружность "между тремя" - мы будем иметь возможность нарисовать ещё 3 окружности. Потом ещё 9 и ещё 27. Итого 40 соприкасающихся между собой окружностей.

Решение (алгоритм)
1. процедура Index() устанавливает (ещё до рисования окружностей) какие три окружности образуют тройку, где они попарно соприкасаются. Тут на форуме была моя тема о заполнении матрицы по сложному алгоритму. Этот алгоритм был слегка модифицирован и использован в этой задаче. Надо отметить, что каждая окружность имеет свой номер (индекс) - отсюда и название процедуры. Индексы троек хранятся в массиве (матрице) M().
2. процедура Krumm() определяет кривизну всех окружностей и заносит данные в массив k()
3. процедура Qwrz() извлекает квадратный корень из комплексного числа. Эта совершенно новая процедура - новый алгоритм. Конечно можно было использовать и старый алгорим, который я предложил в своей теме о комплексных числах. Но решая данную задачу, я наткнулся на то, что программа рисует окружности где-то в стороне. Я подумал, что виноват алгоритм вычисления квадратного корня. Нет его вины. Это я неправильно установил систему координат. Но алгорим уже был заменён и я не стал его отменять.
4. процедура Komplex() вычисляет сложное арифметическое выражение состоящее из множества операций как вещественных, так и комплексных чисел. Вот оно: z4 = (k1 * z1 + k2 * z2 + k3 * z3 + 2 * SQR(k1 * k2 * z1 * z2 + k2 * k3 * z2 * z3 + k3 * k1 * z3 * z1)) / k4. Все данные заносятся в массив (матрицу) z(). Можете себе представить, что 33 строки этой процедуры подарили мне голубизну неба, прозрачность воздуха и блеск солнечных лучей. Ага. Столько счастья и всё мне одному? Вот решил с вами поделиться.
Скорого ответа не жду. Я тут 10 дней решал - вря ли кто-нибудь быстро (без бутылки) разберёт.


QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
REM
REM  Программа рисует соприкасающиеся окружности
REM
REM  Формула 1 из теоремы Декарта (геометрия)
REM  k4 = k1 + k2 + k3 + 2 * SQR(k1 * k2 + k2 * k3 + k3 * k1)
REM
REM  Формула 2 из комлексной теоремы Декарта
REM  z4 = (k1 * z1 + k2 * z2 + k3 * z3 + 2 * SQR(k1*k2*z1*z2 + k2*k3*z2*z3 + k3*k1*z3*z1))/k4
REM 
REM  k1, k2, k3, k4 - вещественные числа, z1, z2, z3, z4 - комплексные числа
REM 
 
DECLARE SUB Krumm ()
DECLARE SUB Komplex ()
DECLARE SUB Index (i!, j!)
DECLARE SUB Qwrz (c0!, c1!, c00!, c11!)
 
CLS
 
CONST pi = 3.141593
DIM SHARED k(1 TO 43)
   k(1) = 1: k(2) = 1: k(3) = 1
 
DIM SHARED z(1 TO 43, 1)
   z(1, 0) = 0: z(1, 1) = 0
   z(2, 0) = 2: z(2, 1) = 0
   z(3, 0) = 1: z(3, 1) = SQR(3)
 
DIM SHARED M(4 TO 43, 3)
   M(4, 1) = 1: M(4, 2) = 2: M(4, 3) = 3
 
FOR i = 4 TO 16
   CALL Index(i, 3 * i - 8)
NEXT
 
CALL Krumm
CALL Komplex
 
SCREEN 11
WINDOW (.333, 1)-(1.667, 0)
CIRCLE (0, 0), 1, , 0, pi / 3
CIRCLE (2, 0), 1, , 2 / 3 * pi, pi
CIRCLE (1, SQR(3)), 1, , 4 / 3 * pi, 5 / 3 * pi
 
FOR i = 4 TO 43
   CIRCLE (z(i, 0), z(i, 1)), 1 / k(i)
NEXT
END
 
                ' Вычисляет номера троек соприкасающихся окружностей
SUB Index (i, j)
   M(j + 1, 1) = i
   M(j + 1, 2) = M(i, 2)
   M(j + 1, 3) = M(i, 3)
 
   M(j + 2, 1) = M(i, 1)
   M(j + 2, 2) = i
   M(j + 2, 3) = M(i, 3)
 
   M(j + 3, 1) = M(i, 1)
   M(j + 3, 2) = M(i, 2)
   M(j + 3, 3) = i
END SUB
 
                ' Вычисление декартовых координат окружностей
SUB Komplex
   FOR i = 4 TO 43
      k1 = k(M(i, 1))
      k2 = k(M(i, 2))
      k3 = k(M(i, 3))
      k4 = k(i)
      
      z10 = z(M(i, 1), 0)
      z11 = z(M(i, 1), 1)
      z20 = z(M(i, 2), 0)
      z21 = z(M(i, 2), 1)
      z30 = z(M(i, 3), 0)
      z31 = z(M(i, 3), 1)
      
      c0 = z10 * z20 - z11 * z21
      c1 = z10 * z21 + z11 * z20
      c0 = c0 * k1 * k2
      c1 = c1 * k1 * k2
 
      d0 = z20 * z30 - z21 * z31
      d1 = z20 * z31 + z21 * z30
      c0 = c0 + d0 * k2 * k3
      c1 = c1 + d1 * k2 * k3
 
      d0 = z30 * z10 - z31 * z11
      d1 = z30 * z11 + z31 * z10
      c0 = c0 + d0 * k3 * k1
      c1 = c1 + d1 * k3 * k1
 
      CALL Qwrz(c0, c1, c00, c11)
 
      z(i, 0) = (k1 * z10 + k2 * z20 + k3 * z30 + 2 * c00) / k4
      z(i, 1) = (k1 * z11 + k2 * z21 + k3 * z31 + 2 * c11) / k4
   NEXT
END SUB
 
                ' Вычисление кривизны окружностей
SUB Krumm
   FOR i = 4 TO 43
      k1 = k(M(i, 1))
      k2 = k(M(i, 2))
      k3 = k(M(i, 3))
      k(i) = k1 + k2 + k3 + 2 * SQR(k1 * k2 + k2 * k3 + k3 * k1)
   NEXT
END SUB
 
              ' Извлечение квадратного корня из числа a + bi
SUB Qwrz (a!, b!, c00!, c11!)
    c11 = SQR((SQR(a ^ 2 + b ^ 2) - a) / 2)
    c00 = b / (2 * c11)
END SUB
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.02.2021, 19:33
Ответы с готовыми решениями:

Построение соприкасающихся окружностей в Autolisp
Помогите пожалуйста с заданием: Построение параметрических чертежей в среде AutoCAD 2010 Задание: По радиусу R и натуральному числу N...

Вывести изображение "5 соприкасающихся окружностей вписаны в большую окружность"
Вывести изображение "5 соприкасающихся окружностей вписаны в большую окружность"

Модуль Graph. Нарисовать домик. Нарисовать узор из окружностей
Помогите пожалуйста)))) 1)Нарисовать домик за начала рисунка взять координаты левого угла домика и все остальные вычислить через эту...

8
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
08.02.2021, 20:18
Лучший ответ Сообщение было отмечено wer1 как решение

Решение

Mandelbrot

2
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
08.02.2021, 20:26  [ТС]
Pro_grammer,
спасибо! Я так понимаю, что есть программа которая может нарисовать "бесконечное" количество соприкасающихся окружностей? То есть, есть и первооткрыватели этой задачи? И перворешатели?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
08.02.2021, 20:57
Цитата Сообщение от wer1 Посмотреть сообщение
То есть, есть и первооткрыватели этой задачи? И перворешатели?
Наверно фракталы это чуточку больше, чем просто рисование окружностей. Но картинка похожа.
1
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
09.02.2021, 07:55  [ТС]
Pro_grammer,
спасибо! Вы понимаете, эта программа может рисовать и другие наборы окружностей. Достаточно заменить три самые большие окружности на три любые соприкасающиеся окружности. То есть внести в программу изменения начальных данных. Это строки 22 и 25-27. Кроме того, окружностей может быть гораздо больше. С самого начала я предполагал, что программа будет рисовать не 40, а 121 окружность. Но подсчитав их радиус... понял: это почти точки, а не окружности - и я отказался увеличивать их число. А ведь всё просто - небольшие изменения в программу - и готово.
Фракталы? - Да конечно, это интересно с точки зрения алгоритма...
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
09.02.2021, 18:32
Цитата Сообщение от wer1 Посмотреть сообщение
Но подсчитав их радиус... понял: это почти точки, а не окружности - и я отказался увеличивать их число
А вы рисуйте не на экране, а на картинке, а потом выводите её на экран.
Картинку можно будет взять хоть миллион на миллион пикселей — получится фрактал не из 121 окружностей, а ил 121 тысяч окружностей.
1
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
09.02.2021, 19:57  [ТС]
Замабувараев,
спасибо! Но вы понимаете, размер экрана бейсика 640 × 480 ... То есть много не нарисуешь. Да понял я вас, понял! Данные можно вывести в файл. Но вы хоть знаете как устроен bmp-файл? Это та ещё задача перевести вычисленные координаты в данные bmp-файла. Просто так не нарисуешь. VB6 предоставляет для графики гораздо больше возможностей!
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
11.02.2021, 00:18
Цитата Сообщение от wer1 Посмотреть сообщение
Но вы хоть знаете как устроен bmp-файл?
Гех я тебе уже кидал как устроен бмп файл, элементарнее формата нет. Или не тебе, но короче кидал тут.
Тут дело в другом писать в него будет крайне медленно, особенно если большой файл завести.
В памяти DOS много тоже не завести, под виндой - да другое дело.
1
Наивное Существо
 Аватар для vedunasv
666 / 141 / 27
Регистрация: 09.05.2020
Сообщений: 750
Записей в блоге: 15
20.02.2021, 17:59
locm, у меня только 2 гб установлено.
Но если вспомнить ,ч то мы совсем недавно перемещались на волах, а счас космические просторы бороздят корабли.... то это всё ерунда. Главное, у человека wer1 есть мечта....

Добавлено через 3 минуты
wer1, Вы не правы "... вря ли кто-нибудь быстро (без бутылки) разберёт..." .
Запросто! А вот собрать...... Эххххх.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.02.2021, 17:59
Помогаю со студенческими работами здесь

Как нарисовать на форме 100 окружностей случайного диаметра и цвета?
Ребята, объясните каким образом можно реализовать подобное в C#. Никогда не работал с такими заданиями. "Написать программу,...

Как нарисовать на экране заданное количество окружностей и окружности не должны пересекаться?
Здравствуйте хорошие программеры, я с C# слабак и только начинаю изучать. Есть вопрос по теме: С помощью генератора случайных чисел...

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

Нарисовать 30 окружностей
Заранее спасибо 1. Реализовать задачу "нарисовать случайным цветом 30 окружностей случайного радиуса в пределах от 5 до 50, центры...

Нарисовать n окружностей
нарисовать окружность n штук в паскале


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru