///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2017 Statoil ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #include "RigTesselatorTools.h" #include "cvfMath.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RigEllipsisTesselator::RigEllipsisTesselator(size_t numSlices) { computeCirclePoints(numSlices); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RigEllipsisTesselator::tesselateEllipsis(float a, float b, std::vector* triangleIndices, std::vector* nodeCoords) { // See http://mathworld.wolfram.com/Ellipse.html for (auto v : m_circlePoints) { v.x() = v.x() * a; v.y() = v.y() * b; nodeCoords->push_back(v); } *triangleIndices = m_circleConnectivities; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RigEllipsisTesselator::computeCirclePoints(size_t numSlices) { // Based on GeometryUtils::generatePointsOnCircle double da = 2 * cvf::PI_D / numSlices; cvf::Vec3f point = cvf::Vec3f::ZERO; // Center of circle m_circlePoints.push_back(point); for (size_t i = 0; i < numSlices; i++) { // Precompute this one (A = i*da;) double sinA = cvf::Math::sin(i*da); double cosA = cvf::Math::cos(i*da); point.x() = static_cast(-sinA); point.y() = static_cast( cosA); m_circlePoints.push_back(point); } for (cvf::uint i = 0; i < static_cast(numSlices); i++) { // Center m_circleConnectivities.push_back(0); m_circleConnectivities.push_back(i + 1); if (i == (numSlices - 1)) { // Connect the last slice to the first slice m_circleConnectivities.push_back(1); } else { m_circleConnectivities.push_back(i + 2); } } }