Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2016, 20:04   #1
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию Уравнение круга и прямой

Здравствуйте.
Нужна ваша помощь.
Задание таково:
Даны координаты трех точек и радиус r. Между первой и второй проведен отрезок.
Третья точка - центр круга с радиусом r.
Нужно посчитать, какое расстояние отрезок между первыми двумя точками проходит в круге.
-------------------
Для этого нужно найти точку, в которой отрезок входит в круг, и точку, из которой он с круга выходит.
Я воспользовался уравнением круга и уравнением прямой.
(x-x0)^2 + (y-y0)^2 = R2
x0,y0 - центр круга, R - радиус
Второе уравнение нужна сначала "создать"
y=kx + b
y1=kx1 + b
y2=kx2 + b
Отсюда нужно найти k и b, в итоге получится уравнение вида
y=kx + b с известными k и b
y можно подставить в первое уравнение круга.
После всех квадратов и прочего выйдет обычное квадратное уравнение
С него находим x1,x2
А потом через уравнение y=kx + b подставляем найденные x у получаем y1 и y2.
В итоге мы получили точку с кордами x1;y1 и x2;y2
Осталось просто узнать расстояние между ними
Но программа, увы, работает процентов на 30, в основном недочет - ошибка компиляции
В чем ошибка?
Код:
var
fi,fo:text;
x1,x2,x0,y1,y2,y0,r,k,b,d1,d2,p1,p2,p3,p4,p5,p6,p7,p8,xk,xp,pr,d,xr1,yr1,xr2,yr2,resul:real;
begin
Assign(fi,'expert.in');
Assign(fo,'expert.out');
Reset(fi);
Rewrite(fo);
Read(fi,x1,y1,x2,y2,x0,y0,r);
Close(fi);
d1:=x2-x1;
d2:=y2-y1;
k:=d2/d1;
b:=y1 - (2*k);
p1:=-2*x0;
p2:=x0*x0;
p3:=k*k;
p4:=2*k*b;
p5:=b*b;
p6:=-2*y0*k;
p7:=-2*y0*b;
p8:=y0*y0;
r:=r*r;
xk:=1+p3;
xp:=p1+p4+p6;
pr:=p2+p5+p7+p8-r;
d:=sqr(xp) + (-4*xk*pr);
xr1:=(-xp+sqrt(d))/(2*xk);
xr2:=(-xp-sqrt(d))/(2*xk);
yr1:=k*xr1 + b;
yr2:=k*xr2 + b;
resul:=sqrt(sqr(xr2-xr1)+sqr(yr2-yr1));
Write(fo,resul:1:3);
Close(fo);
end.
Насчет переменных p1-p8 объясню
Я писал программу и одновременно решал подобное задание, что бы посмотреть, что да как
После открытия всех скобок получается 9 чисел
Но первое - это просто x^2, а остальные 8 - это те же p1...p8.
Ну и радиус с другой стороны
Заранее спасибо
dimon_snake вне форума Ответить с цитированием
Старый 22.12.2016, 20:12   #2
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Либо корень из отрицательного числа, либо деление на ноль.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 22.12.2016, 20:23   #3
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Цитата:
Сообщение от dimon_snake Посмотреть сообщение
работает процентов на 30, в основном недочет - ошибка компиляции
Ошибка компиляции - это значит что программа просто не будет создана по этому коду.
А если то работает, то нет - значит ошибка в самом алгоритме, в математике.
Это сразу видно - у вас ни одного условного оператора. То есть вы не проверяете, а есть ли вообще решение.
Оно же не всегда есть:
Изображения
Тип файла: jpg ho.jpg (3.7 Кб, 55 просмотров)
type_Oleg вне форума Ответить с цитированием
Старый 22.12.2016, 20:42   #4
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

1) Нужно найти расстояние от центра круга до отрезка (обозначим d)
2) Если d>=r ответ 0. (d=r прямая касается окружности в одной точке)
3) Если d<r ищем ответ, он опять может быть 0.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 27.12.2016, 16:31   #5
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

Не помогло
Нашел кратчайшее расстояние от центра к отрезку, однако это ничего не изменило
>
Код:
dl:=sqrt(sqr(x2-x1)+sqr(y1-y1));    /длина отрезка 
r1:=sqrt(sqr(y0-x1)+sqr(y0-y1));    /расстояние от одного конца отрезка к центру
r2:=sqrt(sqr(x0-x2)+sqr(y0-y2));   /от второго к центру
p:=(dl+r1+r2)/2;   /половина периметра треугольника,который получился
rl:=(2*sqrt(p*(p-dl)*(p-r1)*(p-r2)))/dl; /длина высота треугольника - самое короткое расстояние
if rl>=r then Write(fo,0)
else ...то, что и было
dimon_snake вне форума Ответить с цитированием
Старый 27.12.2016, 16:57   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Нашел кратчайшее расстояние от центра к отрезку
Не-а. Нашел кратчайшее расстояние от центра до прямой на которой твой отрезок. Даже если эта прямая пересекает окружность, это не значит, что твой отрезок или часть его находится в пределах окружности. После нахождения точек пересечения прямой и окружности нужно еще оценить положение отрезка относительно этих точек
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 27.12.2016 в 17:04.
Аватар вне форума Ответить с цитированием
Старый 27.12.2016, 17:08   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

неожиданно заковыристая задачка.

Цитата:
Сообщение от dimon_snake Посмотреть сообщение
/длина высота треугольника - самое короткое расстояние
во-первых, это не всегда так.

посмотрите на рисунок, который я взял отсюда:


высота и кратчайшее расстояние - это не одно и то же.

во-вторых, подумайте, что будет, если центра окружности и обе точки отрезка лежат на одной прямой. Уверены, что можно построить треугольник в этом случае?


упс. Аватар опередил.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот круга (алгоритм) GreenFirefly Помощь студентам 8 13.07.2015 15:54
уравнение прямой Shinobig Помощь студентам 7 14.01.2012 22:09
Движение круга:) mitmikha Паскаль, Turbo Pascal, PascalABC.NET 2 12.04.2011 12:11
Площадь круга sturz Помощь студентам 20 23.01.2011 11:07
Пересечение прямой и круга CoGnaC Паскаль, Turbo Pascal, PascalABC.NET 8 11.03.2008 17:01