void Cube::ComputeArea() { //Extra credit to implement this glm::vec4 vertices[]{ { -.5f, -.5f, .5f, 1.f, }, { .5f, -.5f, .5f, 1.f, }, { -.5f, .5f, .5f, 1.f, }, { -.5f, -.5f, .5f, 1.f, }, }; glm::vec4 vertices_world[ 4 ]; for( int i = 0; i < 4; ++i ){ vertices_world[ i ] = transform.T() * vertices[ i ]; } glm::vec3 v01( vertices_world[ 1 ] - vertices_world[ 0 ] ); glm::vec3 v03( vertices_world[ 2 ] - vertices_world[ 0 ] ); glm::vec3 v04( vertices_world[ 3 ] - vertices_world[ 0 ] ); area = 0.f; area += glm::length( glm::cross( v01, v03 ) ); area += glm::length( glm::cross( v03, v04 ) ); area += glm::length( glm::cross( v04, v01 ) ); area *= 2.f; }
void MainWindow::autoMeshInternal(TriangleListPtr trianglesFront, TriangleListPtr trianglesBack, struct predgparam3f_s *param, double targetRadius, int component, double minU, double maxU, double minV, double maxV, int maxSubdivisions, int subdivision) { struct spin3f_s sp00, sp01, sp10, sp11; predgparam3f_eval(&sp00, param, minU, minV, component); predgparam3f_eval(&sp01, param, minU, maxV, component); predgparam3f_eval(&sp10, param, maxU, minV, component); predgparam3f_eval(&sp11, param, maxU, maxV, component); if (subdivision == maxSubdivisions || (projectedDistance(&sp00, &sp01) <= targetRadius && projectedDistance(&sp00, &sp10) <= targetRadius && projectedDistance(&sp00, &sp11) <= targetRadius && projectedDistance(&sp01, &sp10) <= targetRadius && projectedDistance(&sp01, &sp11) <= targetRadius && projectedDistance(&sp10, &sp11) <= targetRadius)) { QVector3D v00(sp00.s12 / (1 - sp00.s0), sp00.s23 / (1 - sp00.s0), sp00.s31 / (1 - sp00.s0)); QVector3D v01(sp01.s12 / (1 - sp01.s0), sp01.s23 / (1 - sp01.s0), sp01.s31 / (1 - sp01.s0)); QVector3D v10(sp10.s12 / (1 - sp10.s0), sp10.s23 / (1 - sp10.s0), sp10.s31 / (1 - sp10.s0)); QVector3D v11(sp11.s12 / (1 - sp11.s0), sp11.s23 / (1 - sp11.s0), sp11.s31 / (1 - sp11.s0)); trianglesFront->push_back(Triangle(v00, v01, v11)); trianglesFront->push_back(Triangle(v00, v11, v10)); trianglesBack->push_back(Triangle(v00, v11, v01)); trianglesBack->push_back(Triangle(v00, v10, v11)); } else { autoMeshInternal(trianglesFront, trianglesBack, param, targetRadius, component, minU, minU + 0.5 * (maxU - minU), minV, minV + 0.5 * (maxV - minV), maxSubdivisions, subdivision + 1); autoMeshInternal(trianglesFront, trianglesBack, param, targetRadius, component, minU, minU + 0.5 * (maxU - minU), minV + 0.5 * (maxV - minV), maxV, maxSubdivisions, subdivision + 1); autoMeshInternal(trianglesFront, trianglesBack, param, targetRadius, component, minU + 0.5 * (maxU - minU), maxU, minV, minV + 0.5 * (maxV - minV), maxSubdivisions, subdivision + 1); autoMeshInternal(trianglesFront, trianglesBack, param, targetRadius, component, minU + 0.5 * (maxU - minU), maxU, minV + 0.5 * (maxV - minV), maxV, maxSubdivisions, subdivision + 1); } }
double MQuadrangle::etaShapeMeasure() { double AR = 1;//(minEdge()/maxEdge()); SVector3 v01 (_v[1]->x()-_v[0]->x(),_v[1]->y()-_v[0]->y(),_v[1]->z()-_v[0]->z()); SVector3 v12 (_v[2]->x()-_v[1]->x(),_v[2]->y()-_v[1]->y(),_v[2]->z()-_v[1]->z()); SVector3 v23 (_v[3]->x()-_v[2]->x(),_v[3]->y()-_v[2]->y(),_v[3]->z()-_v[2]->z()); SVector3 v30 (_v[0]->x()-_v[3]->x(),_v[0]->y()-_v[3]->y(),_v[0]->z()-_v[3]->z()); SVector3 a = crossprod(v01,v12); SVector3 b = crossprod(v12,v23); SVector3 c = crossprod(v23,v30); SVector3 d = crossprod(v30,v01); double sign = 1.0; if (dot(a,b) < 0 || dot(a,c) < 0 || dot(a,d) < 0 )sign = -1; // FIXME ... // if (a.z() > 0 || b.z() > 0 || c.z() > 0 || d.z() > 0) sign = -1; double a1 = 180 * angle3Vertices(_v[0], _v[1], _v[2]) / M_PI; double a2 = 180 * angle3Vertices(_v[1], _v[2], _v[3]) / M_PI; double a3 = 180 * angle3Vertices(_v[2], _v[3], _v[0]) / M_PI; double a4 = 180 * angle3Vertices(_v[3], _v[0], _v[1]) / M_PI; a1 = std::min(180.,a1); a2 = std::min(180.,a2); a3 = std::min(180.,a3); a4 = std::min(180.,a4); double angle = fabs(90. - a1); angle = std::max(fabs(90. - a2),angle); angle = std::max(fabs(90. - a3),angle); angle = std::max(fabs(90. - a4),angle); return sign*(1.-angle/90) * AR; }
int Poly::getObtuseCorner() const { AVec2 v01(point[1]-point[0]), v02(point[2]-point[0]), v12(point[2]-point[1]); if(v01.dot(v02) < 0) return 0; v01 *= -1; if(v01.dot(v12) < 0) return 1; v12 *= -1; v02 *= -1; if(v02.dot(v12) < 0) return 2; return -1; }
Real Pyramid5::volume () const { // The pyramid with a bilinear base has volume given by the // formula in: "Calculation of the Volume of a General Hexahedron // for Flow Predictions", AIAA Journal v.23, no.6, 1984, p.954- Node * node0 = this->get_node(0); Node * node1 = this->get_node(1); Node * node2 = this->get_node(2); Node * node3 = this->get_node(3); Node * node4 = this->get_node(4); // Construct Various edge and diagonal vectors Point v40 ( *node0 - *node4 ); Point v13 ( *node3 - *node1 ); Point v02 ( *node2 - *node0 ); Point v03 ( *node3 - *node0 ); Point v01 ( *node1 - *node0 ); // Finally, ready to return the volume! return (1./6.)*(v40*(v13.cross(v02))) + (1./12.)*(v02*(v01.cross(v03))); }
/** * @TODO: liczyc przeciecia odcinkow z kolkiem o promieniu aktora i z odcinkami miedzy nodami */ bool AIMap::insideObstacle(float x, float y) { bool ret2 = false; for(int i = 0; i < map_obstacles.size(); i++) { bool ret = true; std::vector<std::pair<float, float> > vertices = map_obstacles[i].vertex; slm::vec2 v01(vertices.back().first - vertices.front().first,vertices.back().second - vertices.front().second); slm::vec2 v02(vertices.back().first - x,vertices.back().second - y); if(slm::dot(v01,v02) < 0) ret = false; for(int j = 1; j < vertices.size(); j++) { slm::vec2 v1(vertices[j-1].first - vertices[j].first,vertices[j-1].second - vertices[j].second); slm::vec2 v2(vertices[j-1].first - x,vertices[j-1].second - y); if(slm::dot(v1,v2) < 0) ret = false; } if(ret) ret2 = true; } return ret2; }
bool Vec2::IsInClockwiseDirection( const Vec2& p0, const Vec2& p1, const Vec2& p2 ) { Vec3 v02( p2 - p0 ); Vec3 v01( p1 - p0 ); return Vec3( v02 ).Cross( Vec3( v01 ) ).z >= 0.f; }
void MainWindow::simpleMesh(TriangleListPtr trianglesFront, TriangleListPtr trianglesBack, struct predgparam3f_s *param, double radius) { int number_of_components = predgparamtype3f_components(param->t); for (int c = 0; c < number_of_components; ++c) { for (double pu = 0; pu < 1 - radius; pu += radius) for (double pv = 0; pv < 1 - radius; pv += radius) { struct spin3f_s sp00, sp01, sp10, sp11; predgparam3f_eval(&sp00, param, pu, pv, c); predgparam3f_eval(&sp01, param, pu, pv + radius, c); predgparam3f_eval(&sp10, param, pu + radius, pv, c); predgparam3f_eval(&sp11, param, pu + radius, pv + radius, c); QVector3D v00(sp00.s12 / (1 - sp00.s0), sp00.s23 / (1 - sp00.s0), sp00.s31 / (1 - sp00.s0)); QVector3D v01(sp01.s12 / (1 - sp01.s0), sp01.s23 / (1 - sp01.s0), sp01.s31 / (1 - sp01.s0)); QVector3D v10(sp10.s12 / (1 - sp10.s0), sp10.s23 / (1 - sp10.s0), sp10.s31 / (1 - sp10.s0)); QVector3D v11(sp11.s12 / (1 - sp11.s0), sp11.s23 / (1 - sp11.s0), sp11.s31 / (1 - sp11.s0)); trianglesFront->push_back(Triangle(v00, v01, v11)); trianglesFront->push_back(Triangle(v00, v11, v10)); trianglesBack->push_back(Triangle(v00, v11, v01)); trianglesBack->push_back(Triangle(v00, v10, v11)); } // last u for (double pu = 0; pu < 1 - radius; pu += radius) { struct spin3f_s sp00, sp01, sp10, sp11; predgparam3f_eval(&sp00, param, pu, 1.0 - radius, c); predgparam3f_eval(&sp01, param, pu, 1.0, c); predgparam3f_eval(&sp10, param, pu + radius, 1.0 - radius, c); predgparam3f_eval(&sp11, param, pu + radius, 1.0, c); QVector3D v00(sp00.s12 / (1 - sp00.s0), sp00.s23 / (1 - sp00.s0), sp00.s31 / (1 - sp00.s0)); QVector3D v01(sp01.s12 / (1 - sp01.s0), sp01.s23 / (1 - sp01.s0), sp01.s31 / (1 - sp01.s0)); QVector3D v10(sp10.s12 / (1 - sp10.s0), sp10.s23 / (1 - sp10.s0), sp10.s31 / (1 - sp10.s0)); QVector3D v11(sp11.s12 / (1 - sp11.s0), sp11.s23 / (1 - sp11.s0), sp11.s31 / (1 - sp11.s0)); trianglesFront->push_back(Triangle(v00, v01, v11)); trianglesFront->push_back(Triangle(v00, v11, v10)); trianglesBack->push_back(Triangle(v00, v11, v01)); trianglesBack->push_back(Triangle(v00, v10, v11)); } // last v for (double pv = 0; pv < 1 - radius; pv += radius) { struct spin3f_s sp00, sp01, sp10, sp11; predgparam3f_eval(&sp00, param, 1.0 - radius, pv, c); predgparam3f_eval(&sp01, param, 1.0 - radius, pv + radius, c); predgparam3f_eval(&sp10, param, 1.0, pv, c); predgparam3f_eval(&sp11, param, 1.0, pv + radius, c); QVector3D v00(sp00.s12 / (1 - sp00.s0), sp00.s23 / (1 - sp00.s0), sp00.s31 / (1 - sp00.s0)); QVector3D v01(sp01.s12 / (1 - sp01.s0), sp01.s23 / (1 - sp01.s0), sp01.s31 / (1 - sp01.s0)); QVector3D v10(sp10.s12 / (1 - sp10.s0), sp10.s23 / (1 - sp10.s0), sp10.s31 / (1 - sp10.s0)); QVector3D v11(sp11.s12 / (1 - sp11.s0), sp11.s23 / (1 - sp11.s0), sp11.s31 / (1 - sp11.s0)); trianglesFront->push_back(Triangle(v00, v01, v11)); trianglesFront->push_back(Triangle(v00, v11, v10)); trianglesBack->push_back(Triangle(v00, v11, v01)); trianglesBack->push_back(Triangle(v00, v10, v11)); } // last uv { struct spin3f_s sp00, sp01, sp10, sp11; predgparam3f_eval(&sp00, param, 1.0 - radius, 1.0 - radius, c); predgparam3f_eval(&sp01, param, 1.0 - radius, 1.0, c); predgparam3f_eval(&sp10, param, 1.0, 1.0 - radius, c); predgparam3f_eval(&sp11, param, 1.0, 1.0, c); QVector3D v00(sp00.s12 / (1 - sp00.s0), sp00.s23 / (1 - sp00.s0), sp00.s31 / (1 - sp00.s0)); QVector3D v01(sp01.s12 / (1 - sp01.s0), sp01.s23 / (1 - sp01.s0), sp01.s31 / (1 - sp01.s0)); QVector3D v10(sp10.s12 / (1 - sp10.s0), sp10.s23 / (1 - sp10.s0), sp10.s31 / (1 - sp10.s0)); QVector3D v11(sp11.s12 / (1 - sp11.s0), sp11.s23 / (1 - sp11.s0), sp11.s31 / (1 - sp11.s0)); trianglesFront->push_back(Triangle(v00, v01, v11)); trianglesFront->push_back(Triangle(v00, v11, v10)); trianglesBack->push_back(Triangle(v00, v11, v01)); trianglesBack->push_back(Triangle(v00, v10, v11)); } } }