Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 756

Раздел: Delphi » Прочее
/ вопрос открыт /

Приветствую, уважаемые эксперты! Мне необходимо начертить график. Спирального вида. x:=a*cos(fi)+a*fi*sin(fi) и y:=a*sin(fi)+a*fi*cos(fi). Вроде бы написал программу, а график мне не нравиться. Выглядит как спираль архимеда, хотя у неё другая формула. Где ошибка моя?

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2.  
  3. var
  4. a,b,c,d,x,y,f,k,p,t,n,r,arad,xmax,ymax,ymin,xmin:real;
  5. xfrm,yfrm,i:integer;
  6. const pi=3.141593;
  7. begin
  8. form2.Show;
  9.  
  10. xfrm:=Form2.Width;
  11. yfrm:=Form2.Height;
  12.  
  13.  
  14. for i:=0 to trunc(xfrm) do Form2.Canvas.Pixels[i,trunc(yfrm/2)]:=clWhite;
  15. for i:=0 to trunc(xfrm) do Form2.Canvas.Pixels[trunc(xfrm/2),i]:=clWhite;
  16. x:=0;y:=0;t:=0;a:=0;
  17. xmax:=strtofloat(Edit1.text);
  18. ymax:=xmax;
  19. xmin:=strtofloat(Edit2.text)*(-1);
  20. ymin:=ymin;
  21. //n:=strtofloat(Edit3.text);
  22.  
  23. a:=strtofloat(Edit4.text);
  24. p:=strtofloat(Edit5.text);
  25. t:=0;x:=0;
  26. while (x < (xfrm/2)) do
  27. begin
  28. Form2.Canvas.MoveTo(trunc(xfrm/2+x),trunc(yfrm/2-5));
  29. Form2.Canvas.LineTo(trunc(xfrm/2+x),trunc(yfrm/2+5));
  30. Form2.Canvas.MoveTo(trunc(xfrm/2-x),trunc(yfrm/2-5));
  31. Form2.Canvas.LineTo(trunc(xfrm/2-x),trunc(yfrm/2+5));
  32.  
  33. //Form1.Canvas.TextOut(trunc(xfrm/2+x),trunc(yfrm/2),floattostr(t));
  34. //Form1.Canvas.TextOut(trunc(xfrm/2-x),trunc(yfrm/2),floattostr(t*(-1)));
  35. t:=t+1;
  36. x:=x+(xfrm/xmax);
  37. end;
  38. t:=0;y:=0;
  39.  
  40.  
  41.  
  42. while (y < (yfrm/2)) do
  43. begin
  44. Form2.Canvas.MoveTo(trunc(xfrm/2-5),trunc(yfrm/2+y));
  45. Form2.Canvas.LineTo(trunc(xfrm/2+5),trunc(yfrm/2+y));
  46. Form2.Canvas.MoveTo(trunc(xfrm/2-5),trunc(yfrm/2-y));
  47. Form2.Canvas.LineTo(trunc(xfrm/2+5),trunc(yfrm/2-y));
  48.  
  49. //Form1.Canvas.TextOut(trunc(xfrm/2),trunc(yfrm/2+y),floattostr(t));
  50. //Form1.Canvas.TextOut(trunc(xfrm/2),trunc(yfrm/2-y),floattostr(t*(-1)));
  51. t:=t+1;
  52.  
  53.  
  54. t:=xmin;
  55. f:=0;
  56. chart1.SeriesList[0].Clear;
  57. y:=y+(yfrm/ymax);
  58. end;
  59. Form2.Canvas.MoveTo(0,0);
  60.  
  61.  
  62.  
  63. while a < 360 * 4 do begin
  64. arad := a * pi / 180;
  65.  
  66.  
  67. x:=a*cos(arad)+a*arad*sin(arad);
  68. y:=a*sin(arad)-a*arad*cos(arad);
  69. chart1.SeriesList[0].AddXY(x,y,'', clRed);
  70. Form2.Canvas.Pixels[trunc(xfrm/2 + x*xfrm/xmax),trunc(yfrm/2 - y*yfrm/ymax)]:=clBlack;
  71.  
  72. //a := a + 0.1;
  73.  
  74. end;
  75.  
  76. // chart1.SeriesList[0].Clear;
  77.  
  78. end;
  79.  
  80.  
  81. end


mamont Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: mamont (статус: Посетитель)
Вопрос отправлен: 7 июля 2008, 22:50
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Мережников Андрей

Здравствуйте, mamont!
Первый цикл - понятно - рисует горизонтальную ось (хотя для чего округлять целое число? trunc(xfrm)).
Что рисует второй цикл - не совсем понятно, видимо задумывалось - горизонтальную ось, в таком случае надо исправить trunc(xfrm) на yfrm. Чему равно ymin - непонятно (ymin:=ymin???).
Насколько я понимаю, параметр a в исходных формулах не связан с углом fi. А при вычислении в программе Вы ставите угол fi в зависимость от константы a. Строки:
arad := a * pi / 180; - здесь должно быть не a, а угол fi в градусах

x:=a*cos(arad)+a*arad*sin(arad);
y:=a*sin(arad)-a*arad*cos(arad);

Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 8 июля 2008, 05:36
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Шичко Игорь

Здравствуйте, mamont!
Если следовать формуле то должно быть:
x:=a*cos(arad)+a*arad*sin(arad);
y:=a*sin(arad)+a*arad*cos(arad);
Много лишних переменных, которые не используются: xmin, ymin
Если они далее понадобятся, то наверное ymin:= xmin

Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 8 июля 2008, 09:35


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 8 июля 2008, 16:25; участников в обсуждении: 2.
mamont

mamont (статус: Посетитель), 7 июля 2008, 22:52 [#1]:

Мне необходимо было сделать так, что бы была возможность менять угол.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 8 июля 2008, 16:25 [#2]:

Необходимость изменения угла разве подразумевает введение зависимости значения угла от параметра a???

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.02 сек.