Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 1
Регистрация: 10.12.2014
Сообщений: 31

Цветок на осях координат Delphi

25.03.2015, 08:51. Показов 2475. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь нарисовать график функции как на картинке:
,
но выходит вот так:
.
Чего-то не получается. Выходит простая синусоида. Подскажите, через какую процедуру это делается? У меня такая процедура:

Delphi
1
2
3
4
procedure flowr(t:real; var r:real);
Begin
r:=sin(7/4*t);
end;
и работа с ней выглядит так:

Delphi
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
procedure TForm1.Button3Click(Sender: TObject);
const
  x1 = -10;
  x2 = 10;
  m = 50;
  var
  x0,y0,i:integer;
  x,y:real;
 
begin
 
{Making everything white}
 
image1.canvas.Pen.Color:=clwhite;
i:=0;
while i<=image1.width do
begin
image1.Canvas.MoveTo(i,0);
image1.Canvas.LineTo(i,image1.height);
i:=i+1;
end;
 
 with image1 do
      begin
      x0:=width div 2;
      y0:= height div 2;
 
      with Canvas do
           begin 
           Pen.Color :=ClBlack; { Рисую оси координат}
           Pen.Width := 1;
           MoveTo(0,y0);
           LineTo(Width,y0);
           MoveTo(x0,0);
           LineTo(x0,Height);
 
           Pen.Color := CLRed;
 
           x:=x1;
           flowr(x,y); {рисую синусоиду}
           MoveTo(x0+Trunc(x*m),y0-Trunc(y*m)); 
           while x<x2 do
           begin
           x:=x+0.01;
           flowr(x,y);
           LineTo(x0+Trunc(x*m),y0-Trunc(y*m));
           end;
      end;
   end;
end;
P.S. Модератор, я делаю в Lazarus'e, если это имеет какое-то значение. Но тут тема больше подходит, думаю, т.к. я с графикой работаю.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.03.2015, 08:51
Ответы с готовыми решениями:

как отметить числа на осях координат при построении графика логарифмической функции?)
как отметить числа на осях координат когда в программе строится график функции?)) вот программный код: unit Unit1; interface ...

Вывод координат на осях графика
Необходимо вывести график параметрической функции с осями и, собственно, координатами точек. Т.к. график параметрический, то он может...

Проставить шкалу на осях координат
Здравствуйте. Мне необходимо проставить шкалу на осях координат. Составил следующий код программы: k=800*0.3/(n2-n1); outtextxy (X0,...

7
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
25.03.2015, 09:00
Лучший ответ Сообщение было отмечено surik00 как решение

Решение

Так на рисунке в полярных координатах, а ты в декартовых.
r - расстояние от центра, а не Y
t - угол, а не X

переделай через
x = r * cos(t)
y = r * sin (t)
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,668
Записей в блоге: 21
25.03.2015, 10:05
https://ru.wikipedia.org/wiki/Эпитрохоида
0
0 / 0 / 1
Регистрация: 10.12.2014
Сообщений: 31
25.03.2015, 10:12  [ТС]
Спасибо, не знал.
Вот результат, пришлось изменить обе процедуры.
Готовый код (x и y объявил в глобальных переменных):

Delphi
1
2
3
4
5
6
procedure flowr(t,r:real);
Begin
r:=sin(7/4*t);
x:=r*cos(t);
y:=r*sin(t);
end;
Сама кнопка:

Delphi
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
procedure TForm1.Button3Click(Sender: TObject);
const
  x1 = -10;
  x2 = 10;
  m = 170;
  var
  x0,y0,i:integer;
  t,r:real;
begin
 
{Making everything white}
 
image1.canvas.Pen.Color:=clwhite;
i:=0;
while i<=image1.width do
begin
image1.Canvas.MoveTo(i,0);
image1.Canvas.LineTo(i,image1.height);
i:=i+1;
end;
 
 with image1 do
      begin
      x0:=width div 2;
      y0:= height div 2;
 
      with Canvas do
           begin
           Pen.Color :=ClBlack;
           Pen.Width := 1;
           MoveTo(0,y0);
           LineTo(Width,y0);
           MoveTo(x0,0);
           LineTo(x0,Height);
 
           Pen.Color := CLRed;
 
           x:=x1;
           flowr(t,r);
           MoveTo(x0+round(x*m),y0-round(y*m));
           while t<50 do
           begin
           t:=t+0.01;
           flowr(t,r);
           LineTo(x0+Trunc(x*m),y0-Trunc(y*m));
           end;
      end;
   end;
end;
P.S. Возможно накосячил с количеством циклов, возможно, что еще с чем-то, но программа работает корректно.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
25.03.2015, 12:39
Если нужно как на картинке, то можно так.
Delphi
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
66
67
68
69
70
71
72
function f(t:real):real;
Begin
result:=sin(7/4*t);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  x0,y0,x1,y1,x2,y2,i,x,y:integer;
  t,r,m:real;
  s:string;
begin
Image1.Width:=Image1.Height;
x1:=30;
y1:=30;
x2:=Image1.Width-30;
y2:=Image1.Height-30;
x0:=(x2+x1)div 2;
y0:=(y2+y1) div 2;
m:=(y0-y1)/5;
 
with Image1.Canvas do
 begin
  brush.Color:=clWhite;
  rectangle(0,0,Image1.Width,Image1.Height);
  t:=0;
  pen.Style:=psDot;
  while t<=2*pi do
   begin
    x:=x0+round(5*m*cos(t));
    y:=y0-round(5*m*sin(t));
    Moveto(x0,y0);
    Lineto(x,y);
    t:=t+pi/6;
   end;
  brush.Style:=bsClear;
  pen.Style:=psSolid;
  MoveTo(x1,y2);
  LineTo(x2,y2);
  MoveTo(x1,y1);
  LineTo(x1,y2+5);
  MoveTo(x1,y0);
  LineTo(x2,y0);
  MoveTo(x0,y1);
  LineTo(x0,y2+5);
  for i:=0 to 5 do
   begin
    ellipse(x0-round(i*m),y0-round(i*m),x0+round(i*m),y0+round(i*m));
    MoveTo(x0-round(i*m),y2-3);
    LineTo(x0-round(i*m),y2+3);
    MoveTo(x0+round(i*m),y2-3);
    LineTo(x0+round(i*m),y2+3);
    MoveTo(x1-3,y0-round(i*m));
    LineTo(x1+3,y0-round(i*m));
    MoveTo(x1-3,y0+round(i*m));
    LineTo(x1+3,y0+round(i*m));
    str(i/5:0:1,s);
    textout(x0+round(i*m),y2+10,s);
    if i<>0 then textout(x0-round(i*m),y2+10,'-'+s);
    textout(x1-20,y0-round(i*m),s);
    if i<>0 then textout(x1-25,y0+round(i*m),'-'+s);
   end;
 t:=0;
 m:=y0-y1;
 while t<=8*pi do
  begin
   r:=f(t);
   x:=x0+round(r*m*cos(t));
   y:=y0-round(r*m*sin(t));
   Pixels[x,y]:=clRed;
   t:=t+0.001;
  end;
 end;
end;
Добавлено через 17 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
https://ru.wikipedia.org/wiki/Эпитрохоида
Вообще это правильнее называть Полярная роза.
https://ru.wikipedia.org/wiki/Роза_(плоская_кривая)
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,668
Записей в блоге: 21
25.03.2015, 12:55
WIKI:
При значениях k>1 роза является гипотрохоидой, а при k<1 — эпитрохоидой.
0
25.03.2015, 13:00

Не по теме:

Цитата Сообщение от Puporev Посмотреть сообщение
Вообще это правильнее называть Полярная роза.
По крайней мере не так пошло звучит)

0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
25.03.2015, 13:03
У нас k=7/4, всяко не эпитрохоида
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2015, 13:03
Помогаю со студенческими работами здесь

Узнать радиусы эллиптической дуги на осях координат
Здравствуйте! Застрял тут с задачей. Убил весь день, но так и не нашел решения. Надеюсь на вашу помошь! Суть вот в чем. Есть...

найти отрезки,отсекаемые на осях координат прямой 4x-y+1=0
найти отрезки,отсекаемые на осях координат прямой 4x-y+1=0

Нужно проставить стрелочки на осях координат (x:y) SOS
Private Sub Command1_Click() Form1.Line (500, 50)-(9500, 6500), QBColor(15), BF Form1.Line (500, 3500)-(9500, 3500) Form1.Line (500,...

как сделать сетку и отметить числа на осях координат при построении графика функции?)
как сделать сетку и отметить числа на осях координат при построении графика функции?)) вот программный код: unit Unit1; interface ...

Как построить оси координат на picturebox и на этих осях построить график функции
Здравствуйте, в общем не могу разобраться как построить оси координат на picturebox и на этих осях еще построить некую функцию, помогите...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru