Страница 1 из 1

Площадь фигуры произвольной формы с известными координатами вершин

Добавлено: 21 ноя 2018, 23:32
mihas
Для расчетов площади и объема фигур цветового охвата написал на 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; //площадь фигуры
}
Например мы имеем два массива координат на плоскости обычного квадрата:

Код: Выделить всё

xc = [1,2,2,1];
yc = [1,1,2,2];
Посчитаем площадь AreaC этого квадрата по нашей функции:

Код: Выделить всё

AreaC = Gamut_Area(xc,yc);
Если не хочется создавать массивы координат и вершин фигуры не так уж много, можно например так прописать эти вершины в вызове функции площади, заключив наши переменные по вертикальной и горизонтальной оси в квадратные скобки:

Код: Выделить всё

AreaC = Gamut_Area([1,2,2,1],[1,1,2,2]);
Объем я вычислял, суммируя срезы площадей в одних случаях, в других подходила формула объема конуса с основанием посчитанной нами фигуры, словом с объемом разберетесь. Как пример, площади срезов фигуры и объем видимых человеком цветов - 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 в обеих случаях остается неизменной, это наши срезы фигуры с равным шагом.
Успешного программирования!