| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- 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
|