Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 17.10.2007, 00:50   #1
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Проверка нахождения точки в прямоугольнике

Дано: Прямоугольник, заданный 4 точками. (дополнительный параметр - угол на кот повернут прямоугольник относительно оси координат Y)
Точка заданная координатами

Нужно написать функцию, возращающую Труе\Фалсе на нахождение точки внутри прямоугольника.
Я решил эту задачу довольно извращенным способом, хотелось бы увидеть правильную математику
__________________
(Offline)
 
Ответить с цитированием
Старый 17.10.2007, 01:08   #2
ЛысыЙ_Чук-Иванчук
Дэвелопер
 
Регистрация: 19.03.2006
Сообщений: 1,241
Написано 10 полезных сообщений
(для 17 пользователей)
Re: Проверка нахождения точки в прямоугольнике

2 Tormoz- а ты давай нам вариан как ты сделал, мы тебе его отимизируем
(Offline)
 
Ответить с цитированием
Старый 17.10.2007, 03:23   #3
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Re: Проверка нахождения точки в прямоугольнике

У меня не математика
я поставил пивот на место точки, припарентил его к прямоугольнику, повернул прямоугольник на ноль, просчитал попадание простыми вычитаниями, потом повернул прямоугольник как было.
Все средствами Блитц3д
Но это через анус.
Нужно формулами решить, ибо некрасиво.
(говорила мне мама - учись сынок. а я пиво, пиво... )
__________________
(Offline)
 
Ответить с цитированием
Старый 17.10.2007, 09:11   #4
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Re: Проверка нахождения точки в прямоугольнике

Дано: Прямоугольник, заданный 4 точками. (дополнительный параметр - угол на кот повернут прямоугольник относительно оси координат Y)
что то не понятно, если задается 4-рмя точками, то етосовсем не обязательно будет прямоугольный четырехугольник.
а вообще, проще всего найти вхождение точек в образующие его треугольники.
Хотя я знаю что есть способ проще, но
(говорила мне мама - учись сынок. а я пиво, пиво... )
(Offline)
 
Ответить с цитированием
Старый 17.10.2007, 10:22   #5
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Re: Проверка нахождения точки в прямоугольнике

Ну например через расстояния от точки до каждого отрезка. Если расстояние от точки до отрезка отрицательно, значит она находится с одной стороны, если положительно - с другой.
dx = x2 - x1
dy = y2 - y1
d1# = ((y1 - Py) * Dx + (Px - x1) * Dy) / (Dy * Dy + Dx * Dx)
dx = x3 - x2
dy = y3 - y2
d2# = ((y2 - Py) * Dx + (Px - x2) * Dy ) / (Dy * Dy + Dx * Dx)
dx = x4 - x3
dy = y4 - y3
d3# = ((y3 - Py) * Dx + (Px - x3) * Dy ) / (Dy * Dy + Dx * Dx)
dx = x1 - x4
dy = y1 - y4
d4# = ((y4 - Py) * Dx + (Px - x4) * Dy ) / (Dy * Dy + Dx * Dx)
Где x1, y1, x2, y2, x3, y3, x4, y4 - координаты точек, образующих четырехугольник, Px, Py - координаты проверяемой точки
если d1, d2, d3, d4 отрицательны - точка внутри четырехугольника

Еще можно трансформировать проверяемую точку, т.е. повернуть ее на угол поворота прямоугольника и потом проверить пересечение как обычно - без учета поворота.
Поворот точки на угол альфа, через центр cx, cy, можно осуществить так
dx = ox - cx
dy = oy - cy
nx = cx + (dx * cos(alpha) - dy * sin(alpha))
ny = cy + (dx * sin(alpha) + dy * cos(alpha))
Где ox, oy - старые координаты точки, nx, ny - новые координаты точки
(Offline)
 
Ответить с цитированием
Старый 17.10.2007, 14:21   #6
Knightmare
Дэвелопер
 
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений
(для 2,920 пользователей)
Re: Проверка нахождения точки в прямоугольнике

алгоритм для н-угольника (вершины все сперва ручками трансформируем... ну или в функции как вариант =)
// point - искомая точка
// verts - массив вершин n-угольника
// vertCount - кол-во вершин
bool InsidePolygon(Vector3 point, Vector3 verts[], int vertCount)
{
    const float MATCH = 0.99f; //для учета погрешностей вычислений
    float angle = 0.0f; // суммарный угол
    Vector3 vA; // временные вектора
    Vector3 vB;
    // цикл по всем вершинам
    for(int i = 0; i < vertCount; i++) 
    {
        // высчитываем вектора от искомой точки до текущей вершины
        vA = verts[i] - point;
        // и от искомой точки до следующей вершины
        vB = verts[(i + 1) % vertCount] - point;
        // увеличиваем angle на угол между этими векторами
        angle += AngleBetweenVectors(vA, vB);
    }
    // если в сумме угол = 2Pi (+-погрешность) значит точка находится внутри
    if(angle >= (MATCH * (2.0f * PI)))
    {
        return true;
    }
    return false;
}
думаю перевести в бейсик не трудно будет =) могу и на картинках показать суть алгоритма =)
(Offline)
 
Ответить с цитированием
Старый 17.10.2007, 14:54   #7
Frank
Нуждающийся
 
Аватар для Frank
 
Регистрация: 22.07.2006
Сообщений: 50
Написано 6 полезных сообщений
(для 19 пользователей)
Re: Проверка нахождения точки в прямоугольнике

http://blitz.pp.ru/forum/showthread....&threadid=1378
(Offline)
 
Ответить с цитированием
Старый 01.11.2007, 16:59   #8
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Проверка нахождения точки в прямоугольнике

http://algolist.manual.ru/maths/geom/belong/poly2d.php
__________________
(Offline)
 
Ответить с цитированием
Старый 20.11.2007, 21:41   #9
Render
Знающий
 
Регистрация: 12.07.2006
Сообщений: 283
Написано 16 полезных сообщений
(для 32 пользователей)
Re: Проверка нахождения точки в прямоугольнике

Вот кстати ещё один способ. Но работает при одном условии, точки должны идти вподряд.

If (
((mouse_x-pr\px[0])*(pr\py[1]-pr\py[0])-(mouse_y-pr\py[0])*(pr\px[1]-pr\px[0]))>0)
And
(((mouse_x-pr\px[2])*(pr\py[1]-pr\py[2])-(mouse_y-pr\py[2])*(pr\px[1]-pr\px[2]))<0)
And
(((mouse_x-pr\px[3])*(pr\py[2]-pr\py[3])-(mouse_y-pr\py[3])*(pr\px[2]-pr\px[3]))<0)
And
(((mouse_x-pr\px[3])*(pr\py[0]-pr\py[3])-(mouse_y-pr\py[3])*(pr\px[0]-pr\px[3]))>0)
Then
Return 1
EndIf
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка на вшивость SBJoker Болтовня 10 01.02.2010 03:59
Проверка на нечётность . Ganociy Delphi 10 02.12.2009 18:37
расчёт нахождения точки на линии mustaeed MidletPascal 21 15.07.2009 20:48
Проверка попадания в бота. Maxxx.!!!. 3D-программирование 37 16.12.2007 16:31
Проверка на столкновение ЛысыЙ_Чук-Иванчук 3D-программирование 8 09.05.2006 10:50


Часовой пояс GMT +4, время: 14:02.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com