Skip to content

Commit e4ca963

Browse files
committed
feat(polygon, testPolygon): add functions to polygon
Translation from cpp implementation and add test to those functions Create functions as static functions and in publicAPI Fix pointInPolygon and triangulate to return the triangles Updated ts definition
1 parent 24de4f8 commit e4ca963

File tree

10 files changed

+1616
-217
lines changed

10 files changed

+1616
-217
lines changed

Sources/Common/Core/PriorityQueue/index.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,22 @@ function vtkPriorityQueue(publicAPI, model) {
1515
model.elements.splice(i, 0, { priority, element });
1616
};
1717

18+
publicAPI.deleteById = (id) => {
19+
model.elements = model.elements.filter(({ element }) => element !== id);
20+
};
21+
1822
publicAPI.pop = () => {
1923
if (model.elements.length > 0) {
20-
return model.elements.shift().element;
24+
const element = model.elements.reduce((prev, current) =>
25+
prev.priority > current.priority ? prev : current
26+
);
27+
publicAPI.deleteById(element.element);
28+
return element.element;
2129
}
2230

2331
return null;
2432
};
2533

26-
publicAPI.deleteById = (id) => {
27-
model.elements = model.elements.filter(({ element }) => element.id !== id);
28-
};
29-
3034
publicAPI.length = () => model.elements.length;
3135
}
3236

Sources/Common/DataModel/Cell/index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,12 @@ function vtkCell(publicAPI, model) {
104104
cell.initialize(model.points, model.pointsIds);
105105
};
106106

107-
publicAPI.getCellDimension = () => {}; // virtual
108-
publicAPI.intersectWithLine = (p1, p2, tol, t, x, pcoords, subId) => {}; // virtual
107+
publicAPI.getCellDimension = () => {
108+
macro.vtkErrorMacro('vtkCell.getCellDimension is not implemented.');
109+
}; // virtual
110+
publicAPI.intersectWithLine = (p1, p2, tol, t, x, pcoords, subId) => {
111+
macro.vtkErrorMacro('vtkCell.intersectWithLine is not implemented.');
112+
}; // virtual
109113
publicAPI.evaluatePosition = (
110114
x,
111115
closestPoint,

Sources/Common/DataModel/Polygon/Constants.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ export const PolygonWithPointIntersectionState = {
66
FAILURE: -1,
77
OUTSIDE: 0,
88
INSIDE: 1,
9-
INTERSECTION: 2,
10-
ON_LINE: 3,
119
};
10+
export const VTK_DBL_EPSILON = 2.2204460492503131e-16;
11+
12+
export const PolygonWithCellIntersectionState = {
13+
NO_INTERSECTION: 0,
14+
POINT_INTERSECTION: 1,
15+
LINE_INTERSECTION: 2,
16+
OVERLAP: 3,
17+
INCLUDED: 4,
18+
};
19+
20+
export default { PolygonWithPointIntersectionState };
Lines changed: 206 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,240 @@
11
import { vtkObject } from "../../../interfaces";
22
import { Bounds, TypedArray, Vector3 } from "../../../types";
3+
import vtkPoints from "../../Core/Points";
4+
import vtkCell from "../Cell";
35

46
export interface IPolygonInitialValues {
5-
firstPoint?: Vector3,
6-
pointCount?: number,
7-
tris?: Vector3[],
7+
pointCount?: number;
8+
tris?: Vector3[];
89
}
910

1011
/**
1112
* Different states which pointInPolygon could return.
1213
*/
13-
export enum PolygonIntersectionState {
14+
export enum PolygonWithPointIntersectionState {
1415
FAILURE,
1516
OUTSIDE,
1617
INSIDE,
17-
INTERSECTION,
18-
ON_LINE,
18+
}
19+
20+
/**
21+
* Different states that intersectWith2DConvexCell could return.
22+
*/
23+
export enum PolygonWithCellIntersectionState {
24+
NO_INTERSECTION,
25+
LINE_INTERSECTION,
26+
POINT_INTERSECTION,
27+
OVERLAP,
28+
INCLUDED
29+
}
30+
31+
interface IIntersectWithLine {
32+
intersection: boolean;
33+
betweenPoints: boolean;
34+
t: number;
35+
x: Vector3;
1936
}
2037

2138
export interface vtkPolygon extends vtkObject {
39+
/**
40+
* Set the polygon's points
41+
* Points must be ordered in counterclockwise order
42+
* @param {Vector3[]|Array<number>} points The polygon's points.
43+
* @param {Array<number>} pointIds pointIds
44+
*/
45+
setPoints(points: Vector3[]|Array<number>, pointIds?: Array<number>): void;
46+
47+
/**
48+
* Get the bounds for this polygon as [xmin, xmax, ymin, ymax, zmin, zmax].
49+
* @return {Bounds} bounds
50+
*/
51+
getBounds(): Bounds
52+
53+
/**
54+
* Computes the polygon normal
55+
* @return {number} norm of normal (before normalization)
56+
*/
57+
computeNormal(): number;
2258

2359
/**
24-
* Get the array of triangles that triangulate the polygon.
60+
* Determine whether a point is inside a polygon. The function uses a winding
61+
* number calculation generalized to the 3D plane one which the polygon
62+
* resides. Returns OUTSIDE if point is not in the polygon; INSIDE if it is inside. Can
63+
* also return FAILURE to indicate a degenerate polygon (points non coplanar or on a line).
64+
* This implementation is inspired by Dan Sunday's algorithm found in the book Practical
65+
* Geometry Algorithms.
66+
* @param {Vector3} point Point to check
67+
* @return {PolygonWithPointIntersectionState} type of intersection
2568
*/
26-
getPointArray(): Vector3[];
69+
pointInPolygon(point: Vector3): PolygonWithPointIntersectionState;
2770

2871
/**
29-
* Set the polygon's points.
30-
* @param {Vector3[]} points The polygon's points.
72+
* Compute ear triangulation of current polygon
73+
* The polygon must be convex and have at least 3 points
74+
* @return {boolean} whether triangulation failed or not
3175
*/
32-
setPoints(points: Vector3[]): void;
76+
triangulate(): boolean;
3377

3478
/**
35-
* Triangulate this polygon.
36-
* The output data must be accessed through `getPointArray`.
37-
* The output data contains points by group of three: each three-group
38-
* defines one triangle.
79+
* Returns the centroid of this polygon
80+
* @return {Vector3} centroid
3981
*/
40-
triangulate(): void;
82+
computeCentroid(): Vector3;
4183

84+
/**
85+
* Returns the area of the polygon
86+
* @return {number} area
87+
*/
88+
computeArea(): number;
89+
90+
/**
91+
* Returns whether the polygon is convex or not
92+
* Returns false for degenerate polygon
93+
* @return {boolean} is convex or not
94+
*/
95+
isConvex(): boolean;
96+
97+
/**
98+
* Interpolates functions with polygon points
99+
* @param {Vector3} point point to compute the interpolation on
100+
* @param {boolean} useMVCInterpolation
101+
* @return weights corresponding to each point of polygon parametrizing the given point
102+
*/
103+
interpolateFunctions(
104+
point: Vector3,
105+
useMVCInterpolation: boolean
106+
): number[];
107+
108+
/**
109+
* Computes intersection of polygon with a line defined by two points
110+
* @param {Vector3} x1 first point of line
111+
* @param {Vector3} x2 second point of line
112+
* @return intersection point coordinates
113+
*/
114+
intersectWithLine(x1: Vector3, x2: Vector3): IIntersectWithLine;
115+
116+
/**
117+
* Computes intersection of polygon with another cell.
118+
* It can be a line, a point, no intersection or coincident
119+
* Note: Expects both polygons/cell to be convex
120+
* @param {vtkCell} cell polygon or any object extending from vtkCell with which to compute intersection
121+
* Note : the function intersectWithLine need to be implemented on the class of the cell given
122+
* @return {PolygonWithCellIntersectionState} type of intersection
123+
*/
124+
intersectConvex2DCells(
125+
cell: vtkCell
126+
): PolygonWithCellIntersectionState;
42127
}
43128

129+
// ---------------------------------------------------
130+
/**
131+
* Compute the normal of a polygon and return its squared norm.
132+
* @param {vtkPoints} points
133+
* @param {Vector3} normal
134+
* @return {number}
135+
*/
136+
export function getNormal(
137+
points: vtkPoints,
138+
normal: Vector3
139+
): number;
140+
141+
/**
142+
* Get the bounds for these points as [xmin, xmax, ymin, ymax,zmin, zmax].
143+
* @param {vtkPoints} points
144+
* @return {Bounds}
145+
*/
146+
export function getBounds(points: vtkPoints): Bounds;
147+
148+
/**
149+
* Determines whether a polygon is convex
150+
* @param {vtkPoints} points vtkPoints defining the polygon
151+
* @return {boolean} whether the polygon is convex or not
152+
*/
153+
export function isConvex(points: vtkPoints): boolean;
154+
155+
/**
156+
* Given a set of points, computes the centroid of the corresponding polygon
157+
* @param {vtkPoints} points vtkPoints defining the polygon
158+
* @param {Vector3} normal normal to the polygon of which the centroid is computed
159+
* @return {Vector3} centroid. Returns null for degenerate polygon
160+
*/
161+
export function computeCentroid(points: vtkPoints, normal: Vector3): Vector3;
162+
163+
/**
164+
* Given a set of points, computes the area of the corresponding polygon
165+
* @param {vtkPoints} points vtkPoints defining the polygon
166+
* @param {Vector3} normal normal to the polygon of which the centroid is computed
167+
* @return {number} area of polygon
168+
*/
169+
export function computeArea(points: vtkPoints, normal: Vector3): number;
170+
44171
/**
45172
* Determine whether a point is inside a polygon. The function uses a winding
46173
* number calculation generalized to the 3D plane one which the polygon
47-
* resides. Returns 0 if point is not in the polygon; 1 if it is inside. Can
48-
* also return -1 to indicate a degenerate polygon. This implementation is
174+
* resides. Returns OUTSIDE if point is not in the polygon; INSIDE if it is inside. Can
175+
* also return FAILURE to indicate a degenerate polygon. This implementation is
49176
* inspired by Dan Sunday's algorithm found in the book Practical Geometry
50177
* Algorithms.
51178
*
52179
* @param {Vector3} point Point to check
53-
* @param {Array<Number>|TypedArray} vertices Vertices of the polygon
180+
* @param {Array<number>|TypedArray} vertices Vertices of the polygon
54181
* @param {Bounds} bounds Bounds of the vertices
55182
* @param {Vector3} normal Normal vector of the polygon
56-
* @returns {PolygonIntersectionState} Integer indicating the type of intersection
183+
* @return {PolygonWithPointIntersectionState} Integer indicating the type of intersection
57184
*/
58185
export function pointInPolygon(
59-
point: Vector3,
60-
vertices: Array<number>|TypedArray,
61-
bounds: Bounds,
62-
normal: Vector3
63-
): PolygonIntersectionState;
186+
point: Vector3,
187+
vertices: Array<number> | TypedArray,
188+
bounds: Bounds,
189+
normal: Vector3
190+
): PolygonWithPointIntersectionState;
191+
192+
/**
193+
* Given a set of points that define a polygon, determines whether a line defined
194+
* by two points intersect with the polygon. There can be no intersection, a point
195+
* intersection or a line intersection.
196+
* @param {Vector3} p1 first point of the line
197+
* @param {Vector3} p2 second point of the line
198+
* @param {vtkPoints} points points defining the polygon
199+
* @param {Vector3} normal normal to the polygon
200+
* @return {IIntersectWithLine} type of intersection
201+
*/
202+
export function intersectWithLine(
203+
p1: Vector3,
204+
p2: Vector3,
205+
points: vtkPoints,
206+
normal: Vector3
207+
): IIntersectWithLine;
208+
209+
/**
210+
* Given a set of points that define a polygon and another polygon, computes their
211+
* intersection. It can be a line, a point, no intersection or coincident
212+
* Note: Expects both polygons need to be convex
213+
* @param {vtkCell} cell polygon or any object extending from vtkCell with which to compute intersection
214+
* Note : the function intersectWithLine need to be implemented on the class of the cell given
215+
* @param {vtkPoints} points points defining the polygon
216+
* @param {Vector3} normal normal to the polygon
217+
* @return {PolygonWithCellIntersectionState} type of intersection
218+
*/
219+
export function intersectConvex2DCells(
220+
cell: vtkCell,
221+
points: vtkPoints,
222+
normal: Vector3
223+
): PolygonWithCellIntersectionState;
224+
225+
/**
226+
* Given a set of points, computes the weights corresponding to the interpolation of the
227+
* given point with regard to the points of the polygon. The returned array corresponds to
228+
* the weights and therefore its size is the number of points in the polygon
229+
* @param {Vector3} point point we want the interpolation of
230+
* @param {vtkPoints} points points defining the polygon
231+
* @param {boolean} useMVCInterpolation whether to use MVC interpolation
232+
*/
233+
export function interpolateFunctions(
234+
point: Vector3,
235+
points: vtkPoints,
236+
useMVCInterpolation: boolean
237+
): Array<number>;
64238

65239
/**
66240
* Method used to decorate a given object (publicAPI+model) with vtkPolygon characteristics.
@@ -69,7 +243,11 @@ export function pointInPolygon(
69243
* @param model object on which data structure will be bounds (protected)
70244
* @param {IPolygonInitialValues} [initialValues] (default: {})
71245
*/
72-
export function extend(publicAPI: object, model: object, initialValues?: IPolygonInitialValues): void;
246+
export function extend(
247+
publicAPI: object,
248+
model: object,
249+
initialValues?: IPolygonInitialValues
250+
): void;
73251

74252
/**
75253
* Method used to create a new instance of vtkPolygon.
@@ -79,15 +257,14 @@ export function newInstance(initialValues?: IPolygonInitialValues): vtkPolygon;
79257

80258
/**
81259
* vtkPolygon represents a 2D n-sided polygon.
82-
*
260+
*
83261
* The polygons cannot have any internal holes, and cannot self-intersect.
84262
* Define the polygon with n-points ordered in the counter-clockwise direction.
85263
* Do not repeat the last point.
86264
*/
87265
export declare const vtkPolygon: {
88-
newInstance: typeof newInstance,
266+
newInstance: typeof newInstance;
89267
extend: typeof extend;
90268
// static
91-
92269
};
93270
export default vtkPolygon;

0 commit comments

Comments
 (0)