Построить график в полярных координатах на основе данных из файла - 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.

Объяснение кода листинга программы

  1. Задание начинается с ввода имени файла без расширения.
  2. Проверка наличия файла и вывод сообщения об ошибке при его отсутствии.
  3. Открытие файла для чтения.
  4. Чтение данных из файла в массив точек p до тех пор, пока не достигнут конец файла.
  5. Определение максимального радиуса среди всех точек.
  6. Закрытие файла после чтения.
  7. Установка размеров окна графического интерфейса в 500 пикселей.
  8. Центрирование окна графического интерфейса.
  9. Очистка окна графического интерфейса.
  10. Установка масштаба m для графика, равного (c-40)/максимальный радиус.
  11. Установка шага d по оси радиуса в пикселях, равного round((c-40)/10).
  12. Рисование окружностей с шагом d и отображение шкалы с шагом 30 градусов.
  13. Рисование радиусов пунктиром с шагом 30 градусов и отображение подписей.
  14. Рисование осевых линий сплошной линией.
  15. Рисование графика с помощью точек, преобразованных из полярных координат в декартовы, и соединение их линией.
  16. Завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы