Skip to content

Commit 2ddcf2f

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 dc94f8e commit 2ddcf2f

File tree

10 files changed

+1715
-217
lines changed

10 files changed

+1715
-217
lines changed

Sources/Common/Core/PriorityQueue/index.js

+9-5
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

+6-2
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

+11-2
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 };
+220-29
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,254 @@
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;
36+
}
37+
38+
interface IDistanceToPolygon {
39+
t: number,
40+
distance: number
1941
}
2042

2143
export interface vtkPolygon extends vtkObject {
44+
/**
45+
* Set the polygon's points
46+
* Points must be ordered in counterclockwise order
47+
* @param {Vector3[]|Array<number>} points The polygon's points.
48+
* @param {Array<number>} pointIds pointIds
49+
*/
50+
setPoints(points: Vector3[]|Array<number>, pointIds?: Array<number>): void;
51+
52+
/**
53+
* Get the bounds for this polygon as [xmin, xmax, ymin, ymax, zmin, zmax].
54+
* @return {Bounds} bounds
55+
*/
56+
getBounds(): Bounds
57+
58+
/**
59+
* Computes the polygon normal
60+
* @return {number} norm of normal (before normalization)
61+
*/
62+
computeNormal(): number;
63+
64+
/**
65+
* Determine whether a point is inside a polygon. The function uses a winding
66+
* number calculation generalized to the 3D plane one which the polygon
67+
* resides. Returns OUTSIDE if point is not in the polygon; INSIDE if it is inside. Can
68+
* also return FAILURE to indicate a degenerate polygon (points non coplanar or on a line).
69+
* This implementation is inspired by Dan Sunday's algorithm found in the book Practical
70+
* Geometry Algorithms.
71+
* @param {Vector3} point Point to check
72+
* @return {PolygonWithPointIntersectionState} type of intersection
73+
*/
74+
pointInPolygon(point: Vector3): PolygonWithPointIntersectionState;
2275

2376
/**
24-
* Get the array of triangles that triangulate the polygon.
77+
* Compute ear triangulation of current polygon
78+
* The polygon must be convex and have at least 3 points
79+
* @return {boolean} whether triangulation failed or not
2580
*/
26-
getPointArray(): Vector3[];
81+
triangulate(): boolean;
2782

2883
/**
29-
* Set the polygon's points.
30-
* @param {Vector3[]} points The polygon's points.
84+
* Returns the centroid of this polygon
85+
* @return {Vector3} centroid
3186
*/
32-
setPoints(points: Vector3[]): void;
87+
computeCentroid(): Vector3;
3388

3489
/**
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.
90+
* Returns the area of the polygon
91+
* @return {number} area
3992
*/
40-
triangulate(): void;
93+
computeArea(): number;
4194

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

134+
// ---------------------------------------------------
135+
/**
136+
* Compute the normal of a polygon and return its squared norm.
137+
* @param {vtkPoints} points
138+
* @param {Vector3} normal
139+
* @return {number}
140+
*/
141+
export function getNormal(
142+
points: vtkPoints,
143+
normal: Vector3
144+
): number;
145+
146+
/**
147+
* Get the bounds for these points as [xmin, xmax, ymin, ymax,zmin, zmax].
148+
* @param {vtkPoints} points
149+
* @return {Bounds}
150+
*/
151+
export function getBounds(points: vtkPoints): Bounds;
152+
153+
/**
154+
* Determines whether a polygon is convex
155+
* @param {vtkPoints} points vtkPoints defining the polygon
156+
* @return {boolean} whether the polygon is convex or not
157+
*/
158+
export function isConvex(points: vtkPoints): boolean;
159+
160+
/**
161+
* Given a set of points, computes the centroid of the corresponding polygon
162+
* @param {vtkPoints} points vtkPoints defining the polygon
163+
* @param {Vector3} normal normal to the polygon of which the centroid is computed
164+
* @return {Vector3} centroid. Returns null for degenerate polygon
165+
*/
166+
export function computeCentroid(points: vtkPoints, normal: Vector3): Vector3;
167+
168+
/**
169+
* Given a set of points, computes the area of the corresponding polygon
170+
* @param {vtkPoints} points vtkPoints defining the polygon
171+
* @param {Vector3} normal normal to the polygon of which the centroid is computed
172+
* @return {number} area of polygon
173+
*/
174+
export function computeArea(points: vtkPoints, normal: Vector3): number;
175+
176+
/**
177+
* Given a set of points, determine the distance from a point to a polygon.
178+
* @param {Vector3} x
179+
* @param {vtkPoints} points vtkPoints defining the polygon
180+
* @param {Vector3} closestPoint filled with the closest point in the polygon
181+
* @return {IDistanceToPolygon} object containing the distance (distance) and the tolerance with wich the distance is given (t)
182+
*/
183+
export function distanceToPolygon(x: Vector3, points: vtkPoints, closestPoint: Vector3): IDistanceToPolygon;
184+
44185
/**
45186
* Determine whether a point is inside a polygon. The function uses a winding
46187
* 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
188+
* resides. Returns OUTSIDE if point is not in the polygon; INSIDE if it is inside. Can
189+
* also return FAILURE to indicate a degenerate polygon. This implementation is
49190
* inspired by Dan Sunday's algorithm found in the book Practical Geometry
50191
* Algorithms.
51192
*
52193
* @param {Vector3} point Point to check
53-
* @param {Array<Number>|TypedArray} vertices Vertices of the polygon
194+
* @param {Array<number>|TypedArray} vertices Vertices of the polygon
54195
* @param {Bounds} bounds Bounds of the vertices
55196
* @param {Vector3} normal Normal vector of the polygon
56-
* @returns {PolygonIntersectionState} Integer indicating the type of intersection
197+
* @return {PolygonWithPointIntersectionState} Integer indicating the type of intersection
57198
*/
58199
export function pointInPolygon(
59-
point: Vector3,
60-
vertices: Array<number>|TypedArray,
61-
bounds: Bounds,
62-
normal: Vector3
63-
): PolygonIntersectionState;
200+
point: Vector3,
201+
vertices: Array<number> | TypedArray,
202+
bounds: Bounds,
203+
normal: Vector3
204+
): PolygonWithPointIntersectionState;
205+
206+
/**
207+
* Given a set of points that define a polygon, determines whether a line defined
208+
* by two points intersect with the polygon. There can be no intersection, a point
209+
* intersection or a line intersection.
210+
* @param {Vector3} p1 first point of the line
211+
* @param {Vector3} p2 second point of the line
212+
* @param {vtkPoints} points points defining the polygon
213+
* @param {Vector3} normal normal to the polygon
214+
* @return {IIntersectWithLine} type of intersection
215+
*/
216+
export function intersectWithLine(
217+
p1: Vector3,
218+
p2: Vector3,
219+
points: vtkPoints,
220+
normal: Vector3
221+
): IIntersectWithLine;
222+
223+
/**
224+
* Given a set of points that define a polygon and another polygon, computes their
225+
* intersection. It can be a line, a point, no intersection or coincident
226+
* Note: Expects both polygons need to be convex
227+
* @param {vtkCell} cell polygon or any object extending from vtkCell with which to compute intersection
228+
* Note : the function intersectWithLine need to be implemented on the class of the cell given
229+
* @param {vtkPoints} points points defining the polygon
230+
* @param {Vector3} normal normal to the polygon
231+
* @return {PolygonWithCellIntersectionState} type of intersection
232+
*/
233+
export function intersectConvex2DCells(
234+
cell: vtkCell,
235+
points: vtkPoints,
236+
normal: Vector3
237+
): PolygonWithCellIntersectionState;
238+
239+
/**
240+
* Given a set of points, computes the weights corresponding to the interpolation of the
241+
* given point with regard to the points of the polygon. The returned array corresponds to
242+
* the weights and therefore its size is the number of points in the polygon
243+
* @param {Vector3} point point we want the interpolation of
244+
* @param {vtkPoints} points points defining the polygon
245+
* @param {boolean} useMVCInterpolation whether to use MVC interpolation
246+
*/
247+
export function interpolateFunctions(
248+
point: Vector3,
249+
points: vtkPoints,
250+
useMVCInterpolation: boolean
251+
): Array<number>;
64252

65253
/**
66254
* Method used to decorate a given object (publicAPI+model) with vtkPolygon characteristics.
@@ -69,7 +257,11 @@ export function pointInPolygon(
69257
* @param model object on which data structure will be bounds (protected)
70258
* @param {IPolygonInitialValues} [initialValues] (default: {})
71259
*/
72-
export function extend(publicAPI: object, model: object, initialValues?: IPolygonInitialValues): void;
260+
export function extend(
261+
publicAPI: object,
262+
model: object,
263+
initialValues?: IPolygonInitialValues
264+
): void;
73265

74266
/**
75267
* Method used to create a new instance of vtkPolygon.
@@ -79,15 +271,14 @@ export function newInstance(initialValues?: IPolygonInitialValues): vtkPolygon;
79271

80272
/**
81273
* vtkPolygon represents a 2D n-sided polygon.
82-
*
274+
*
83275
* The polygons cannot have any internal holes, and cannot self-intersect.
84276
* Define the polygon with n-points ordered in the counter-clockwise direction.
85277
* Do not repeat the last point.
86278
*/
87279
export declare const vtkPolygon: {
88-
newInstance: typeof newInstance,
280+
newInstance: typeof newInstance;
89281
extend: typeof extend;
90282
// static
91-
92283
};
93284
export default vtkPolygon;

0 commit comments

Comments
 (0)