ПрограммированиеФорумГрафика

Как правильно построить и залить ломанную линию любой ширины (2 стр)

Страницы: 1 2
#15
10:38, 29 июля 2013

AndryBlack
> http://www.gamedev.ru/code/forum/?id=139524#m0

Нафига там float2 median = W / sqrt( (1-dot(e0,e1)) / 2 );? Лишний корень - раз. Мы узнаём лишь длину - два, а это значит, что мы потом будет ещё раз брать корень при взятии единичного вектора, параллельного биссектрисе. Короче много лишних движений. Мой вариант лучше. Если есть вопросы - спрашивайте.

#16
19:57, 29 июля 2013

TarasB, интересно, но пока не понял вашей идеи) То, что получается в sum это вектор с xy компонентами или просто сумма в виде числа? И то, что возвращается return 2*sum/(sum*sum) это длина на подобии median только без корня ?

#17
20:04, 29 июля 2013

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)

#18
22:47, 29 июля 2013

TarasB, всё понятно, это круто)) Получилось.

#19
0:10, 30 июля 2013

TarasB, а можете посоветовать что-то по поводу вырождения линии на стыке, когда получается малый угол между линиями. Например, найти точку пересечения:
line_degenaration | Как правильно построить и залить ломанную линию любой ширины line_intersection | Как правильно построить и залить ломанную линию любой ширины

#20
10:32, 30 июля 2013

Ну допустим, уравнение придумать можно, и точку пересечения найти можно, только как это поможет от перебора всех таких случаев?

#21
8:40, 1 авг 2013

Ну, я решил проверять таким образом вырождение и соединять параллельные линии(чёрного цвета)  по нормалям серединных линий(серого цвета) и срезать  большой выпирающий угол. С этим всё получается.  Хочу сделать уже, наконец, последнюю модификацию, сделать проверку, чтобы контролировать максимально допустимый резкий угол на стыке, то есть, чтобы выпирающий угол был той длины, которой мне надо, если он больше, то срезать его.  И этот вариант с пересечением, который изображен мною выше, не подходит, так как я хочу ограничить выпирающий угол ещё до того как линии налезут друг на друга. Я только 1 вариант вижу - это найти угол между 2 прямыми и сделать проверку на допустимый угол. Можете мне помочь с этой последней задачей, если не трудно? Что скажете по этому поводу, если, конечно, я понятно объяснил?

#22
9:25, 1 авг 2013

Тока тебе не угол нужен, боже упаси, что ж вы так все норовите об тригонометрию зашквариться, тебе его косинус нужен

#23
9:40, 1 авг 2013

Не так давно писал на Java код для построения ломаных линий, нужно?

#24
13:27, 1 авг 2013

Aldaron, у меня всё готово практически. Но можете рассказать как вы поступаете, когда угол между ломанными маленький случай как у меня в посте #19.

#25
13:55, 1 авг 2013

TarasB, ну, мне как-то удобнее переводить радианы в градусы и делать проверки именно в них)) Ну всё, практически готово, осталась только оптимизация)
Спасибо всем, особенно вам, TarasB.

#26
14:28, 1 авг 2013

2pizza
> TarasB, ну, мне как-то удобнее переводить радианы в градусы и делать проверки
> именно в них

Не делай этого, тебе не нужны радианы вообще.
Сейчас ты будешь писать арксинусы и прочий мусор, но использовать эти трансцендентные функции, когда достаточно лишь скалярного и смешанного произведения - это всё равно, что жрать говно.

#27
15:09, 1 авг 2013

Использую такую фун-ю:

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)) ;
}
#28
15:16, 1 авг 2013

2pizza
> Использую такую фун-ю:


Тебе надо лишь сравнить угол с заранее известной константой.

Тогда тебе надо лишь

dot(v1,v2)/(d1*d2) сравнить с cos(a), a - это константа, то есть cos(a) можно посчитать заранее.

И ещё, угол вообще-то считают так:

atan2(cross(v1,v2), dot(v1,v2))

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

#29
15:42, 1 авг 2013

TarasB, спасибо, понял, вообще нуб я ещё тот))

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.