Browse Source

[新增] 多边形中心点

develop
徐振升 5 years ago
parent
commit
49931742f1
  1. 55
      src/app/working-area/working-area.component.ts

55
src/app/working-area/working-area.component.ts

@ -1078,8 +1078,8 @@ export class PolygonIcon extends PIXI.Container {
this.addChild(this.polygonLineGraphics);
this.text.anchor.set(0.5);
// this.text.position = this.getCenterOfGravityPoint(this.pointsData);
console.log(this.polygonLineGraphics._bounds);
this.text.position = this.calculatePolygonGravityCenter(this.pointsData);
// console.log(this.calculatePolygonGravityCenter(this.pointsData));
this.polygonLineGraphics.addChild(this.text);
// 添加圆点事件
this.pointsGraphics.forEach((item, index, array) => {
@ -1123,6 +1123,8 @@ export class PolygonIcon extends PIXI.Container {
this.polygonLineGraphics.lineStyle(1, 0xFFBD01, 1);
this.polygonLineGraphics.drawPolygon(this.getPoints());
this.polygonLineGraphics.closePath();
this.text.position = this.calculatePolygonGravityCenter(this.pointsData);
}
})
.on('rightclick', event => {
@ -1176,31 +1178,30 @@ export class PolygonIcon extends PIXI.Container {
});
}
public getCenterOfGravityPoint(points) {
let sumX = 0;
let sumY = 0;
let sumArea = 0;
let area = 0;
let p1 = points[1];
for (let i = 2; i < points.length; i++) {
const p2 = points[i];
area = this.Area(points[0], p1, p2);
sumArea += area;
sumX += (points[0][0] + p1[0] + p2[0]) * area;
sumY += (points[0][1] + p1[1] + p2[1]) * area;
p1 = p2;
}
const pointX = sumX / sumArea / 3;
const pointY = sumY / sumArea / 3;
console.log(pointX);
console.log(pointY);
return new PIXI.Point(pointX, pointY);
}
Area(p0, p1, p2) {
let area = 0.0;
area = p0[0] * p1[1] + p1[0] * p2[1] + p2[0] * p0[1] - p1[0] * p0[1] - p2[0] * p1[1] - p0[0] * p2[1];
return area / 2;
}
public calculatePolygonGravityCenter(points: PIXI.Point[]) {
let area = 0.0; // 多边形面积
let gravityLat = 0.0; // 重心点 latitude
let gravityLng = 0.0; // 重心点 longitude
points.forEach((item, index) => {
// 1
const lat = item.x;
const lng = item.y;
const nextLat = points[(index + 1) % points.length].x;
const nextLng = points[(index + 1) % points.length].y;
// 2
const tempArea = (nextLat * lng - nextLng * lat) / 2.0;
// 3
area += tempArea;
// 4
gravityLat += tempArea * (lat + nextLat) / 3;
gravityLng += tempArea * (lng + nextLng) / 3;
});
// 5
gravityLat = gravityLat / area;
gravityLng = gravityLng / area;
return new PIXI.Point(gravityLat, gravityLng);
}
/**
*
*/

Loading…
Cancel
Save