![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пересечение прямой и окружности [D7, XP]
Zheksonz © (2009-11-10 19:32:00)Вычисление точки пересечения прямой и окружности, при следующих известных:
1) Центром окружности является точка 0,0 т.е. пересечение осей координат.
2) Радиус(r) окружности известен.
3) имеются координаты отрезка(прямой), x1, y1; x2, y2.
Я так понимаю, что нужно решать систему уравнений, которая будет включать в себя уравнение прямой и окружности.
Собственно говоря, вопрос в том, как эту систему, привести к программируемому варианту, т.е. начать обработку с учётом входных данных???
Zheksonz (2009-11-12 13:57:00) [1]Проблема в том, что получаемая точка, хоть и на прямой, но немного меньше и по X и по Y. Проверял циркулем))) Чем может быть вызвано это смещение???
Zheksonz (2009-11-12 10:50:00) [2]Может кто подскажет, где я ошибся:::
вот код который я перевожу на Дэлфи:
double r, a, b, c; // входные данные
double x0 = -a*c/(a*a+b*b), y0 = -b*c/(a*a+b*b);
if (c*c > r*r*(a*a+b*b)+EPS)
puts ("no points");
else if (abs (c*c - r*r*(a*a+b*b)) < EPS) {
puts ("1 point");
cout << x0 << ' ' << y0 << '\n';
}
else {
double d = r*r - c*c/(a*a+b*b);
double mult = sqrt (d / (a*a+b*b));
double ax,ay,bx,by;
ax = x0 + b * mult;
bx = x0 - b * mult;
ay = y0 - a * mult;
by = y0 + a * mult;
puts ("2 points");
cout << ax << ' ' << ay << '\n' << bx << ' ' << by << '\n';
}
а вот моя функция:
function PerPryamAndOkr(x1, y1, x2, y2, r: Real; var xp3, yp3, xp3_, yp3_: Real): boolean;
const
EPS = 0.000000001;
var
a, b, c: Real;
x0, y0: Real;
mult, d: Real;
begin
a := y1 - y2;
b := x2 - x1;
c := x1 * y2 - x2 * y1;
x0 := -a*c/(a*a+b*b);
y0 := -b*c/(a*a+b*b);
if (c*c > r*r*(a*a+b*b)+EPS) then
begin
result := false;
exit;
end;
if (abs (c*c - r*r*(a*a+b*b)) < EPS) then
begin
result := false;
exit;
end;
d := r*r - c*c/(a*a+b*b);
mult := sqrt (d / (a*a+b*b));
xp3 := x0 + b * mult;
yp3 := y0 - a * mult;
xp3_ := x0 - b * mult;
yp3_ := y0 + a * mult;
result := true;
end;
Anatoly Podgoretsky (2009-11-11 10:36:00) [3]
> П.С. В своё оправдание, а вернее для понимания, почему такие
> вопросы я задаю, хочу сказать, что если бы я продолжил сам
> разбираться в этом вопросе, то раньше бы седая борода у
> меня полезла, чем я докопался бы до решения. Уж я то себя
> знаю.
Ну и чего ты полез не в свое, или это "Уж я то себя знаю."
Юрий Зотов (2009-11-11 09:03:00) [4]> Zheksonz (11.11.09 00:39) [20]
Есть понятия "машинный ноль" и "машинное эпсилон". Они могут быть вычислены и от языка не зависят.
Теорию см. здесь:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
А в качестве практики - задачка на 5 минут: написать цикл, вычисляющий машинное эпсилон.
За 5 минут борода точно не вырастет, так что опасаться нечего.
:o)
Германн (2009-11-11 01:10:00) [5]
> antonn © (10.11.09 22:27) [14]
> antonn © (10.11.09 22:27) [15]
>
>
Слишком много очепяток!
Германн (2009-11-11 00:45:00) [6]
> все же это поняли, но если бы ты промолчал, мне было бы
> приятно...
>
Я бы промолчал, если бы не прочитал:
> П.С. В своё оправдание, а вернее для понимания, почему такие
> вопросы я задаю, хочу сказать, что если бы я продолжил сам
> разбираться в этом вопросе, то раньше бы седая борода у
> меня полезла, чем я докопался бы до решения. Уж я то себя
> знаю.
Zheksonz (2009-11-11 00:40:00) [7]Германн © (11.11.09 00:38) [19]
все же это поняли, но если бы ты промолчал, мне было бы приятно...
Zheksonz (2009-11-11 00:39:00) [8]if (c*c > r*r*(a*a+b*b)+ EPS)
Есть ли в Делфи аналог EPS, в СИ, что, насколько я понял, является положительным сколь угодно малым вещественным числом???
Германн (2009-11-11 00:38:00) [9]
> уверен, что станет, но это не мой случай))) Постояльцы сайта
> это могут подтвердить.
Я и так знаю. Просто хотел лишний раз убедиться. Ведь сегодня это основы начальной школы!
Zheksonz (2009-11-10 23:29:00) [10]DVM © (10.11.09 22:14) [13]
Благодарю за терпение и желание помочь.
Картинка ожила. Спасибо, огромное.
П.С. В своё оправдание, а вернее для понимания, почему такие вопросы я задаю, хочу сказать, что если бы я продолжил сам разбираться в этом вопросе, то раньше бы седая борода у меня полезла, чем я докопался бы до решения. Уж я то себя знаю.
antonn (2009-11-10 22:55:00) [11]Нет времени, потому и просил готовое, проверенное и быстрое, если есть.
Ну а нету - так и ладно :)
DVM (2009-11-10 22:41:00) [12]
> antonn © (10.11.09 22:27) [14]
В чем проблема переделать http://e-maxx.ru/algo/circle_line_intersectionна делфи?
antonn (2009-11-10 22:27:00) [13]а у кого нить есть оптимизированнаяфункция, возвращающая координаты (а не true/false)? был бы раз получить, сделаю коллизии вменяемые =) (как онказалось, в интернете куча способо даже нахождения пересечений двух окружностей, но нет ни одного времяемого готового примера на дельфи для такой задачки, я уже даже стал сомневаться что она простая :) да и на Си на геймдеве пару раз только мелькает )
antonn (2009-11-10 22:27:00) [14]
> был бы раз
был бы ра д
DVM (2009-11-10 22:14:00) [15]
> Zheksonz (10.11.09 22:01) [12]
A=Y1-Y2
B=X2-X1
C=X1Y2-X2Y1
Zheksonz (2009-11-10 22:01:00) [16]Германн © (10.11.09 21:17) [11]
уверен, что станет, но это не мой случай))) Постояльцы сайта это могут подтвердить.
Германн (2009-11-10 21:17:00) [17]
> а что есть коэффициенты Ax, Bx, C, в уравнении прямой
А если переписать уравнение Ax + By + C = 0 так:
y = -A/Bx - C/B понятнее не станет?
Zheksonz (2009-11-10 21:02:00) [18]DVM © (10.11.09 20:46) [9]
иду на риск осознанно, т.к. мне не привыкать, задавать глупые вопросы..)))
а что есть коэффициенты Ax, Bx, C, в уравнении прямой, если прямая у меня определяется отрезком (x1, y1) (x2, y2)???
DVM (2009-11-10 20:46:00) [19]
> я не могу разобрать, что есть A, B и C, активно используемые
> в этом примере???
Коэффициенты из уравнения прямой Ax + By + C = 0.
Zheksonz (2009-11-10 20:34:00) [20]DVM © (10.11.09 20:31) [7]
благодарю, это именно то, что мне нужно!!!
единственное что я не могу разобрать, что есть A, B и C, активно используемые в этом примере???