Привет всем! Есть полилиния, состоящая из 3 точек P0, P1, P2(изображены красными точками). Необходимо найти 2 точки на стыке линий, чтобы потом, наверное, триангуляцией разбить на треугольники и залить цветом как линию, которая изображена ниже. Нормали точек P0 и P2, самое простое, я нашёл, а остальные 2 точки как-то не знаю как. Всё это необходимо для рисования линии любой ширины. Помогите.
они лежат на биссектрисе угла (Р0 Р1 Р2). а дальше напр нижнюю можно найти как пересечение прямой параллельной (РО Р1) и проходящей ниже нее (это будет нижняя граница первого сегмента ломаной на рис) и той самой биссектрисы. другой путь записать уравнения расстояния от точки до прямой, точки ??? должны лежать на расстоянии ширина/2 от каждой из прямых (РО Р1) и (Р1 Р2). будет 2 ур-ния - и 2 решения для каждой из точек ??? (каждое решение - пара ХУ)
триангуляция не нужна. как только найдете искомые точки - можете составить фигуру из 2 залитых четырехугольников
Нужные точки как уже сказали на биссектрисе лежат. Но появилась еще одна идейка, как их найти.. Можно из P1 провести окружность нужного радиуса (ширины линии). Точки пересечения окружности с биссектрисой, и будут искомыми точками.
ialexbr
нет, будет ломаная разной толщины для разных углов
cArmaggedon
Ну да, точно, не подумал
Viatore, спасибо, сделал при помощи биссектрисы, но кода как-то много, думаю, это не самый оптимальный подход. Можете подробнее прояснить по поводу уравнения расстояния от точки до прямой?
Ребят, ну как же все-таки упростить подход, чтобы не проверять пересечение с биссектрисой ?
можно попробовать найти векторы нормали этих двух сторон, сделать их длины шириной в пол-линии и две нужные точки будут точка угла + две нормали и точка угла - две нормали
ну, только нужно строго определять направление нормалей: какое "+", а какое "-"
cArmaggedon, можете обозначить векторы нормали двух сторон, а то я не совсем понял?
В данном случае я просто вывел нормали и вершины нормалей точек p0, p1, p2.
тысячу раз обсуждалось,
нарисовал правильно, дальше два варианта:
- либо искать пересечение n0n1 и n2n3 (поулчится большой вынос для острых углов)
- либо добавить еще два триса на стыке (если рисуешь стрипом, даже добавлять ничего не придется, просто запихивай вершины в буфер)
второй вариант будет плох если ты собираешся использовать прозрачность линии, зато самый простой
mitroxa, я знаю все эти способы - они у меня реализованы, просто я хочу оптимизировать, чтобы без проверок на пересечения линий, стрипов и тд. находить точки. Ищу способ самый оптимальный подход отличный от тех, которые у меня уже реализованы.
Спасибо всем, каждый реально дал неплохой совет, испробовал практически все предложенные варианты! Но, в конце-концов, остановился на варианте как у AndryBlack. Осталось придумать как исправить вырождение линии на стыке, когда углы слишком маленькие.
2pizza
> спасибо, сделал при помощи биссектрисы, но кода как-то много
Ты что-то сделал не так.
Видимо ты стал делать хрень в лоб на тригонометрии, где вас только учат...
n1,n2 - единичные нормали к отрезкам
sum = n1+n2;
return 2*sum/(sum*sum)
Тема в архиве.