Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
2 / 2 / 1
Регистрация: 27.05.2015
Сообщений: 78
1

Нарисовать рекурсивный узор с картинки

18.06.2015, 20:38. Показов 4090. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста нарисовать через рекурсию этот узор:
Название: Рекурсия.jpg
Просмотров: 136

Размер: 10.0 Кб
Желательно на C++ Builder

Очень буду благодарен

(Кому не трудно )
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2015, 20:38
Ответы с готовыми решениями:

Начертить узор, повторяющий узор, узор образован 20 вложенными квадратами
Начертить узор, повторяющий узор, узор образован 20 вложенными квадратами. Стороны первого...

Начертить узор, повторяющий узор, узор образован 20 вложенными квадратами
Начертить узор, повторяющий узор, узор образован 20 вложенными квадратами. Стороны первого квадрата...

Нарисовать узор
Здравствуйте! Уважаемые программисты, помогите пожалуйста. Нужно в PaintBox нарисовать узор. 2...

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

12
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
19.06.2015, 11:44 2
А формула где ?
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
19.06.2015, 12:06 3
Почтальон, по формуле каждый дурак сможет.
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
19.06.2015, 12:24 4
Я не сомневаюсь, А тут как, на глазок ?

Добавлено через 48 секунд
есть же всякие генераторы узоров видимо нужно как-то их использовать, для расчета формулы
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
20.06.2015, 16:36 5
Я не представляю зачем тут рекурсия. Возможно, потому что не умею рисовать фракталы. Решил сделать в лоб, то есть сначала нарисовать кружки, а потом зигзаговые плавные кривые (в виде S). По моему расчёту нужна функция, которая принимает координаты двух точек и рисует между этими точками кривую в виде быквы S. Пока нарисовал кружки:
Миниатюры
Нарисовать рекурсивный узор с картинки  
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
23.06.2015, 15:58 6
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я не представляю зачем тут рекурсия.
На рисунке изображено двадцать четыре окружности. И нарисованы они по замкнутой спирали. Просто двенадцать из них разорваны. То есть функция, рисующая одну окружность, вызвана двадцать четыре раза. Рекурсивный вызов здесь, как я думаю, служит для передачи текущих параметров, то есть точки, в которой мы закончили, в очередной вызов функции.

Убил кучу времени, нарисовал кучу цветочков, но формулу так и не подобрал.
2
Почтальон
23.06.2015, 16:01
  #7

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Убил кучу времени, нарисовал кучу цветочков, но формулу так и не подобрал.
Вот и я про то, нужно хоть какое-то первоначальное направление, а тут походу нужно очень много курить....

0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
23.06.2015, 17:47 8
Кстати, есть идея. Кривые на рисунке представляют из себя кривые в форме быквы S. Я нашёл, что формулой для них - кривая Безье. Не знаю есть ли в билдере эти кривые, а в C# есть:
Кликните здесь для просмотра всего текста
C#
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
        //
        // Summary:
        //     Draws a Bézier spline defined by four System.Drawing.Point structures.
        //
        // Parameters:
        //   pen:
        //     System.Drawing.Pen structure that determines the color, width, and style
        //     of the curve.
        //
        //   pt1:
        //     System.Drawing.Point structure that represents the starting point of the
        //     curve.
        //
        //   pt2:
        //     System.Drawing.Point structure that represents the first control point for
        //     the curve.
        //
        //   pt3:
        //     System.Drawing.Point structure that represents the second control point for
        //     the curve.
        //
        //   pt4:
        //     System.Drawing.Point structure that represents the ending point of the curve.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     pen is null.
        public void DrawBezier(Pen pen, Point pt1, Point pt2, Point pt3, Point pt4);


Если бы попробовать из двух кривых Безье создать S кривую, а то с одной получается так:
Миниатюры
Нарисовать рекурсивный узор с картинки  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.06.2015, 17:54 9
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Не знаю есть ли в билдере эти кривые
Они в WinAPI есть: PolyBezier
1
2 / 2 / 1
Регистрация: 27.05.2015
Сообщений: 78
24.06.2015, 00:36  [ТС] 10
Извиняюсь что так долго не писал.
Вот код. Только он на паскале и перевести на C++ не получилось

Нарисовать рекурсивный узор с картинки

Нарисовать рекурсивный узор с картинки

Нарисовать рекурсивный узор с картинки
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
24.06.2015, 01:55 11
Как я понял, рекурсия для решения применяется, как замена циклу.

Цитата Сообщение от 8Observer8 Посмотреть сообщение
Если бы попробовать из двух кривых Безье создать S кривую, а то с одной получается так
Поправлю себя. Нет необходимости соединять две кривых Безье, чтобы увеличить гибкость, так как можно использовать WinAPI функцию, в которую передаётся массив из точек, как можно увидеть по ссылке, что приводили выше. Кривую тогда можно будет изгибать под нужную форму:
Миниатюры
Нарисовать рекурсивный узор с картинки  
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
24.06.2015, 11:21 12
Lolka1996, нет уж дудки.

На самом деле я понял как можно нарисовать данную фигуру. Никакие Безье тут не нужны. Это график эпициклоиды.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double w = Image1->Width/2.;
double h = Image1->Height/2.;
 
const double R1 = 190.0;  // По которой катится
const double R2 = R1/6.; // Которая катится
const double R3 = R2*2.; // Где находится точка относительно R2
 
for( double i=0; i<R1/2; i+=0.01 )
    {
    double x = (R1 + R2) * cos( R2 * i / R1 ) - R3 * cos( (R1 + R2) / R1 * i );
    double y = (R1 + R2) * sin( R2 * i / R1 ) - R3 * sin( (R1 + R2) / R1 * i );
 
    //Image1->Canvas->LineTo( y + w, x + h );
    Image1->Canvas->Pixels[x + w][y + h] = clBlack;
    }
Название: ScreenShot.JPG
Просмотров: 92

Размер: 9.0 Кб

Но только эпициклойды со скольжением.

Остался вопрос как сделать скольжение. То есть вращение заданной точки в обратную сторону движения катящейся окружности.
1
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
26.06.2015, 08:25 13
Так, значит. Зачем тут рекурсия я придумал. Осталось только подобрать коэффициенты (w и R). Ну и глубину рекурсии соответственно.

C++
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
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <math>
TPoint Circle( POINT &pt, double &t, int count )
{
double w( 0 ), R( 0 );
switch( count )
  {
  case 0 : w = 1.0;   R = 120; break;
  case 1 : w = 20.0;  R = 60;  break;
  case 2 : w = 110.0; R = 15;  break;
  case 3 : w = 1.0;   R = 100; break;
  }
 
pt.x = R * cos( w * t ) + pt.x;
pt.y = R * sin( w * t ) + pt.y;
 
if( count >= 2 )
  return pt;
else
  Circle( pt, t, ++count );
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormActivate(TObject *Sender)
{
int w = Image1->Width/2;
int h = Image1->Height/2;
 
  for( double t=0; t<5; t+=0.01 )
    {
    TPoint pt( 0, 0 );
    Circle( pt, t, 0 );
    //Image1->Canvas->Pixels[pt.x + w][pt.y + h] = clBlack;
    Image1->Canvas->LineTo( pt.x + w, pt.y + h );
    }
}
//---------------------------------------------------------------------------
Развлекайтесь.
Нарисовать рекурсивный узор с картинки
0
26.06.2015, 08:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2015, 08:25
Помогаю со студенческими работами здесь

Нарисовать узор на Canvas
Доброго времени всем, нужна помощь в рисовании в Canvas. Нужно нарисовать узор, вложенный ниже. Я...

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

Нарисовать узор в Delphi

Нарисовать узор из зигзагов
Не понимаю , как составить процедуру , помогите , пожалуйста :с


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru