Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.041 c
15-1152949115
default
2006-07-15 11:38
2006.08.13
Комары-вампиры


2-1153777094
NataliaBorn
2006-07-25 01:38
2006.08.13
Вопрос по навигации по сайту вашему


6-1143620055
Std
2006-03-29 12:14
2006.08.13
Определение IP


4-1145373726
Uran
2006-04-18 19:22
2006.08.13
Определить программно расположение.


2-1153736129
Delphi basic
2006-07-24 14:15
2006.08.13
Выбор значения поля в DBGrid из списка и сопоставление





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский