Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

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

Здравствуйте.
Нужна ваша помощь.
Задание таково:
Даны координаты трех точек и радиус 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, 21:12   #2
Plague
Забанен
Форумчанин
 
Аватар для Plague
 
Регистрация: 01.11.2006
Адрес: ЯНАО
Сообщений: 372
Репутация: 376
По умолчанию

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

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

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

Не помогло
Нашел кратчайшее расстояние от центра к отрезку, однако это ничего не изменило
>
Код:

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, 17:57   #6
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк, Украина
Сообщений: 15,733
Репутация: 5728
По умолчанию

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

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

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

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

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


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

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


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



Опции темы

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

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

Быстрый переход

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




17:15.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru