Перевірити, чи належить точка прямокутника

Перевірити, чи належить точка прямокутника

Відомі координати вершин прямокутника (на площині), кут його повороту (щодо центру), і координати точки. Як програмно дізнатися, чи належить точка прямокутника, чи ні?

Знайшов в загальному випадку для полігону (можна обходити всі вершини з підсумовуванням кутів між векторами "точка-вершина" (якщо + -360, то належить)), але тут якось простіше можна зробити.

порахувати знаки векторних добутків векторів сторін і вершина-точка, тобто визначити, чи лежить точка зліва від кожної сторони при обході проти годинникової стрілки

Аналітична геометрія рулить.
Будь-яка пряма (в прямокутник - це четиер прямих) ділять площину на дві частини + і -.
Якщо підставити координати точки в # XA0; рівняння прямої то вийти відстань від точки до прямої, зі знаком позначає приналежність до однієї з частин.
Відповідно буде приблизно так:
# XA0; # XA0; # XA0; +
# XA0; -----------
| # XA0; # XA0; - # XA0; # XA0; |
| # XA0; # XA0; # XA0; # XA0; # XA0; |
+| - # XA0; # XA0; # XA0; # XA0; # XA0; - | +
| # XA0; # XA0; # XA0; # XA0; # XA0; |
| # XA0; # XA0; - # XA0; # XA0; |
# XA0; -----------
# XA0; # XA0; # XA0; +
Тупо перевіряєш, що результат подствановкі завжди менше або дорівнює 0, значить точка в прямокутнику.

P.S.
Знак залежить від напрямку направляючого вектора задає пряму, це треба враховувати.

тупо по формулі повороту повертаються всі точки прямокутника для того щоб зробити прямокутник горизонтальним, а далі проверяеца як зазвичай.

Або ще можна як було зазначено в [2] зробити. Шукаємо висоту від точки до прямої. Якщо все висоти позитивні або негативні, то значить всередині (якщо напрямок обходу одне і те ж). Для того щоб знайти висоту можна побудувати два прямокутних трикутника і з них вивести формулу загального катета, який і буде висотою.

---
. we are walking on a thin line and you better avoid the risk.

хм. прочитав subj # XA0; невірно і відповідав в [1] про приналежність до тре косинці;)

Для прямокутника не потрібно всі чотири сторони обраховувати. Досить розкласти вектор перша вершина - точка по векторах двох суміжних сторін, і перевірити, що обидві параметричні координати знаходяться в межах 0..1. Поділів навіть не знадобиться, якщо порівнювати не з одиницею, а з дискримінантом (врахувавши його знак)

> І чим це зарулює запропоноване в [1]. Ті ж яйця, тільки
> Збоку.

Розгорнуті яйця. ))
А алгоритм той же самий, якщо я правильно розумію.

Є такий самий простий але і самий повільний алгоритм прямокутник це 2 трикутника -> знаходимо плошадь прямокутника потім беремо точку і від неї будуємо 4 треуголька (точка вершина і сторона трикутника збігається з однією з сторін прямокутника) складаємо плошади цих 4 трикутників і порівнюємо з похибкою з плошею прямокутника все.

# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; if flag then
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; begin
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; // поруч з лінією, в межах w.
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; // h (тут, напевно, l) - відстань від точки до прямої.
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; end;
# XA0; # XA0; # XA0; # XA0; # XA0; end;
end;

Коротше якщо ще подумати, то можна зробити те що треба)


> Якщо підставити координати точки в # XA0; рівняння прямої то
> Вийти відстань від точки до прямої,

Мені цікаво, як ви в цьому випадку визначте рівняння для вертикальної прямої)))

> [11] Darkwingg # XA0; (27.08.07 10:02)

А є якісь проблеми. ))

имхо саме правльно перерахувати координати точки в систему координат, побудовану на будь-якій вершині і двох перпендикулярних сторонах прямокутника, а потім порівняти координати з довжинами сторін. (Суть процесу вже описана вище, привожу формули)

виберемо в якості точки відліку нової системи координат ліву нижню точку прямокутника.

pх, py - координати точки в старій системі координат
newpx, newpy - координати точки в новій системі координат
ax, ay - координати лівої нижньої точки прямокутника (естессно в ст. системі координат.)
la, lb - довжини сторін прямокутника

G - кут повороту прямокутника за годинниковою стрілкою, щодо його лівої нижньої точки.

1. newpx = (px - ax) * cos (G) - (py - ay) * sin (G)
2. newpy = (px - ax) * sin (G) + (py - ay) * cos (G)

якщо newpx <= la и newpy <= lb, то точка лежит внутри прямоугольника.

правда вийде не зовсім гуд, якщо довжини сторін прямокутника не відомі, а відомі лише координати вершин))) доведеться рахувати ще й їх, на це потрібно ще кілька операцій.


> А є якісь проблеми. ))

хм)), ну напишіть тоді рівняння прямої що проходить через точки

> [14] Darkwingg # XA0; (27.08.07 10:59)

Вам у ВНЗ не викладали властивості прямої. )

Перше властивість:
Через будь-які дві незбіжні точки можна провести єдину пряму.

У данно мслучае рівняння прямої буде:
x = x1
і відстань від прямої до точки буде знаходитися як різниця x1 і x координати точки.

хм. хм) та через будь-які 2 незбіжні точки можна провести пряму, проте не кожну пряму можна описати рівнянням y = f (x), тобто як раз в разі вертикальної прямої буде потрібно додаткове умова, що перевіряє вертикальна вона.

У вас сказано, що просто достатньо підставити координати в рівняння прямої, в такому випадку, напишіть це рівняння для всіх прямих включаючи вертикальні)))

> [16] Darkwingg # XA0; (27.08.07 12:00)

От не треба чіплятися до таких дрібниць.
І идиоту відомо, що вертикальна прямо не являється звичайної прямої, хоча б тому, що не являється графіком.
Відповідно і порверять її потрібно окремо.
ІМХО простіше перевірити, ніж скористатися вашим методом.
Та й працювати буде швидше.


> От не треба чіплятися до таких дрібниць.

А це не зовсім дрібниці. ось наприклад що ви будете робити з прямою близькою до вертикальної?

підозрюю що ваша формула виглядає так y = x (y2-y1) / (x2-x1) + b, в такому випадку при малому але не нульовому (x2-x1), що як раз має пряма, близька до вертикальної, ви отримаєте велику похибка і можете промахнутися з положенням точки, а крім того може виникнути розподіл на нуль.

> Darkwingg
будь-яку пряму можна описати, наприклад, рівнянням ax + by + c = 0


> [18] Darkwingg # XA0; (27.08.07 13:03)

Хм. А я зазвичай навпаки уникаю вертикальних прямих саме застосуванням прямої близькою до вертикальної, зазвичай точності вистачає, навіть на дуже довгих прямих.

> В даному випадку немає сенсу від такого опису
Якщо мова йде про те, з якого боку від прямої знаходиться точка, то це опис відмінно підходить.

Бліін. У я тупий став. Взагалі вже в математиці не встромляють, треба вирішити завдань.

Darkwingg, ось воно - те саме рівняння.

> @ !! ex
однак для побудови рівнянь доведеться робити обчислення для всіх сторін, що зайве.

в [5] описаний більш економічний спосіб.

тільки от до цього виду рівняння теж треба ще привести, здается мені що в цьому методі від ділення на нуль всерно нікуди не дітися. Пряма, що проходить через дві точки, якщо не помиляюся, описується такою формулою:

шляхом бубна і Ктулху його можна привести до виду ax + by + c = 0, де всерно буде (x1 - x2) в знаменнику.

> [24] Darkwingg # XA0; (27.08.07 15:28)

Чесно кажучи я вже зараз не пам'ятаю, але нам пояснювали як уникати випадку, коли компонента направляючого вектора дорівнює 0, на зразок там якось просто, але це було давно і я не пам'ятаю.

в тому то і справа що з синусами, косинусами, кутами і векторами НЕ дожно виникати ніяких проблем. там взагалі немає ніякого поділу. що собсно і відображено в моєму методі))). все закінчую флудить. останній пост в цій темі.

> Проте для побудови рівнянь доведеться робити обчислення
> Для всіх сторін, що зайве.
>
> В [5] описаний більш економічний спосіб.

Навіщо? парами вважати, що направляють вектори то у парарельних прямих одінаквие.
А якщо це прямокутник, то досить знайти один, а другий буде під 90 градусів.


> [26] Darkwingg # XA0; (27.08.07 15:41)

Нееет. Все таки я туплю конкретно.
Немає там ділення на нуль. Навіть при вертикальній прямій.
Це ж тупо компоненти вектора, ну дорівнює одна з них нулю, там же множення, а не розподіл!

> Проте для побудови рівнянь доведеться робити обчислення
> Для всіх сторін, що зайве.
>
> В [5] описаний більш економічний спосіб.

Навіщо? парами вважати, що направляють вектори то у парарельних прямих одінаквие.
А якщо це прямокутник, то досить знайти один, а другий буде під 90 градусів.


> [26] Darkwingg # XA0; (27.08.07 15:41)

Нееет. Все таки я туплю конкретно.
Немає там ділення на нуль. Навіть при вертикальній прямій.
Це ж тупо компоненти вектора, ну дорівнює одна з них нулю, там же множення, а не розподіл!

Пам'ять: 0.81 MB
Час: 0.03 c