Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2019, 17:57   #1
RenatShaym
Новичок
Джуниор
 
Регистрация: 26.06.2019
Сообщений: 5
По умолчанию Спирали Котеса на Pascal ABC

Доброго времени суток, форумчане! Помогите с проблемкой, пожалуйста! Мне необходимо написать программу, которая выводит в полярной или декартовой (на выбор) системе координат график спирали Котеса, окно должно масштабироваться. Единственная формула есть на википедии https://en.wikipedia.org/wiki/Cotes%27s_spiral
Вот что я намудрил по коду на Pascal ABC.Net

Код:
uses graphABC;
var x0,y0,d,i,x1,y1,fn,fk:integer;
    r,a,f,x,xr,yr,m:real;
    s:string;
begin
write('a=');readln(a);
x0:=windowwidth div 2;
y0:=windowheight div 2;
{КООРДИНАТНАЯ  СЕТКА}
d:=round((y0-40)/(round(a)));{шаг по оси радиуса в пикселях}
m:=2*(y0-40);{масштаб для графика}
setpencolor(clBlue);
setbrushstyle(bsClear);
for i:=1 to round(a) do
 begin
  {рисуем окружности}
  circle(x0,y0,i*d);
  {пишем шкалу}
  str(i/a:0:1,s);
  textout(x0-i*d+5,y0+10,s);
 end;
f:=30;{шаг по кругу=30 град}
for i:=1 to 12 do{делим на 12 частей}
 begin
  {рисуем радиусы пунктиром}
  Setpenstyle(psDash);
  x1:=x0+round((y0-40)*cos(i*f*pi/180));
  y1:=y0-round((y0-40)*sin(i*f*pi/180));
  line(x0,y0,x1,y1);
  {пишем подписи}
  str(i*30,s);
  if (x1>=x0)and(y1<y0) then textout(x1+10,y1-15,s)
  else if (x1>=x0)and(y1>=y0) then textout(x1+10,y1+10,s)
  else if (x1<x0)and(y1<y0) then textout(x1-40,y1-15,s)
  else if(x1<x0)and(y1>=y0)then textout(x1-40,y1+10,s)
 end;
{рисуем осевые линии сплошной линией}
Setpenstyle(psSolid);
line(10,y0,windowwidth-10,y0);
line(x0,0,x0,windowheight);
textout(x0+5,y0+10,'0');
textout(25,y0+10,'A');
{ГРАФИК}
x:=0;{начальный угол}
while x<=360 do{полный оборот}
 begin
    r:=cos(a*x);{уравнение в полярных координатах}
    xr:=r*cos(x);{приведение к Декартовым}
    yr:=r*sin(x);
    x1:=x0+round(m*xr/2);{приведение к экранным}
    y1:=y0-round(m*yr/2);
    setpixel(x1,y1,clRed);
    x:=x+0.01;
 end;
end.
Да это не тот код, но переделываю под формулу в википедии у меня не получается график. Как исправить данный код, чтоб все работало? Помогите, пожалуйста, очень надо!!!
RenatShaym вне форума Ответить с цитированием
Старый 26.06.2019, 18:08   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Начните с простого. Вы же статью в вики прочитали? Увидели, что надо ввести или задать 4 параметра? Где они?
p51x на форуме Ответить с цитированием
Старый 26.06.2019, 18:23   #3
RenatShaym
Новичок
Джуниор
 
Регистрация: 26.06.2019
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Начните с простого. Вы же статью в вики прочитали? Увидели, что надо ввести или задать 4 параметра? Где они?
Изменил код на следующее:
Код:
uses graphABC;
var x0,y0,d,i,x1,y1:integer;
    r,a,f,x,xr,yr,m,k,o,eps:real;
    s:string;
begin
writeln('a=');readln(a);
writeln('k=');readln(k);
writeln('o=');readln(o);
writeln('eps=');readln(eps);
x0:=windowwidth div 2;
y0:=windowheight div 2;
{КООРДИНАТНАЯ  СЕТКА}
d:=round((y0-40)/(round(a)));{шаг по оси радиуса в пикселях}
m:=2*(y0-40);{масштаб для графика}
setpencolor(clBlue);
setbrushstyle(bsClear);
for i:=1 to round(a) do
 begin
  {рисуем окружности}
  circle(x0,y0,i*d);
  {пишем шкалу}
  str(i/a:0:1,s);
  textout(x0-i*d+5,y0+10,s);
 end;
f:=30;{шаг по кругу=30 град}
for i:=1 to 12 do{делим на 12 частей}
 begin
  {рисуем радиусы пунктиром}
  Setpenstyle(psDash);
  x1:=x0+round((y0-40)*cos(i*f*pi/180));
  y1:=y0-round((y0-40)*sin(i*f*pi/180));
  line(x0,y0,x1,y1);
  {пишем подписи}
  str(i*30,s);
  if (x1>=x0)and(y1<y0) then textout(x1+10,y1-15,s)
  else if (x1>=x0)and(y1>=y0) then textout(x1+10,y1+10,s)
  else if (x1<x0)and(y1<y0) then textout(x1-40,y1-15,s)
  else if(x1<x0)and(y1>=y0)then textout(x1-40,y1+10,s)
 end;
{рисуем осевые линии сплошной линией}
Setpenstyle(psSolid);
line(10,y0,windowwidth-10,y0);
line(x0,0,x0,windowheight);
textout(x0+5,y0+10,'0');
textout(25,y0+10,'A');
{ГРАФИК}
x:=0;{начальный угол}
while x<=360 do{полный оборот}
 begin
    r:=1/(a*cos(k*o+eps));{уравнение в полярных координатах}
    xr:=r*cos(x);{приведение к Декартовым}
    yr:=r*sin(x);
    x1:=x0+round(m*xr/2);{приведение к экранным}
    y1:=y0-round(m*yr/2);
    setpixel(x1,y1,clRed);
    x:=x+0.01;
 end;
end.
Но ничего не помогло. Объясните, пожалуйста, в чём дело?
RenatShaym вне форума Ответить с цитированием
Старый 26.06.2019, 18:29   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
 r:=1/(a*cos(k*o+eps));{уравнение в полярных координатах}
o - это не параметр, а вторая полярная координата

Вы не сделали выбор варианта через параметр.
p51x на форуме Ответить с цитированием
Старый 26.06.2019, 19:23   #5
RenatShaym
Новичок
Джуниор
 
Регистрация: 26.06.2019
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
 r:=1/(a*cos(k*o+eps));{уравнение в полярных координатах}
o - это не параметр, а вторая полярная координата

Вы не сделали выбор варианта через параметр.
Как можно сделать выбор варианта, если число вещественное?
RenatShaym вне форума Ответить с цитированием
Старый 26.06.2019, 19:55   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1, 2, 3, 4, 5 - где здесь вещественное?

Да и углы в радианах, а не градусах...
p51x на форуме Ответить с цитированием
Старый 27.06.2019, 09:15   #7
RenatShaym
Новичок
Джуниор
 
Регистрация: 26.06.2019
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1, 2, 3, 4, 5 - где здесь вещественное?

Да и углы в радианах, а не градусах...
Добрый день!

Извините, что беспокою Вас! Но очень надо! Я сделал так, как Вы написали, но всё также не работает.

Вот код:

Код:
uses graphABC;
var x0,y0,d,i,x1,y1,ch:integer;
    r,a,f,x,xr,yr,m,k,o,eps:real;
    s:string;
    
function cosh(x:real):real;
begin
cosh:=(exp(x)+(exp(-x))/2);
end;  

function sinh(x:real):real;
begin
sinh:=(exp(x)-(exp(-x))/2);;
end;  
    
begin
writeln('Выберите тип графика (от 1 до 5)'); readln(ch);
writeln('a=');readln(a);
writeln('o=');readln(o);
writeln('eps=');readln(eps);
x0:=windowwidth div 2;
y0:=windowheight div 2;
{КООРДИНАТНАЯ  СЕТКА}
d:=round((y0-40)/(round(a)));{шаг по оси радиуса в пикселях}
m:=2*(y0-40);{масштаб для графика}
setpencolor(clBlue);
setbrushstyle(bsClear);
for i:=1 to round(a) do
 begin
  {рисуем окружности}
  circle(x0,y0,i*d);
  {пишем шкалу}
  str(i/a:0:1,s);
  textout(x0-i*d+5,y0+10,s);
 end;
f:=30;{шаг по кругу=30 град}
for i:=1 to 12 do{делим на 12 частей}
 begin
  {рисуем радиусы пунктиром}
  Setpenstyle(psDash);
  x1:=x0+round((y0-40)*cos(i*f*pi/180));
  y1:=y0-round((y0-40)*sin(i*f*pi/180));
  line(x0,y0,x1,y1);
  {пишем подписи}
  str(i*30,s);
  if (x1>=x0)and(y1<y0) then textout(x1+10,y1-15,s)
  else if (x1>=x0)and(y1>=y0) then textout(x1+10,y1+10,s)
  else if (x1<x0)and(y1<y0) then textout(x1-40,y1-15,s)
  else if(x1<x0)and(y1>=y0)then textout(x1-40,y1+10,s)
 end;
{рисуем осевые линии сплошной линией}
Setpenstyle(psSolid);
line(10,y0,windowwidth-10,y0);
line(x0,0,x0,windowheight);
textout(x0+5,y0+10,'0');
textout(25,y0+10,'A');
{ГРАФИК}
x:=0;{начальный угол}
while x<=360 do{полный оборот}
 begin
 case round(a) of
 end;
    case ch of
    1: 
      begin
      k:=2/3;
      r:=1/(a*cos((pi/180)*(k*o+eps)));{уравнение в полярных координатах}
      end;
    2:
      begin
      k:=3.0;
      r:=1/(a*cosh(k*o+eps));
      end;
    3:
      begin
      k:=6.0;
      r:=1/(a*o+eps);
      end;
    4:
      begin
      k:=1.5;
      r:=1/(a*exp(k*o+eps));
      end;
    5:
      begin
      k:=1.0;
      r:=1/(a*sinh(eps-k*o));
      end
    end;
    xr:=r*cos((pi/180)*x);{приведение к Декартовым}
    yr:=r*sin((pi/180)*x);
    x1:=x0+round(m*xr/2);{приведение к экранным}
    y1:=y0-round(m*yr/2);
    setpixel(x1,y1,clRed);
    x:=x+0.01;
 end;
end.
RenatShaym вне форума Ответить с цитированием
Старый 27.06.2019, 09:21   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

И где вы сделали? Еще раз:
1. Углы в радианах. Не от 0 до 360, а в радианах.
2. В формулах в полярных координата ДВЕ ПЕРЕМЕННЫЕ - r и fi. Что у вас за постоянная o там взялась?
3. Почему k у вас в коде фиксирован, а не задается?
4. Почему угол в уравнении спирали и в вашем переводе в декартовые никак не связан? Вы что переводите?
p51x на форуме Ответить с цитированием
Старый 27.06.2019, 13:13   #9
RenatShaym
Новичок
Джуниор
 
Регистрация: 26.06.2019
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И где вы сделали? Еще раз:
1. Углы в радианах. Не от 0 до 360, а в радианах.
2. В формулах в полярных координата ДВЕ ПЕРЕМЕННЫЕ - r и fi. Что у вас за постоянная o там взялась?
3. Почему k у вас в коде фиксирован, а не задается?
4. Почему угол в уравнении спирали и в вашем переводе в декартовые никак не связан? Вы что переводите?
Извините еще раз)

Я решил все поменять. Подскажите, пожалуйста, что я теперь делаю не так.
Вот фрагмент программы:

Код:
// Процедура вырисовки графика функции
procedure DrawFunc(a,n,eps:real);
begin
SetPenColor(clGreen); SetPenWidth(1);
fi:=0;
while fi<=2*pi do
 begin
 r:=1/(a * cos(n * fi + eps));{уравнение в полярных координатах}
 x:=r * cos(fi);
 y:=r * sin(fi);
 x1:=trunc(x0 + x * k); y1:=trunc(y0 - y * k); { экранные координаты }
 Circle(x1,y1,1);
 fi:=fi+0.01;
 end;

end;
Здесь есть все как Вы сказали и r и fi. Плюс ко всему три параметра (я их пока передаю вручную в коде программы). Здесь нет оператора выбора, но я приделаю его потом, пока в тестовом режиме. Не пойму что я еще делаю не так? Подскажите, пожалуйста.
RenatShaym вне форума Ответить с цитированием
Старый 27.06.2019, 13:22   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Похоже на правду. Только 2пи включать не стоит, оно же равно 0.
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнить матрицу по спирали (turbo pascal) cL1zMa Помощь студентам 8 16.05.2020 12:00
Метод Ньютона Котеса samuel21 Общие вопросы C/C++ 3 10.06.2013 21:54
заполнение по спирали снизу слева(pascal) POCOMAXA Помощь студентам 8 04.10.2012 12:18
Сортировка матрицы по спирали {pascal} Влдислаав3911 Помощь студентам 3 10.04.2012 22:05
Построение ломаной спирали (pascal) Fouk Помощь студентам 0 16.10.2011 11:24