LINUX.ORG.RU

Библиотека Cairo. Попадает ли точка x, y на отрезок


0

1

Дан отрезок с координатами x1 = 50, y1 = 75, x2 = 200, y2 = 75 есть ли какая-то встроенная функция в библиотеке Cairo, которая возвратит true если точка x,y попадает на эту прямую или наоброт

cairo_move_to (cr, 50.0, 75.0);
cairo_line_to (cr, 200.0, 75.0);
либо какой-то эквивалент этому, за исключением собственного расчёта по уравнению прямой


>за исключением собственного расчёта по уравнению прямой

Этож несколько строчек.

Diecae8i
()

Библиотека Cairo предназначена для рисования. Для рассчетов «попадёт/не попадёт» предназначен мозг.

yoghurt ★★★★★
()

любой отрезок можно описать формулой y=Nx, где N легко вычисляется. А дальше банальное вычисление y или x нужной точки в зависимости от входных данных.

Deleted
()
Ответ на: комментарий от Zodd

не, так как набор пикселей не является математической прямой нулевой толщины, а является набором квадратов, отдалённо напоминающих прямую.

anonymous
()
Ответ на: комментарий от anonymous

Что мешает взять округление размером в этот квадрат?

Zodd ★★★★★
()
Ответ на: комментарий от yoghurt

А как для более общей задачи задействовать мозг:

Есть набор отрезков (скажем несколько тысяч), также задана точка и число d. Нужно найти все отрезки, расстояние до которых меньше или равно d.

?

Перебирать все отрезки подряд - слишком долго. Нужно построить какой-то spatial index. Что подсказывает мозг на этот счет?

kamre ★★★
()

>есть ли какая-то встроенная функция в библиотеке Cairo

Геометрию в 6-м классе перестали изучать нынче?

KRoN73 ★★★★★
()
Ответ на: комментарий от ugoday

И как их сортировать, по какому критерию? Отрезки же произвольные и пересекаются друг с другом еще.

kamre ★★★
()
Ответ на: комментарий от kamre

И как их сортировать, по какому критерию?

А как хочешь. Существует ровно бесконечное количество способов.

Отрезки же произвольные и пересекаются друг с другом еще.

Отсортируй два раза (по оси абцисс и ординат) и, соответствено ищи два раза, пока отрезки гарантированно не уйдут на расстояние d.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

> Отсортируй два раза (по оси абцисс и ординат) и, соответствено ищи два раза, пока отрезки гарантированно не уйдут на расстояние d.

И что может дать такая сортировка для поиска? Использовать bounding box отрезка для проверки - не эффективно, т.к. возможно положение отрезков, когда почти все bounding boxes будут содержать точку для поиска.

kamre ★★★
()

расстояние от точки до прямой сравнить с эпсилон, больше ничего в голову не приходит...

backbone ★★★★★
()

Почитайте про алгоритм Брезенхема, кажется именно его применяют при построении отрезков на экране.
Вот вам очень тупой быдлокодерский вариант: строите ваш отрезок чёрным на белом фоне, считаете число пикселей чёрного цвета в строимой области, затем ставите вашу точку, снова считаете число точек чёрного цвета, сравниваете результаты первого и второго подсчётов, если совпало, то либо точка попала на прямую, либо за пределы области построения. Таким тупым способом вы абстрагируетесь от алгоритма построения прямой, реализованной в используемой граф библиотеке.

adriano32 ★★★
()
Ответ на: комментарий от Deleted

> любой отрезок можно описать формулой y=Nx, где N легко вычисляется. А дальше банальное вычисление y или x нужной точки в зависимости от входных данных.

А что за y, N & x здесь?

anonymous
()

> Дан отрезок с координатами x1 = 50, y1 = 75, x2 = 200, y2 = 75 есть ли какая-то встроенная функция в библиотеке Cairo, которая возвратит true если точка x,y попадает на эту прямую или наоброт

На прямую, содержащую отрезок? Или тебя таки интересует отрезок? Или может быть интересно, будет ли точка радиусом р на нарисованной линии толщины т-пикселей?

anonymous
()
Ответ на: комментарий от Deleted

Так даже прямую нельзя описать, не то что отрезок. Прямая это y = N*x + С, а для отрезка надо ещё 2 числа начала и конца.

anonymous
()
Ответ на: комментарий от anonymous

я лишь суть написал. прекрасно понимаю, что мой пример есть частный случай, так сказать для примера, когда линия проходит через х=0 и у=0. разумеется, если есть сдвиг по абсциссе или ординате, то будет + или - С

Deleted
()
Ответ на: комментарий от anonymous

>А что за y, N & x здесь?

y - ордината

х - абсцисса

N - величина, характеризующая наклон линии

если нужен сдвиг по оси ординат, то будет

y=Nx+C

где С - величина сдвига от начала координат. Положительная величина будет сдвигать вверх, отрицательная - вниз.

Народ, вы шутите? Это же основы алгебры! ЕМНИП 6 или 7 класс. В моей жизни это было 20 лет назад и до сих пор помню.

Deleted
()
Ответ на: комментарий от adriano32

> Почитайте про алгоритм Брезенхема

алгоритм

Нафига тут алгоритм? Перебирать пиксели, когда на крайняк можно перебрать отрезки

different_thing
()
Ответ на: комментарий от Loki13

> А что в cairo нет getpixel(point)?

анонимус в данном топике уже давно дал правильную ссылку на нужную функцию - теперь тут «резвятся» знатоки школьного курса геометрии

aho
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.