Add cylinder generator.
This commit is contained in:
parent
7a29b4f8be
commit
f407f8f61e
@ -32,6 +32,11 @@ OV.IsEqual = function (a, b)
|
||||
return Math.abs (b - a) < OV.Eps;
|
||||
};
|
||||
|
||||
OV.IsEqualEps = function (a, b, eps)
|
||||
{
|
||||
return Math.abs (b - a) < eps;
|
||||
};
|
||||
|
||||
OV.IsPositive = function (a)
|
||||
{
|
||||
return a > OV.Eps;
|
||||
|
||||
@ -99,6 +99,12 @@ OV.ImporterO3dv = class extends OV.ImporterBase
|
||||
}
|
||||
const mesh = OV.GenerateCuboid (genParams, parameters.size_x, parameters.size_y, parameters.size_z);
|
||||
this.model.AddMesh (mesh);
|
||||
} else if (meshContent.type === 'cylinder') {
|
||||
if (parameters.radius === undefined || parameters.height === undefined || parameters.segments === undefined) {
|
||||
return;
|
||||
}
|
||||
const mesh = OV.GenerateCylinder (genParams, parameters.radius, parameters.height, parameters.segments);
|
||||
this.model.AddMesh (mesh);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -78,25 +78,65 @@ OV.Generator = class
|
||||
}
|
||||
};
|
||||
|
||||
OV.GenerateCuboid = function (genParams, xSize, ySize, zSize)
|
||||
|
||||
OV.GenerateExtrude = function (genParams, vertices, height)
|
||||
{
|
||||
let generator = new OV.Generator (genParams);
|
||||
|
||||
generator.AddVertex (0.0, 0.0, 0.0);
|
||||
generator.AddVertex (xSize, 0.0, 0.0);
|
||||
generator.AddVertex (xSize, ySize, 0.0);
|
||||
generator.AddVertex (0.0, ySize, 0.0);
|
||||
generator.AddVertex (0.0, 0.0, zSize);
|
||||
generator.AddVertex (xSize, 0.0, zSize);
|
||||
generator.AddVertex (xSize, ySize, zSize);
|
||||
generator.AddVertex (0.0, ySize, zSize);
|
||||
let topPolygon = [];
|
||||
let bottomPolygon = [];
|
||||
for (let i = 0; i < vertices.length; i++) {
|
||||
const vertex = vertices[i];
|
||||
generator.AddVertex (vertex.x, vertex.y, 0.0);
|
||||
generator.AddVertex (vertex.x, vertex.y, height);
|
||||
topPolygon.push (i * 2 + 1);
|
||||
bottomPolygon.push (2 * vertices.length - (i + 1) * 2);
|
||||
}
|
||||
|
||||
generator.AddConvexPolygon ([0, 3, 2, 1]);
|
||||
generator.AddConvexPolygon ([0, 1, 5, 4]);
|
||||
generator.AddConvexPolygon ([1, 2, 6, 5]);
|
||||
generator.AddConvexPolygon ([2, 3, 7, 6]);
|
||||
generator.AddConvexPolygon ([3, 0, 4, 7]);
|
||||
generator.AddConvexPolygon ([4, 5, 6, 7]);
|
||||
for (let i = 0; i < vertices.length; i++) {
|
||||
const bottom = i * 2;
|
||||
const bottomNext = (i < vertices.length - 1) ? bottom + 2 : 0;
|
||||
const top = i * 2 + 1;
|
||||
const topNext = (i < vertices.length - 1) ? top + 2 : 1;
|
||||
generator.AddConvexPolygon ([
|
||||
bottom,
|
||||
bottomNext,
|
||||
topNext,
|
||||
top
|
||||
]);
|
||||
}
|
||||
|
||||
generator.AddConvexPolygon (bottomPolygon);
|
||||
generator.AddConvexPolygon (topPolygon);
|
||||
return generator.GetMesh ();
|
||||
};
|
||||
|
||||
OV.GenerateCuboid = function (genParams, xSize, ySize, zSize)
|
||||
{
|
||||
let vertices = [
|
||||
new OV.Coord2D (0.0, 0.0),
|
||||
new OV.Coord2D (xSize, 0.0),
|
||||
new OV.Coord2D (xSize, ySize),
|
||||
new OV.Coord2D (0.0, ySize),
|
||||
];
|
||||
return OV.GenerateExtrude (genParams, vertices, zSize);
|
||||
};
|
||||
|
||||
OV.GenerateCylinder = function (genParams, radius, height, segments)
|
||||
{
|
||||
function GetCylindricalCoord (radius, angle)
|
||||
{
|
||||
return new OV.Coord2D (
|
||||
radius * Math.cos (angle),
|
||||
radius * Math.sin (angle)
|
||||
);
|
||||
}
|
||||
|
||||
let baseVertices = [];
|
||||
const step = 2.0 * Math.PI / segments;
|
||||
for (let i = 0; i < segments; i++) {
|
||||
let cylindrical = GetCylindricalCoord (radius, i * step);
|
||||
baseVertices.push (cylindrical);
|
||||
}
|
||||
return OV.GenerateExtrude (genParams, baseVertices, height);
|
||||
};
|
||||
|
||||
12
test/testfiles/o3dv/cylinder.o3dv
Normal file
12
test/testfiles/o3dv/cylinder.o3dv
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"meshes" : [
|
||||
{
|
||||
"type" : "cylinder",
|
||||
"parameters" : {
|
||||
"radius" : 0.5,
|
||||
"height" : 1.0,
|
||||
"segments" : 20
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -26,6 +26,11 @@ describe ('Generator', function () {
|
||||
const bounds = OV.GetBoundingBox (cuboid);
|
||||
assert (OV.CoordIsEqual3D (bounds.min, new OV.Coord3D (1.0, 0.0, 0.0)));
|
||||
assert (OV.CoordIsEqual3D (bounds.max, new OV.Coord3D (2.0, 1.0, 1.0)));
|
||||
});
|
||||
|
||||
it ('Cylinder with Default Parameters', function () {
|
||||
const cylinder = OV.GenerateCylinder (null, 0.5, 1.0, 10);
|
||||
assert (OV.IsSolid (cylinder));
|
||||
assert (OV.IsEqualEps (OV.CalculateVolume (cylinder), Math.PI * 0.5 * 0.5 * 1.0, 0.1));
|
||||
});
|
||||
});
|
||||
|
||||
@ -115,5 +115,31 @@ describe ('O3dv Importer', function () {
|
||||
});
|
||||
done ();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it ('cylinder.o3dv', function (done) {
|
||||
testFiles.ImportO3dvFile ('cylinder.o3dv', function (model) {
|
||||
assert (OV.CheckModel (model));
|
||||
assert.deepStrictEqual (testUtils.ModelToObjectSimple (model), {
|
||||
name : '',
|
||||
materials : [
|
||||
{ name : '' }
|
||||
],
|
||||
meshes : [
|
||||
{
|
||||
name : '',
|
||||
vertexCount : 40,
|
||||
normalCount : 76,
|
||||
uvCount : 0,
|
||||
triangleCount : 76,
|
||||
boundingBox : {
|
||||
min : [-0.5, -0.5, 0],
|
||||
max : [0.5, 0.5, 1]
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
done ();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Loading…
Reference in New Issue
Block a user