| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > Access&ADO: определение нахождения точки |
| Автор: KateL 7.10.2010, 13:35 | ||
| Программа реализована на C++ Builder + MS Access + ADO. Имеется таблица, два поля которой - коодинаты X, Y. Надо получить набор данных в ADOQuery, в которых точка (X,Y) попадает в многоугольник, заданный точками (P[0].x, P[0].y)...(P[n].x, P[n].y). В обычном случае, алгоритм попадания точки в многоугольник выглядит так:
Я не могу придумать, как мне эту функцию засунуть в запрос. Может надо использовать хранимые процедуры? Но я с ними не работала. Это вообще возможно реализовать? Помогите, пожалуйста. |
| Автор: Frees 7.10.2010, 14:07 | ||
Добавлено через 3 минуты и 2 секунды чет я седне не внимательный... многоугольник с прямоугольником перепутал.. |
| Автор: Akina 7.10.2010, 14:29 | ||
А вербально описать можете? |
| Автор: Zloxa 7.10.2010, 15:12 |
| Akina, пускает луч из точки, считает пересечение с отрезками полигона, если нечетное, значит внутри. задачка простенькая, вспомить бы школьную математику. йеххх. |
| Автор: Zloxa 7.10.2010, 15:43 | ||
В общем както так, если не накосячил в формулах координат пересечения отрезков
здесь poly - иммитирует таблицу отрезков многоугольника ,point - иммитирует таблицу точек, которые мы хотим проверить. Луч пускаю в сторону точки (0,0). Потому ограничение - точка не может быть в начале координат Соответственно длинна отрезка тоже не должна быть равной нулю и параллельно лучу, будет деление на ноль. Перевести на акцесс, думаю вполне возможно. если решите взятьза основу - Тестировать тщательно. Таки переживаю что накосячил в расчете. |
| Автор: KateL 7.10.2010, 16:07 |
| Прямо не ожидала, что так быстро ответят. Спасибо большое Завтра буду пробовать применить. |
| Автор: Zloxa 7.10.2010, 16:23 |
| KateL, для акцесса этот запрос надо будет несколько переработать. |
| Автор: Akina 7.10.2010, 16:38 |
greatest(val1,val2) => IIF(val1>val2;val1;val2) least(val1,val2) => IIF(val1<val2;val1;val2) mod(count(*),2) = 1 => (count(*) MOD 2) = 1 остальное вроде совместимо. |
| Автор: Zloxa 7.10.2010, 18:35 |
Здесь я малость перестарался. Мы ведь луч пускаем, нужно его с одной стороны ограничивать.... причем, главно сразу правильно сделал, а потом подумал и переделал. Надо было больше думать. заменить на xp<=x тоже и для y "and yp<=greatest(0,y) and yp>=least(0,y)" заменить на "yp<=y" |
| Автор: KateL 8.10.2010, 18:09 |
| Еще раз спасибо за советы. Я ранее не работала с такими сложными запросами, поэтому долго разбиралась. Но пока у меня не получилось заставить его работать. При выполнении запроса выдает ошибку: "Ошибка синтаксиса в выражении запроса" Возможно, дело в этом: (из хелпов про SQL) В общем случае оператор SELECT с подзапросом имеет вид: SELECT ... FROM ... WHERE <сравниваемое значение> <оператор> (SELECT ... FROM ... WHERE ...) Подзапрос часто называют вложенной командой SELECT, подкомандой SELECT или внутренней командой SELECT. Обычно подзапрос выполняется первым, и его результат используется для определения выборки в главном или внешнем запросе. Подзапрос можно использовать в следующих предложениях SQL команд: • WHERE • HAVING Примечание: Такие сервера как Oracle, MS SQL, Interbase поддерживают использование подзапросов еще и в предложении FROM. |
| Автор: KateL 13.10.2010, 09:57 |
| Большое спасибо за помощь! Все заработало! (Моя ошибка была в том, что я немного переписала условие, и в качестве оператора "не равно" использовала != вместо <>) |