Построить график в полярных координатах на основе данных из файла - PascalABC.NET/GraphABC
Формулировка задачи:
Дан текстовый файл, содержащий пары вещественных чисел, разделённых пробелом (по одной паре на строку). Написать программу, строящую график в полярных координатах на основе файла. Первое число - угловая координата, второе - радиальная. Программа должна позволять пользователю указать открываемый файл.
Решение задачи: «Построить график в полярных координатах на основе данных из файла»
textual
Листинг программы
uses graphABC; type koord=record//полярные координаты точки r,fi:real; end; var f:text; p:array of koord;//массив точек n,c,d,x1,y1,fn,fk:integer; max,r,a,fi,x,xr,yr,m:real; s:string; begin write('Введите имя файла без расширения');//point readln(s); s:=s+'.txt'; if not fileexists(s) then begin write('Такой файл не найден'); readln; exit; end; assign(f,s); reset(f); //прочитаем файл в массив координат n:=0; while not eof(f) do begin inc(n); setlength(p,n); read(f,p[n-1].fi,p[n-1].r); if n=1 then max:=p[n-1].r//определим максимальный радиус else if p[n-1].r>max then max:=p[n-1].r; end; close(f); setwindowsize(500,500); centerwindow; clearwindow; c:=windowwidth div 2; //КООРДИНАТНАЯ СЕТКА m:=(c-40)/max;//масштаб для графика d:=round((c-40)/10);//шаг по оси радиуса в пикселях setpencolor(clBlue); setbrushstyle(bsClear); for var i:=1 to 10 do begin //рисуем окружности circle(c,c,i*d); //пишем шкалу str(2*i/10:0:1,s); font.Size:=8; textout(c-i*d+5,c+10,s); end; fi:=30;//шаг по кругу=30 град for var i:=1 to 12 do//делим на 12 частей begin //рисуем радиусы пунктиром Setpenstyle(psDash); x1:=c+round((c-40)*cos(i*fi*pi/180)); y1:=c-round((c-40)*sin(i*fi*pi/180)); line(c,c,x1,y1); //пишем подписи str(i*30,s); if (x1>=c)and(y1<c) then textout(x1+10,y1-15,s) else if (x1>=c)and(y1>=c) then textout(x1+10,y1+10,s) else if (x1<c)and(y1<c) then textout(x1-40,y1-15,s) else if(x1<c)and(y1>=c)then textout(x1-40,y1+10,s) end; //рисуем осевые линии сплошной линией Setpenstyle(psSolid); line(10,c,windowwidth-10,c); line(c,0,c,windowheight); textout(c+5,c+10,'0'); //ГРАФИК setpencolor(clRed); for var i:=0 to n-1 do begin xr:=p[i].r*cos(p[i].fi);//приведение к декартовым координатам yr:=p[i].r*sin(p[i].fi); x1:=c+round(m*xr);//приведение к экранным y1:=c-round(m*yr); if i=0 then moveto(x1,y1) else lineto(x1,y1); end; end.
Объяснение кода листинга программы
- Задание начинается с ввода имени файла без расширения.
- Проверка наличия файла и вывод сообщения об ошибке при его отсутствии.
- Открытие файла для чтения.
- Чтение данных из файла в массив точек p до тех пор, пока не достигнут конец файла.
- Определение максимального радиуса среди всех точек.
- Закрытие файла после чтения.
- Установка размеров окна графического интерфейса в 500 пикселей.
- Центрирование окна графического интерфейса.
- Очистка окна графического интерфейса.
- Установка масштаба m для графика, равного (c-40)/максимальный радиус.
- Установка шага d по оси радиуса в пикселях, равного round((c-40)/10).
- Рисование окружностей с шагом d и отображение шкалы с шагом 30 градусов.
- Рисование радиусов пунктиром с шагом 30 градусов и отображение подписей.
- Рисование осевых линий сплошной линией.
- Рисование графика с помощью точек, преобразованных из полярных координат в декартовы, и соединение их линией.
- Завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д