20.01.2021, 12:46 | #1 (permalink) |
Новичок
Регистрация: 20.01.2021
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите найти ошибку
graphABC; //Подключаем графический модуль const W = 1200; H = 700;//Размеры графического окна a1=40; g=10; u=15; function F(x: real): real; begin F := x*sin(a1)/cos(a1)-g*x*x/(2*u*u*cos(a1)*cos(a1)); //Функция end; var x0, y0, x, y, xLeft, yLeft, xRight, yRight, n: integer; a, b, fmin, fmax, x1, y1, mx, my, dx, dy, num: real; i: byte; s: string; begin SetWindowSize(W, H); //Устанавливаем размеры графического окна //Координаты левой верхней границы системы координат: xLeft := 50; yLeft := 50; //Координаты правой нижней границы системы координат: xRight := W - 50; yRight := H - 50; //интервал по Х; a и b должно нацело делится на dx: a := 0; b := 20; dx := 0.5; //Интервал по Y; fmin и fmax должно нацело делится на dy: fmin := 0; fmax := 20; dy := 1; //Устанавливаем масштаб: mx := (xRight - xLeft) / (b - a); //масштаб по Х my := (yRight - yLeft) / (fmax - fmin); //масштаб по Y //начало координат: x0 := trunc(abs(a) * mx) + xLeft; y0 := yRight - trunc(abs(fmin) * my); //Рисуем оси координат: line(xLeft, y0, xRight + 10, y0); //ось ОХ line(x0, yLeft - 10, x0, yRight); //ось ОY SetFontSize(12); //Размер шрифта SetFontColor(clBlue); //Цвет шрифта TextOut(xRight + 20, y0 - 15, 'X'); //Подписываем ось OX TextOut(x0 - 10, yLeft - 30, 'Y'); //Подписываем ось OY SetFontSize(8); //Размер шрифта SetFontColor(clRed); //Цвет шрифта { Засечки по оси OX: } n := round((b - a) / dx) + 1; //количество засечек по ОХ for i := 1 to n do begin num := a + (i - 1) * dx; //Координата на оси ОХ x := xLeft + trunc(mx * (num - a)); //Координата num в окне Line(x, y0 - 3, x, y0 + 3); //рисуем засечки на оси OX str(Num:0:1, s); if abs(num) > 1E-15 then //Исключаем 0 на оси OX TextOut(x - TextWidth(s) div 2, y0 + 10, s) end; { Засечки на оси OY: } n := round((fmax - fmin) / dy) + 1; //количество засечек по ОY for i := 1 to n do begin num := fMin + (i - 1) * dy; //Координата на оси ОY y := yRight - trunc(my * (num - fmin)); Line(x0 - 3, y, x0 + 3, y); //рисуем засечки на оси Oy str(num:0:0, s); if abs(num) > 1E-15 then //Исключаем 0 на оси OY TextOut(x0 + 7, y - TextHeight(s) div 2, s) end; TextOut(x0 - 10, y0 + 10, '0'); //Нулевая точка { График функции строим по точкам: } x1 := a; //Начальное значение аргумента while x1 <= b do begin y1 := F(x1); //Вычисляем значение функции x := x0 + round(x1 * mx); //Координата Х в графическом окне y := y0 - round(y1 * my); //Координата Y в графическом окне //Если y попадает в границы [yLeft; yRight], то ставим точку: if (y >= yLeft) and (y <= yRight) then SetPixel(x, y, clGreen); x1 := x1 + 0.001 //Увеличиваем абсциссу end end. При вводе a1, то есть угла, на цифры 30,40 и еще на некоторые не показывает график.Помогите пожалуйста! |
20.01.2021, 12:46 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Иногда самым эффективным в решении проблемы является прочтение схожих тем Помогите найти ошибку Помогите найти ошибку |
20.01.2021, 13:22 | #2 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
a1:= a1/180*Pi; |
|
28.01.2021, 12:34 | #3 (permalink) |
Новичок
Регистрация: 20.01.2021
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите с PascalABC пожалуйста
uses
graphABC; //Подключаем графический модуль const W = 1200; H = 700;//Размеры графического окна g=10; Pi=3.14; var a1,u:real; function F(x: real): real; begin F := x*sin(a1)/cos(a1)-g*x*x/(2*u*u*cos(a1)*cos(a1)); //Функция end; var x0, y0, x, y, xLeft, yLeft, xRight, yRight, n: integer; a,b,b2, fmin, fmax, x1, y1, mx, my, dx, dy, num: real; i: byte; s: string; begin writeln('Введите угол наклона тела'); readln(b2); a1:= b2 / 180*Pi; writeln('Введите скорость тела'); readln (u); SetWindowSize(W, H); //Устанавливаем размеры графического окна //Координаты левой верхней границы системы координат: xLeft := 50; yLeft := 50; //Координаты правой нижней границы системы координат: xRight := W - 50; yRight := H - 50; //интервал по Х; a и b должно нацело делится на dx: a := 0; b := 20; dx := 0.5; //Интервал по Y; fmin и fmax должно нацело делится на dy: fmin := 0; fmax := 20; dy := 1; //Устанавливаем масштаб: mx := (xRight - xLeft) / (b - a); //масштаб по Х my := (yRight - yLeft) / (fmax - fmin); //масштаб по Y //начало координат: x0 := trunc(abs(a) * mx) + xLeft; y0 := yRight - trunc(abs(fmin) * my); //Рисуем оси координат: line(xLeft, y0, xRight + 10, y0); //ось ОХ line(x0, yLeft - 10, x0, yRight); //ось ОY SetFontSize(12); //Размер шрифта SetFontColor(clBlue); //Цвет шрифта TextOut(xRight + 20, y0 - 15, 'X'); //Подписываем ось OX TextOut(x0 - 10, yLeft - 30, 'Y'); //Подписываем ось OY SetFontSize(8); //Размер шрифта SetFontColor(clRed); //Цвет шрифта { Засечки по оси OX: } n := round((b - a) / dx) + 1; //количество засечек по ОХ for i := 1 to n do begin num := a + (i - 1) * dx; //Координата на оси ОХ x := xLeft + trunc(mx * (num - a)); //Координата num в окне Line(x, y0 - 3, x, y0 + 3); //рисуем засечки на оси OX str(Num:0:1, s); if abs(num) > 1E-15 then //Исключаем 0 на оси OX TextOut(x - TextWidth(s) div 2, y0 + 10, s) end; { Засечки на оси OY: } n := round((fmax - fmin) / dy) + 1; //количество засечек по ОY for i := 1 to n do begin num := fMin + (i - 1) * dy; //Координата на оси ОY y := yRight - trunc(my * (num - fmin)); Line(x0 - 3, y, x0 + 3, y); //рисуем засечки на оси Oy str(num:0:0, s); if abs(num) > 1E-15 then //Исключаем 0 на оси OY TextOut(x0 + 7, y - TextHeight(s) div 2, s) end; TextOut(x0 - 10, y0 + 10, '0'); //Нулевая точка { График функции строим по точкам: } x1 := a; //Начальное значение аргумента while x1 <= b do begin MaximizeWindow; y1 := F(x1); //Вычисляем значение функции x := x0 + round(x1 * mx); //Координата Х в графическом окне y := y0 - round(y1 * my); //Координата Y в графическом окне //Если y попадает в границы [yLeft; yRight], то ставим точку: if (y >= yLeft) and (y <= yRight) then SetPixel(x, y, clGreen); x1 := x1 + 0.001 //Увеличиваем абсциссу end end. Когда вводишь большие цифры, график уходит за пределы, тем самым показывает лишь часть этого графика помогите сделать так, чтобы показывало всю часть графика. |
28.01.2021, 12:57 | #4 (permalink) |
Member
Регистрация: 17.01.2012
Адрес: Краснодар
Сообщений: 2,713
Записей в дневнике: 5
Сказал(а) спасибо: 30
Поблагодарили 254 раз(а) в 36 сообщениях
Репутация: 59322
|
Меняйте динамически. Объявляйте не в константах, а в переменных. Установите пропорциональную связь между вводимыми цифрами и геометрическими размерами окна. При отрисовке заданной вами функции и высота окна избыточна, я бы пересмотрел.
__________________
Одна голова - хорошо, а три - сквозной канал!© |
01.02.2021, 11:35 | #5 (permalink) |
Новичок
Регистрация: 20.01.2021
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо огромное, помогли
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Метки |
graphabc, pascal, pascal abc |
|
|