Триангуляция полигонов библиотекой earcut.js на WebGL
Здравствуйте! Понадобилось сделать триангуляцию полигонов. Нашел подходящую библиотеку https://github.com/mapbox/earcut. Но никак не могу понять как она работает. Там сказано, что функция принимает массив координат вершин вида:
earcut([10,0, 0,50, 60,60, 70,10]); и возвращает такой объект: [1,0,3, 3,2,1] Во-первых почему функция принимает массив с числами выходящими за диапазон -1...1 используемый в WebGL в качестве координат точек? Даже если предположить, что это координаты в пикселях, то почему функция возвращает странное значение [1,0,3, 3,2,1]? По идее если в функцию передали квадрат (координаты 4 точек), то значит она должна отдать два треугольника и соответственно 12 цифр. Но отдала всего шесть. Как работать с этой библиотекой? |
Цитата:
Цитата:
Цитата:
ты передаешь функции координаты точек а функция тебе возвращает треугольники (если совсем совсем разжевывать то первая вторая и третья точка это один треугольник, вторая третья и четвертая точка это следующий треугольник и так далее). Цитата:
|
Цитата:
Цитата:
Цитата:
Я вот картинку сделал чтобы было понятнее: ![]() |
Andrew K,
Это индексы точек, а не координаты. [10,0, 0,50, 60,60, 70,10] это 4 точки [0, 1, 2, 3], поэтому возврат выглядит так [1,0,3, 3,2,1] или [0,50, 10,0, 70,10, 70,10, 60,60, 0,50]. |
Вложений: 1
Цитата:
На пальцах не получилось можно попробовать картинкой |
Ух, сам бы не догадался. Спасибо, Rise и MallSerg!
Получился такой код: // Исходный массив с точками фигуры let pointsArr = [10,0, 0,50, 60,60, 70,10]; // Функция принимает массив точек фигуры и возвращает массив индексов let indexesArr = earcut(pointsArr); // returns [1,0,3, 3,2,1]; // Массив с итоговыми точками треугольников let result = []; // Соединю два массива. Из indexesArr возьму индексы, из pointsArr значения координат for(let i = 0; i < indexesArr.length; i++) { result.push( pointsArr[ indexesArr[i] * 2 ] ); result.push( pointsArr[ indexesArr[i] * 2 + 1 ] ); } // Вывод координат получившихся треугольников console.log(result); // [0, 50, 10, 0, 70, 10, 70, 10, 60, 60, 0, 50] // Уменьшу координаты точек чтобы фигура полностью помещалась на холсте for(let i = 0; i < result.length; i++) { result[i] /= 100; } |
Часовой пояс GMT +3, время: 16:24. |