import { SPoint } from ".."; /** * 多边形工具 * * @author 庞利祥(sybotan@126.com) */ export class SPolygonUtil { /** * 判断点是否在多边形内 * * @param x 点的x坐标 * @param y 点的y坐标 * @param pointList 多边形顶点 */ static pointIn(x: number, y: number, pointList: SPoint[]): boolean { let crossNum = 0; for (let i = 0; i < pointList.length; i++) { let p1 = pointList[i]; let p2 = pointList[(i + 1) % pointList.length]; // p1p2 与 y=p0.y平行 if (p1.y == p2.y) { continue; } // 交点在p1p2延长线上 if (y < Math.min(p1.y, p2.y) || y >= Math.max(p1.y, p2.y)) { continue; } // 求交点的 x 坐标 let x0 = ((y - p1.y) * (p2.x - p1.x)) / (p2.y - p1.y) + p1.x; if (x0 > x) { // 只统计单边交点 crossNum++; } } // 单边交点为奇数,点在多边形之内 return crossNum % 2 == 1; } // Function pointIn() /** * 判断多边型顶点的时针方向(计算基于数学坐标系统,在绘图坐标系由于y轴方向相反结果也要取反) * * @param pointList 多边形顶点 * @return 为负,顺时针;为正,逆时针;0,点在直线上。 */ static clockDir(pointList: SPoint[]): number { if (pointList.length < 3) { return 0; } // 找出x坐标最大的值 let index = 0; let len = pointList.length; for (let i = 1; i < len; i++) { if (pointList[i].x > pointList[index].x) { index = i; } } let p1 = pointList[index == 0 ? len - 1 : index - 1]; let p2 = pointList[index]; let p3 = pointList[(index + 1) % len]; return (p2.x - p1.x) * (p3.y - p2.y) - (p2.y - p1.y) * (p3.x - p2.x); } // Function clockDir() } // Class SPolygonUtil