Skip to content

Commit 7b85be5

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

File tree

10 files changed

+1598
-197
lines changed

10 files changed

+1598
-197
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: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ 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 PolygonWithPolygonIntersectionState = {
13+
NO_INTERSECTION: 0,
14+
POINT_INTERSECTION: 1,
15+
LINE_INTERSECTION: 2,
16+
COINCIDENT: 3,
17+
};
18+
19+
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 "../../Core/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 PolygonWithPolygonIntersectionState {
24+
NO_INTERSECTION,
25+
LINE_INTERSECTION,
26+
POINT_INTERSECTION,
27+
COINCIDENT
28+
}
29+
30+
interface IIntersectWithLine {
31+
intersection: boolean;
32+
betweenPoints: boolean;
33+
t: number;
34+
x: Vector3;
1935
}
2036

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

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

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

3476
/**
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.
77+
* Returns the centroid of this polygon
78+
* @return {Vector3} centroid
3979
*/
40-
triangulate(): void;
80+
computeCentroid(): Vector3;
4181

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

127+
// ---------------------------------------------------
128+
/**
129+
* Compute the normal of a polygon and return its squared norm.
130+
* @param {Array<number>|TypedArray<number>} poly
131+
* @param {vtkPoints} points
132+
* @param {Vector3} normal
133+
* @return {number}
134+
*/
135+
export function getNormal(
136+
poly: Vector3[],
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 {PolygonWithPolygonIntersectionState} type of intersection
218+
*/
219+
export function intersectConvex2DCells(
220+
cell: vtkCell,
221+
points: vtkPoints,
222+
normal: Vector3
223+
): PolygonWithPolygonIntersectionState;
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)