Add cylinder generator.

This commit is contained in:
kovacsv 2021-07-04 20:14:45 +02:00
parent 7a29b4f8be
commit f407f8f61e
6 changed files with 110 additions and 16 deletions

View File

@ -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;

View File

@ -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);
}
}
};

View File

@ -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);
};

View File

@ -0,0 +1,12 @@
{
"meshes" : [
{
"type" : "cylinder",
"parameters" : {
"radius" : 0.5,
"height" : 1.0,
"segments" : 20
}
}
]
}

View File

@ -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));
});
});

View File

@ -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 ();
});
});
});