#ifndef MY_GEOMETRY_HH #define MY_GEOMETRY_HH #include <dune/common/fassign.hh> #include <dune/common/fvector.hh> #include <dune/fufem/arithmetic.hh> #ifdef HAVE_CAIROMM #include <cairomm/context.h> #include <cairomm/fontface.h> #include <cairomm/surface.h> #endif namespace MyGeometry { namespace { using LocalVector = Dune::FieldVector<double, 2>; // kludge because fieldvectors have no initialiser_list constructor, see // https://dune-project.org/flyspray/index.php?do=details&task_id=1166 LocalVector generateVector(double x, double y) { LocalVector tmp; tmp <<= x, y; return tmp; } double degreesToRadians(double degrees) { return M_PI * degrees / 180; }; LocalVector convexCombination(LocalVector const &x, LocalVector const &y) { LocalVector ret; ret = 0.0; Arithmetic::addProduct(ret, 0.5, x); Arithmetic::addProduct(ret, 0.5, y); return ret; } double leftLeg = 1.00; double rightLeg = 0.27; double leftAngle = degreesToRadians(15); double rightAngle = degreesToRadians(75); double const depth = 0.10; } LocalVector const A = generateVector(0, 0); LocalVector const B = generateVector(std::hypot(leftLeg, rightLeg), 0); LocalVector const C = generateVector(leftLeg * std::sin(rightAngle), leftLeg * std::sin(leftAngle)); LocalVector const Y = generateVector(0.35 / std::sin(rightAngle), 0); LocalVector const X = generateVector(Y[0] - 0.20, 0); LocalVector const Z = generateVector(0.35 * std::sin(rightAngle), 0.35 * std::sin(leftAngle)); LocalVector const U = generateVector(Z[0] * X[0] / Y[0], Z[1] * X[0] / Y[0]); LocalVector const K = generateVector(B[0] - 0.06 / std::sin(leftAngle), 0); LocalVector const M = generateVector(B[0] - 0.06 * std::sin(leftAngle), 0.06 * std::sin(rightAngle)); LocalVector const G = convexCombination(A, X); LocalVector const H = convexCombination(X, Y); LocalVector const J = convexCombination(Y, B); LocalVector const I = generateVector(Y[0] + G[0], 0); LocalVector const zenith = generateVector(-std::sin(leftAngle), std::cos(leftAngle)); LocalVector const rotatedZenith = generateVector(-std::cos(leftAngle), -std::sin(leftAngle)); double verticalProjection(LocalVector const &); double horizontalProjection(LocalVector const &); void write(); void render(); } #endif