AndryBlack
> http://www.gamedev.ru/code/forum/?id=139524#m0
Нафига там float2 median = W / sqrt( (1-dot(e0,e1)) / 2 );? Лишний корень - раз. Мы узнаём лишь длину - два, а это значит, что мы потом будет ещё раз брать корень при взятии единичного вектора, параллельного биссектрисе. Короче много лишних движений. Мой вариант лучше. Если есть вопросы - спрашивайте.
TarasB, интересно, но пока не понял вашей идеи) То, что получается в sum это вектор с xy компонентами или просто сумма в виде числа? И то, что возвращается return 2*sum/(sum*sum) это длина на подобии median только без корня ?
2pizza
sum - это вектор
Это n1+n2
n1 и n2 - это векторы
мы сложили два вектора, получили вектор
sum*sum - это число (скалярное произведение)
sum * (2/(sum*sum)) - это вектор (вектор умноженный на число)
почему так?
Ну очевидно же, что искомый вектор v параллелен (n1+n2)?
То есть он равен k*(n1+n2), где k - это какой-то неизвестный нам скаляр
Как найти k?
Ну, у нас есть такое условие:
v*n1 = 1
v*n2 = 1
сложим
v*(n1+n2)=2
или
k*(n1+n2)*(n1+n2) = 2
или
k = 2/(sum*sum)
TarasB, всё понятно, это круто)) Получилось.
TarasB, а можете посоветовать что-то по поводу вырождения линии на стыке, когда получается малый угол между линиями. Например, найти точку пересечения:
Ну допустим, уравнение придумать можно, и точку пересечения найти можно, только как это поможет от перебора всех таких случаев?
Ну, я решил проверять таким образом вырождение и соединять параллельные линии(чёрного цвета) по нормалям серединных линий(серого цвета) и срезать большой выпирающий угол. С этим всё получается. Хочу сделать уже, наконец, последнюю модификацию, сделать проверку, чтобы контролировать максимально допустимый резкий угол на стыке, то есть, чтобы выпирающий угол был той длины, которой мне надо, если он больше, то срезать его. И этот вариант с пересечением, который изображен мною выше, не подходит, так как я хочу ограничить выпирающий угол ещё до того как линии налезут друг на друга. Я только 1 вариант вижу - это найти угол между 2 прямыми и сделать проверку на допустимый угол. Можете мне помочь с этой последней задачей, если не трудно? Что скажете по этому поводу, если, конечно, я понятно объяснил?
Тока тебе не угол нужен, боже упаси, что ж вы так все норовите об тригонометрию зашквариться, тебе его косинус нужен
Не так давно писал на Java код для построения ломаных линий, нужно?
Aldaron, у меня всё готово практически. Но можете рассказать как вы поступаете, когда угол между ломанными маленький случай как у меня в посте #19.
TarasB, ну, мне как-то удобнее переводить радианы в градусы и делать проверки именно в них)) Ну всё, практически готово, осталась только оптимизация)
Спасибо всем, особенно вам, TarasB.
2pizza
> TarasB, ну, мне как-то удобнее переводить радианы в градусы и делать проверки
> именно в них
Не делай этого, тебе не нужны радианы вообще.
Сейчас ты будешь писать арксинусы и прочий мусор, но использовать эти трансцендентные функции, когда достаточно лишь скалярного и смешанного произведения - это всё равно, что жрать говно.
Использую такую фун-ю:
function getAngleBetween3Points(p0, p1, p2) { var v1 = substract(p0, p1); var v2 = substract(p2, p1); var d1 = v1.getLength(); var d2 = v2.getLength(); return Math.acos(dot(v1, v2) / (d1 * d2)) ; }
2pizza
> Использую такую фун-ю:
Тебе надо лишь сравнить угол с заранее известной константой.
Тогда тебе надо лишь
dot(v1,v2)/(d1*d2) сравнить с cos(a), a - это константа, то есть cos(a) можно посчитать заранее.
И ещё, угол вообще-то считают так:
atan2(cross(v1,v2), dot(v1,v2))
ну это если он нужен. Но он часто не нужен, постарайся до предела сократить использование угла, потому что постоянные переводы координат в углы и наоборот - это нубство.
TarasB, спасибо, понял, вообще нуб я ещё тот))
Тема в архиве.