Для расчетов площади и объема фигур цветового охвата написал на JavaScript функцию, которая, думаю, может кому-то пригодится.
Вот собственно функция площади любой неправильной многоугольной фигуры, на входе требует два массива координат вершин a и b, или xy по горизонтали и вертикали:
Код: Выделить всё
function Gamut_Area(a,b) {
a[a.length] = a[0];
b[b.length] = b[0];
var A = new Array();
var B = new Array();
var C = new Array();
var t = new Array();
var S = new Array();
var Stotal = 0.0;
for (var i=0; i < a.length-1; i++){
A[i] = Math.sqrt(a[i]*a[i]+b[i]*b[i]);
B[i] = Math.sqrt(a[i+1]*a[i+1]+b[i+1]*b[i+1]);
C[i] = Math.sqrt(Math.pow(a[i+1]-a[i],2) + Math.pow(b[i+1]-b[i],2));
t[i] = (A[i] + B[i] + C[i]) / 2;
S[i] = Math.sqrt(t[i] * (t[i] - A[i]) * (t[i] - B[i]) * (t[i] - C[i]));
Stotal += S[i];
}
return Stotal; //площадь фигуры
}
Например мы имеем два массива координат на плоскости обычного квадрата:
Посчитаем площадь AreaC этого квадрата по нашей функции:
Если не хочется создавать массивы координат и вершин фигуры не так уж много, можно например так прописать эти вершины в вызове функции площади, заключив наши переменные по вертикальной и горизонтальной оси в квадратные скобки:
Объем я вычислял, суммируя срезы площадей в одних случаях, в других подходила формула объема конуса с основанием посчитанной нами фигуры, словом с объемом разберетесь. Как пример, площади срезов фигуры и объем
видимых человеком цветов - HVS или Lab Gamut вычисляются здесь:
https://cielab.xyz/spectralcalc/HVS_sur ... CGATS.html Для начала я просчитал конечно все координаты поверхности этой сложной 360-угольной фигуры по длине вектора C и углу поворота вектора h на каждом срезе L. Потом длину вектора и угол поворота преобразовал в координаты xy, у меня в функции они названы ab, так как я для колориметрии все это писал, по такой функции:
Код: Выделить всё
function LCHab2Lab(LCHab_L,LCHab_C,LCHab_H) {
Lab_L = LCHab_L;
Lab_a = LCHab_C * Math.cos(LCHab_H * Math.PI / 180.0);
Lab_b = LCHab_C * Math.sin(LCHab_H * Math.PI / 180.0);
}
где LCHab_C - длина вектора, LCHab_H - угол поворота вектора (ноль справа и движение против часовой стрелки), Lab_a - координата x по горизонтали, Lab_b - координата y по вертикали. Третья координата LCHab_L в обеих случаях остается неизменной, это наши срезы фигуры с равным шагом.
Успешного программирования!