Форум программистов, компьютерный форум, киберфорум
Наши страницы
arch_m
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Задача о квадратах.

Запись от arch_m размещена 24.11.2019 в 16:35

Нашел на форуме вот такую запись.

Изобразите серию из n квадратов, если каждый следующий вписан в предыдущий,причем его вершина делит ребро предыдущего в соотношении 1:n. Помогите пожалуйста решить данную задачу или дать хотя бы идею как делать.
Изобразите серию из n квадратов, если каждый следующий вписан в предыдущий

Топикастеру предложили такую схему решения.

Рассмотрите треугольник, соединяющий центр квадратов, вершину вписанного и вершину описанного. Стороны треугольника: две полудиагонали и фрагмент строны описанного квадрата.
Противоположная от центра сторона имеет длину 1/(n+1) в единицах стороны описанного квадрата.
Длина полудиагонали описанного квадрата 1/Sqrt[2], угол между ней и стороной 1/(n+1) равен Pi/4.
Итак, известны две строны и угол между ними в треугольнике. Возможно рассчитать все остальные строны и углы (см. теоремы синусов и косинусов).
Нас же интересует в первую очередь угол при центре квадратов (это угол наклона одного квадрата относительно другого) и полудиагональ вписанного квадрата, потому что тогда возможно рассчитать сторону вписанного квадрата, домножив на Sqrt[2].

Осталось дело за малым:
1 написать функцию, которая принамает длину стороны и угол поворота и рисует квадрат с центром в начале координат.
2. изобразить серию из квадратов, где каждый следующий имеет сторону и угол поворота, рассчитанный по вышеобозначенным формулам.
Можно делать в цикле.


Однако он так и не смог реализовать решение. Делаю это здесь используя Mathematica 9.0.

Пусть сторона описанного квадрата равна а.
Длину диагонали вписанного квадрата найдем по теореме косинусов.

http://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{-\frac{a^2}{n+1}+\frac{a^2}{(n+1)^2}+\frac{a^2}{2}}=\frac{a \sqrt{n^2+1}}{\sqrt{2} (n+1)}

Таким образом длина стороны вписанного квадрата будет http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{a \sqrt{n^2+1}}{n+1}

По теореме синусов найдем угол поворота квадрата.

Solve[a/((n + 1)*sin) == (a Sqrt[1 + n^2])/(Sqrt[2] (1 + n))/
Sin[Pi/4], sin]

{{sin -> 1/Sqrt[1 + n^2]}}

Т.е. угол может быть найден по формуле http://www.cyberforum.ru/cgi-bin/latex.cgi?\sin ^{-1}\left(\frac{1}{\sqrt{n^2+1}}\right)<br />

Теперь перейдем непосредственно к программированию.
Зададим функцию строящую квадрат (Rectangle) произвольного размера. С помощью функции Translate
сместим его так чтобы центр квадрата совпадал с началом координат. С помощью Rotate предусмотрим его
поворот на заданный угол.

Осталось получить параметры квадрата на энной итерации.
Очевидно что размер стороны может быть найден по формуле
Product[Sqrt[1. + i^2]/(1. + i), {i, 0, n}]
Угол на энной итерации найдем как
Sum[ArcSin[1./Sqrt[1. + i^2]], {i, 0, n}]

Окончательно функция строящая квадрат будет иметь вид:

qv[n_] :=
(Rotate[Translate[Rectangle[
{0., 0.}, {#1, #1}],
{-0.5*#1, -0.5*#1}],
Sum[ArcSin[
1./Sqrt[1. + i^2]],
{i, 0, n}]] & )[
Product[Sqrt[1. + i^2]/
(1. + i), {i, 0, n}]]

Осталось выполнить построение

Graphics[Table[
{Hue[E^((-(n - 2))*0.15)],
EdgeForm[Thin], qv[n]},
{n, 0, 1000}]]

Нажмите на изображение для увеличения
Название: Кваадраты_1.jpg
Просмотров: 1532
Размер:	103.7 Кб
ID:	5723

Или так
Graphics[Table[
{EdgeForm[{Thickness[
0.007/(n + 1)],
Hue[E^((-(n - 2))*
0.15)]}], qv[n]},
{n, 0, 600}]]

Нажмите на изображение для увеличения
Название: Кваадраты_2.jpg
Просмотров: 1525
Размер:	104.9 Кб
ID:	5724
Размещено в Без категории
Просмотров 177 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Отрисуйте Им трехмерную проекцию четырехмерного куба на двумерный холст и пусть отстанут.
    Запись от MentalLoad размещена 25.11.2019 в 04:04 MentalLoad вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.