en c frío ++ y mientras asumiendo que tiene una estructura Vec2 con propiedades x e y:
const Vec2 findCentroid(Vec2* pts, size_t nPts){
Vec2 off = pts[0];
float twicearea = 0;
float x = 0;
float y = 0;
Vec2 p1, p2;
float f;
for (int i = 0, j = nPts - 1; i < nPts; j = i++) {
p1 = pts[i];
p2 = pts[j];
f = (p1.x - off.x) * (p2.y - off.y) - (p2.x - off.x) * (p1.y - off.y);
twicearea += f;
x += (p1.x + p2.x - 2 * off.x) * f;
y += (p1.y + p2.y - 2 * off.y) * f;
}
f = twicearea * 3;
return Vec2(x/f + off.x, y/f + off.y);
}
y en javascript:
function findCentroid(pts, nPts) {
var off = pts[0];
var twicearea = 0;
var x = 0;
var y = 0;
var p1,p2;
var f;
for (var i = 0, j = nPts - 1; i < nPts; j = i++) {
p1 = pts[i];
p2 = pts[j];
f = (p1.lat - off.lat) * (p2.lng - off.lng) - (p2.lat - off.lat) * (p1.lng - off.lng);
twicearea += f;
x += (p1.lat + p2.lat - 2 * off.lat) * f;
y += (p1.lng + p2.lng - 2 * off.lng) * f;
}
f = twicearea * 3;
return {
X: x/f + off.lat,
Y: y/f + off.lng
};
}
o en el bueno de C y mientras se asume que usted tener un struct Point con x e y propiedades:
const Point centroidForPoly(const int numVerts, const Point* verts)
{
float sum = 0.0f;
Point vsum = 0;
for (int i = 0; i<numVerts; i++){
Point v1 = verts[i];
Point v2 = verts[(i + 1) % numVerts];
float cross = v1.x*v2.y - v1.y*v2.x;
sum += cross;
vsum = Point(((v1.x + v2.x) * cross) + vsum.x, ((v1.y + v2.y) * cross) + vsum.y);
}
float z = 1.0f/(3.0f * sum);
return Point(vsum.x * z, vsum.y * z);
}
1) Tomar una captura de pantalla. 2) Imprimirlo. 3) Cortar el polígono con tijeras. 4) Poner en algunas escalas. 5) ??? 6) Beneficio. – Greg
Si pudieras dividir polígonos autointersecables en varios polígonos que no se intersectan a sí mismos, supongo que calcular el centro de gravedad de esos polígonos sería fácil, entonces ... –
@MarvinLabs ¡Pero eso no sería posible en mi caso! :( – mixkat