mirror of
https://github.com/liabru/matter-js.git
synced 2024-11-30 10:20:52 -05:00
added internal edge flagging to Bodies.fromVertices
This commit is contained in:
parent
bc7dfc74b8
commit
ca75fde09a
1 changed files with 44 additions and 3 deletions
|
@ -179,7 +179,10 @@ var Bodies = {};
|
||||||
Bodies.fromVertices = function(x, y, vertices, options, removeCollinear) {
|
Bodies.fromVertices = function(x, y, vertices, options, removeCollinear) {
|
||||||
var canDecompose = true,
|
var canDecompose = true,
|
||||||
body,
|
body,
|
||||||
i;
|
i,
|
||||||
|
j,
|
||||||
|
k,
|
||||||
|
z;
|
||||||
|
|
||||||
options = options || {};
|
options = options || {};
|
||||||
removeCollinear = typeof removeCollinear !== 'undefined' ? removeCollinear : true;
|
removeCollinear = typeof removeCollinear !== 'undefined' ? removeCollinear : true;
|
||||||
|
@ -228,7 +231,7 @@ var Bodies = {};
|
||||||
chunkVertices = [];
|
chunkVertices = [];
|
||||||
|
|
||||||
// convert vertices into the correct structure
|
// convert vertices into the correct structure
|
||||||
for (var j = 0; j < chunk.vertices.length; j++) {
|
for (j = 0; j < chunk.vertices.length; j++) {
|
||||||
chunkVertices.push({ x: chunk.vertices[j][0], y: chunk.vertices[j][1] });
|
chunkVertices.push({ x: chunk.vertices[j][0], y: chunk.vertices[j][1] });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,8 +244,46 @@ var Bodies = {};
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// flag internal edges (coincident part edges)
|
||||||
|
var coincident_max_dist = 1;
|
||||||
|
|
||||||
|
for (i = 0; i < parts.length; i++) {
|
||||||
|
var partA = parts[i];
|
||||||
|
|
||||||
|
for (j = i + 1; j < parts.length; j++) {
|
||||||
|
var partB = parts[j];
|
||||||
|
|
||||||
|
if (Bounds.overlaps(partA.bounds, partB.bounds)) {
|
||||||
|
var pav = partA.vertices,
|
||||||
|
pbv = partB.vertices;
|
||||||
|
|
||||||
|
// iterate vertices of both parts
|
||||||
|
for (k = 0; k < partA.vertices.length; k++) {
|
||||||
|
for (z = 0; z < partB.vertices.length; z++) {
|
||||||
|
// find distances between the vertices
|
||||||
|
var da = Vector.magnitudeSquared(Vector.sub(pav[(k + 1) % pav.length], pbv[z])),
|
||||||
|
db = Vector.magnitudeSquared(Vector.sub(pav[k], pbv[(z + 1) % pbv.length]));
|
||||||
|
|
||||||
|
// if both vertices are very close, consider the edge concident (internal)
|
||||||
|
if (da < coincident_max_dist && db < coincident_max_dist) {
|
||||||
|
pav[k].isInternal = true;
|
||||||
|
pbv[z].isInternal = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// update axes now that we have flagged the internal edges
|
||||||
|
for (i = 0; i < parts.length; i++) {
|
||||||
|
var part = parts[i];
|
||||||
|
part.axes = Axes.fromVertices(part.vertices);
|
||||||
|
}
|
||||||
|
|
||||||
// create the parent body to be returned, that contains generated compound parts
|
// create the parent body to be returned, that contains generated compound parts
|
||||||
body = Body.create(Common.extend({}, { parts: parts }, options));
|
body = Body.create(Common.extend({ parts: parts.slice(0) }, options));
|
||||||
Body.setPosition(body, { x: x, y: y });
|
Body.setPosition(body, { x: x, y: y });
|
||||||
|
|
||||||
return body;
|
return body;
|
||||||
|
|
Loading…
Reference in a new issue