Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 20.01.2021, 12:46   #1 (permalink)
Forevar
Новичок
 
Регистрация: 20.01.2021
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Помогите найти ошибку

uses
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 и еще на некоторые не показывает график.Помогите пожалуйста!
Forevar вне форума   Ответить с цитированием

Старый 20.01.2021, 12:46
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Иногда самым эффективным в решении проблемы является прочтение схожих тем

Помогите найти ошибку
Помогите найти ошибку

Старый 20.01.2021, 13:22   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Forevar Посмотреть сообщение
При вводе a1, то есть угла, на цифры 30,40 и еще на некоторые не показывает график.Помогите пожалуйста!
А Вы не забыли, что тригонометрические функции в Паскале (как, впрочем, и в других ЯП) предполагают задание угла в радианах, а не в градусах? Если же угол Вы задаёте в градусах, то можно добавить строку типа
a1:= a1/180*Pi;
Vladimir_S вне форума   Ответить с цитированием
Старый 28.01.2021, 12:34   #3 (permalink)
Forevar
Новичок
 
Регистрация: 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.


Когда вводишь большие цифры, график уходит за пределы, тем самым показывает лишь часть этого графика
помогите сделать так, чтобы показывало всю часть графика.
Миниатюры
aacuiyiiue.png  
Forevar вне форума   Ответить с цитированием
Старый 28.01.2021, 12:57   #4 (permalink)
vasilych
Member
 
Аватар для vasilych
 
Регистрация: 17.01.2012
Адрес: Краснодар
Сообщений: 2,713
Записей в дневнике: 5
Сказал(а) спасибо: 30
Поблагодарили 254 раз(а) в 36 сообщениях
Репутация: 59322
По умолчанию

Цитата:
Сообщение от Forevar Посмотреть сообщение
W = 1200; H = 700;//Размеры графического окна
Меняйте динамически. Объявляйте не в константах, а в переменных. Установите пропорциональную связь между вводимыми цифрами и геометрическими размерами окна. При отрисовке заданной вами функции и высота окна избыточна, я бы пересмотрел.
__________________
Одна голова - хорошо, а три - сквозной канал!©
vasilych вне форума   Ответить с цитированием
Старый 01.02.2021, 11:35   #5 (permalink)
Forevar
Новичок
 
Регистрация: 20.01.2021
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо огромное, помогли
Forevar вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
graphabc, pascal, pascal abc

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 01:40.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.