Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.13;
Скачать: CL | DM;

Вниз

геометрия: пересечение окружности отрезком   Найти похожие ветки 

 
tButton ©   (2006-06-30 09:26) [0]

насколько я тут успел намыслить задачу можно свести к вычислению расстояния от точки до отрезка.
"кратчайшее расстояние от точки до прямой - перпендикуляр" (с) учебник геометрии

осталось только разобраться с мат частью.
координаты центра окружности есть. координаты начальной и конечной точки отрезка есть. сижу. рисую. думаю.


 
Alx2 ©   (2006-06-30 09:35) [1]

>tButton ©   (30.06.06 09:26)  

Если только факт пересечения, то довольно просто решается по условию
min(D1,D2,D3)<=R
D1 - расстояние от начала отрезка до центра окружности.
D2 - расстояние от конца отрезка до центра окружности.
D3 - расстояние от центра окружности до прямой.
Чтобы не считать радикалы, достаточно вместо расстояний брать их квадраты.

Если нужна именно точка пересечения,
то обозначим P0 - начало отрезка. P1 - конец отрезка.
P - точка на отрезке.
Тогда
P(t) = P0*(1-t)+t*P1 где t in [0..1]
Решаем уравнение
(P(t)-C)^2 = R^2 где C - центр окружности. Находим t.
При t in [0..1] имеет место пересечение в точке(ах) P(t)


 
Putnik ©   (2006-06-30 09:37) [2]

Пожалуйста уточните, Вам нужны координаты или сам факт пересекает/не пересекает?


 
Alx2 ©   (2006-06-30 09:39) [3]

К посту Alx2 ©   (30.06.06 09:35) [1]

В первой части некооректно написал.

вот это неверно:
----------------------
Если только факт пересечения, то довольно просто решается по условию
min(D1,D2,D3)<=R
D1 - расстояние от начала отрезка до центра окружности.
D2 - расстояние от конца отрезка до центра окружности.
D3 - расстояние от центра окружности до прямой.
Чтобы не считать радикалы, достаточно вместо расстояний брать их квадраты.
-----------------------


 
tButton ©   (2006-06-30 10:09) [4]

вот что у меня нарисовалось
X-----A-----B
|
|
|
|
|
C


AB - отрезок
C - центр окружности
X - точка пересечения перпендикуляра опущеного из точки С на продолжение отрезка (на прямую)

теперь проверка факта пересечения сводится к двум шагам
1) принадлежит ли точка Х отрезку (проверка по расстояниям AX и BX)
2) если прошла первая проверка, то проверяем расстояние CX, если оно меньше либо равно радиусу окружности - имеет место пересечение/касание окружности отрезком

общая задача проверки факта пересечения сведена к вычислению координат точки Х


 
ЮЮ ©   (2006-06-30 10:41) [5]

2) если прошла первая проверка,

а если нет? что из этого следует? Абсолютно ничего.


 
Desdechado ©   (2006-06-30 10:44) [6]

А из аналитической геометрии не хочешь воспользоваться формулами?
Есть уравнение окружности, есть уравнение прямой. Решаешь систему. Если решение есть, пересечение есть.


 
tButton ©   (2006-06-30 11:01) [7]


> 2) если прошла первая проверка,
>
> а если нет? что из этого следует? Абсолютно ничего.

а для этого как раз более примитивные проверки типа
CA < R
CB < R


> А из аналитической геометрии не хочешь воспользоваться формулами?
>
> Есть уравнение окружности, есть уравнение прямой. Решаешь
> систему. Если решение есть, пересечение есть.

хочу, нужно только подумать как это уложить в Дельфи
думаю.


 
ЮЮ ©   (2006-06-30 11:07) [8]


> а для этого как раз более примитивные проверки типа
> CA < R
> CB < R


В приведенном тобой алгоритме их нет "теперь проверка факта пересечения сводится к двум шагам"
Иначе, после выбрасывания твоего 1) все сводится к Alx2 ©   (30.06.06 09:39) [3]

хочу, нужно только подумать как это уложить в Дельфи
вряд ли там будет намного проще вычисления расстояний. Да и факт пересечения прямой ещё не означает пересечечения отрезком


 
Desdechado ©   (2006-06-30 11:18) [9]

> Да и факт пересечения прямой ещё не означает пересечения отрезком
Верно. Но так же верно и то, что точку(и) пересечения с окружностью всегда можно проверить на принадлежность отрезку.


 
tButton ©   (2006-06-30 11:55) [10]

нашёл. всё предельно просто =)
X-----B-----A
|
|
|
C

CX = AC * sinA
AX = AC * cosA
AC находится применением теоремы пифагора к приращениям координат.
аналогично можно найти BX

осталось прийти домой и проверить на работоспособность =)


 
Rial ©   (2006-06-30 13:08) [11]


> tButton ©   (30.06.06 11:55) [10]
>
> нашёл. всё предельно просто =)
>


1. y=y0 + kx; // k=(y1-y0)/(x1-x0);
2. (x-x0r)^2 + (y-y0r)^2 = r^2;
=>

x^2 - (2*x0r)x + x0r^2 + (y0 - y0r + kx)^2 = r^2; =>

(1 + k^2)x^2 + (2k(y0 - y0r) - 2x0r)x + ( x0r^2 + (y0 - y0r)^2 - R^2) = 0;

Обычное квадратное уравнение. Решение мне лень писать.
Точка проверяется на вхождение в интервал отрезка, например, по X.

В твоем же способе есть проблемы:
Тебе еще SinA,CosA найти надо, да и сами стороны CX и AX - не есть ответ
в задаче. Отсюда вывод - он будет менленнее работать.
Если скорость очень важна, старайся забыть про Sin и Cos.


 
Alx2 ©   (2006-06-30 14:55) [12]

В контексте [1]

function CIntersect(P0, P1, C: TPoint; R: Integer): Boolean;
// P0, P1 - координаты отрезка
// C - центр окружности
// R - радиус
var V, MC, M: TPoint;
 LV, LMC, D, s: Double; // Пришлось сделать Double. Иначе переполняется :)
begin
 R := R * R;
 V := point(P1.X - P0.X, P1.Y - P0.Y); // Вектор отрезка
 LV := sqr(V.X) + sqr(V.Y);            // квадрат длины отрезка
 M := point(P1.X + P0.X, P1.Y + P0.Y); // Середина отрезка, увеличенная в два раза
 MC := point(M.X - 2 * C.X, M.Y - 2 * C.Y); // Вектор от центра окружности к середине отрезка
 LMC := sqr(Mc.X) + sqr(mc.Y); // Квадрат длины предыдущего вектора
 s := V.X * Mc.X + V.Y * Mc.Y; // Скалярное произведение
 D := sqr(s) + (4 * R - LMC) * LV; // Дискриминант
 Result := D >= 0;    // Если есть решения
 if Result then
 begin
   D := sqrt(D); // то смотрим, чтобы хотя бы один из t оказался в допустимом диапазоне.
   Result := (abs(D - s) <= LV) or (abs(s + D) <= LV);
 end;
end;



Страницы: 1 вся ветка

Текущий архив: 2006.08.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.054 c
11-1130349488
Vladimir Kladov
2005-10-26 21:58
2006.08.13
Версия 2.19


2-1153667913
Tort
2006-07-23 19:18
2006.08.13
Системное время и работа с ним


2-1153722484
Levin_610
2006-07-24 10:28
2006.08.13
Сервис, снова


4-1145594905
Alex_C
2006-04-21 08:48
2006.08.13
Как "пишать" через динамик?


15-1153285437
syte_ser78
2006-07-19 09:03
2006.08.13
Пользывался кто сервисом?