Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/54: Рейтинг темы: голосов - 54, средняя оценка - 4.96
 Аватар для IrishaIrinaChe
29 / 29 / 3
Регистрация: 23.09.2010
Сообщений: 203

Как построить архимедову спираль?

30.11.2010, 16:32. Показов 11531. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане!
Необходимо построить архимедову спираль, уравнение которой имеет вид p=alpha*fi, где либо fi<0, либо и fi>0 и alpha>0. Проблема состоит в следующем: как перевести параметрические координаты в декартовы, что бы построить эту спираль на поле PaintBox2?

по идее, это должно выглядеть так:
C++
1
2
3
4
5
6
7
8
9
for(i=0;i<200;i++)
{
  x=x+fi*cos(alpha);
  y=y+fi*sin(alpha);
 
   matrGraf2[0][i]=W2/2+int(h*x1);   //матрица для хранения координат спирали
   matrGraf2[1][i]=H2/2-int(h*y1);
   x1=x1+i*0.1;
}
но почему-то это неправильно. Подскажите, как перевести правильно параметрические координаты в декартовы?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2010, 16:32
Ответы с готовыми решениями:

Построить Архимедову спираль: p = aφ
11 Построить Архимедову спираль: p = aφ&quot;\

Как можно соотнести между собой архимедову спираль и s-образную кривую?
и возможно ли такое или поискать другие соответствия? куда копать? Интересует альтернативный взгляд именно на Sобр кривую Спасибо.

Изобразить Архимедову спираль
Помогите составить программу, которая бы изображала архимедову спираль.

9
 Аватар для Питекантроп
251 / 145 / 21
Регистрация: 14.06.2010
Сообщений: 340
30.11.2010, 17:06
Вот пример спирали на форме. Пиши в обработчике OnPaint
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm1::FormPaint(TObject *Sender)
{
int i;
double ro,k=10,fi,step=0.1;
int W,H,x,y;
W=Form1->ClientWidth/2;
H=Form1->ClientHeight/2;
 
x=k*fi+W;
y=H;
Form1->Canvas->Pen->Color=clBlue;
Form1->Canvas->MoveTo(x,y);
for(i=0;i<200;i++)
        {
        fi=i*step;
        x=k*fi*cos(fi)+W;
        y=k*fi*sin(fi)+H;
        Form1->Canvas->LineTo(x,y);
        }
}
//---------------------------------------------------------------------------
1
 Аватар для IrishaIrinaChe
29 / 29 / 3
Регистрация: 23.09.2010
Сообщений: 203
30.11.2010, 17:28  [ТС]
Питекантроп, можно вопрос? по идее, apha и fi задаётся пользователем в Edit. разве они должны меняться? (в вашем примере fi изменяется)
простоя думала это параметры, такое как в уравнении прямой Y=kx, где k-параметр и не меняется.
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
30.11.2010, 17:30
Во первых, Вы запутались в терминах. Уравнение архимедовой спирали не в параметрических координатах, а в полярных. Полярные координаты обычно обозначают греческими буквами https://www.cyberforum.ru/cgi-bin/latex.cgi?\rho (rho, читается "ро") и https://www.cyberforum.ru/cgi-bin/latex.cgi?\phi (phi, читается "фи"). Тогда формула архимедовой спирали: rho = a * phi, ну, или, если хотите, rho = alpha * phi, и тут phi - изменяющаяся координата, а alpha - константа.

Во-вторых, в Вашем цикле отсутствует логика. А логика должна быть примерно такой:

1) По значению i Вы должны построить некоторый ряд phi. Вы пытаетесь почему-то сделать это для x1 (в строке 8), но неправильно.
Надо написать или через непосредственное вычисление:
C++
1
   phi = i * 0.1;
или через приращение:
C++
1
   phi += 0.1;
но никак не смешивать все это в кучу.

2) Пo значению phi насчитывается rho по формуле архимедовой спирали:
C++
1
   rho = alpha * phi;
3) Полученные полярные координаты пересчитываются в декартовы:
C++
1
2
  x = rho * cos(phi);
  y = rho * sin(phi);
4) Чтобы спираль шла из центра экрана, а не из угла, декартовы координаты пересчитываются в экранные:
C++
1
2
   xx = Width/2 + int(M * x);
   yy = Height/2 - int(M * y);
где Width и Height - размер экрана в пикселях, а M - масштаб.

Но Вам, вероятно, всё это уже неинтересно, потому что Питекантроп привел готовое решение..
1
 Аватар для IrishaIrinaChe
29 / 29 / 3
Регистрация: 23.09.2010
Сообщений: 203
30.11.2010, 17:48  [ТС]
Питекантроп,

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
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
//--------------------------------------------------------------------
 
void showGraf2(int taim)
{
 FPC2->Pen->Width=4;                      // Устанавливаем ширину пера
 FPC2->Pen->Color=clBlue;
 FPC2->LineTo(matrGraf2[0][taim], matrGraf2[1][taim]);
 FPC2->Pen->Width=1;                      // Восстанавливаем ширину пера
 FPC2->Pen->Color=clBlack;
}
 
//---------------------------------------------------------------
void initGraf2(void)      //прорисовка графа
{
 alpha=StrToInt(Form6->CSpinEdit4->Text);
 fi=StrToInt(Form6->CSpinEdit5->Text);
 
 int i;
 int W3,H3,x,y;
 W3=W2/2;
 H3=H2/2;
 double step=0.1;
 
 x=alpha*fi+W3;
 y=H3;
 
 if((fi<0)||((fi>0)&&(alpha)))
 {
  for(int i=0;i<200;i++)
   {
     fi=i*step;
     x=alpha*fi*cos(fi)+W3;
     y=alpha*fi*sin(fi)+H3;
     matrGraf2[0][i]=int(h*x);
     matrGraf2[1][i]=int(h*y);
   }
 }
}
//-------------------------------------------------------------
 
void __fastcall TForm6::Button1Click(TObject *Sender)    //пуск
{
 if(Form6->PageControl1->TabIndex==0)  //какое окно активно
    {
     for(int i=0;i<200;i++)
             initGraf1();
     FPC1->MoveTo(matrGraf1[0][0], matrGraf1[1][0]);
     for(int i=1;i<200;i++)
             showGraf1(i,1);
     FPC1->MoveTo(matrGraf1[0][0], matrGraf1[2][0]);
     for(int i=1;i<200;i++)
             showGraf1(i,2);
     ShowUrawn1();
    }
 else
    {
     for(int i=0;i<200;i++)
             initGraf2();
     FPC2->MoveTo(matrGraf2[0][0], matrGraf2[1][0]);
     for(int i=1;i<200;i++)
             showGraf2(i);
     ShowUrawn2();
    }
}
//---------------------------------------------------------------------------
вот этот кусочек программы. раньше он чертил какую-то ерунду, а теперь вообще молчит при запуске.
что всё-таки не так?

Добавлено через 16 минут
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//--------------------------------------------------------------------
 
void showGraf2(int taim)
{
 FPC2->Pen->Width=4;                      // Устанавливаем ширину пера
 FPC2->Pen->Color=clBlue;
 FPC2->LineTo(matrGraf2[0][taim], matrGraf2[1][taim]);
 FPC2->Pen->Width=1;                      // Восстанавливаем ширину пера
 FPC2->Pen->Color=clBlack;
}
 
//---------------------------------------------------------------
void initGraf2(void)      //прорисовка графа
{
 alpha=StrToInt(Form6->CSpinEdit4->Text);
 
 int i;
 double ro;
 fi=0;
 
// if(alpha>0)
// {
  for(int i=0;i<200;i++)
   {
     ro=alpha*fi;
 
     x2=ro*cos(fi);
     y2=ro*sin(fi);
 
     matrGraf2[0][i]=W+int(h*x2);
     matrGraf2[1][i]=H-int(h*y2);
     fi=i*0.1;
   }
// }
}
//-------------------------------------------------------------
 
void __fastcall TForm6::Button1Click(TObject *Sender)    //пуск
{
 if(Form6->PageControl1->TabIndex==0)  //какое окно активно
    {
     for(int i=0;i<200;i++)
             initGraf1();
     FPC1->MoveTo(matrGraf1[0][0], matrGraf1[1][0]);
     for(int i=1;i<200;i++)
             showGraf1(i,1);
     FPC1->MoveTo(matrGraf1[0][0], matrGraf1[2][0]);
     for(int i=1;i<200;i++)
             showGraf1(i,2);
     ShowUrawn1();
    }
 else
    {
     for(int i=0;i<200;i++)
             initGraf2();
     FPC2->MoveTo(matrGraf2[0][0], matrGraf2[1][0]);
     for(int i=1;i<200;i++)
             showGraf2(i);
     ShowUrawn2();
    }
}
//---------------------------------------------------------------------------
ура! он рисует спирале-подобное нечто! однако, объясните пожалуйста, почему это нечто очень даже угловатое и вплюс ко всему расположено не в центре пересечения координатных осей, а в самом углу?
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
30.11.2010, 17:55
Чтобы не гадать на кофейной гуще, остановите программу в конце процедуры initGraf2() и посмотрите, какими значениями заполнен массив. Но скорее всего, неправильные значения у W2 и H2

Кстати, зачем процедуру initGraf2() выполнять 200 раз в цикле?

Upd.
Не в центре - смотрите константы ширины и высоты при пересчете в экранные координаты
Угловатая - вероятно, шаг в 0.1 радиан - примерно 5 градусов - слишком велик
1
 Аватар для IrishaIrinaChe
29 / 29 / 3
Регистрация: 23.09.2010
Сообщений: 203
30.11.2010, 17:59  [ТС]
Black Fregat, к сожалению, так написано в методичке. по идее, в пуске цикл с i- аналог таймера.
0
 Аватар для Питекантроп
251 / 145 / 21
Регистрация: 14.06.2010
Сообщений: 340
30.11.2010, 18:07
Там весь код криво написан.
В обработчике кнопки попробуйте все убрать и втулить это
C++
1
2
3
4
5
6
7
initGraf2();
int i;
Form1->Canvas->MoveTo(matrGraf2[0][0],matrGraf2[1][0]);
for(i=1;i<200;i++)
        {
        Form1->Canvas->LineTo(matrGraf2[0][i],matrGraf2[1][i]);
        }
Должно нарисовать на форме

Добавлено через 5 минут
А, уже не надо... Не заметил, вы написали, что рисует.
1
 Аватар для IrishaIrinaChe
29 / 29 / 3
Регистрация: 23.09.2010
Сообщений: 203
30.11.2010, 18:20  [ТС]
Ура! оно теперь не угловатое! и даже очень округлое))) осталось уменьшить расстояние между витками)

Добавлено через 8 минут
хм. интересно, ели пишешь не fi=i*0.1 а fi=i*0.05, то расстояние между витками спирали не меняется. как так?
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
30.11.2010, 19:56
А чего оно должно меняться? Оно зависит только от Альфа. А от шага приращения Фи зависит частота точек на спирали
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2010, 19:56
Помогаю со студенческими работами здесь

Класс, определяющий Архимедову спираль
До этого не сталкивался с ООП, поэтому имею некоторые затруднения в понимании. Вообщем, необходимо разработать класс определяющий...

Построить спираль.
Построить спираль вокруг начала координат с n витками и внешним радиусом r; начальное направление спирали образует с осью OX угол a....

Графика: построить спираль
Нужна помощь в составлении программы

Построить гиперболическую спираль
Здравствуйте. Задание следующее - построить гиперболическую спираль (r = a × j1/2 + d) в полярной системе координат. Дело в том, что я...

Построить логарифмическую спираль
Построить логарифмическую спираль r = a*ekф , ( k&gt;0) (ф- фи) их значения вводим сами!!!


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru