コード例 #1
0
ファイル: cube.cpp プロジェクト: itoupeter/Computer_Graphics
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;
}
コード例 #2
0
ファイル: mainwindow.cpp プロジェクト: pdobrowo/libcs2
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);
    }
}
コード例 #3
0
ファイル: MQuadrangle.cpp プロジェクト: feelpp/debian-gmsh
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;
}
コード例 #4
0
ファイル: polygon2D.cpp プロジェクト: degarashi/boomstick
		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;
		}
コード例 #5
0
ファイル: cell_pyramid5.C プロジェクト: dknez/libmesh
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)));
}
コード例 #6
0
ファイル: map.cpp プロジェクト: fridek/uj-gamedev-ai-project
/**
 * @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;
}
コード例 #7
0
ファイル: Geometry.cpp プロジェクト: scw000000/Engine
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;
   }
コード例 #8
0
ファイル: mainwindow.cpp プロジェクト: pdobrowo/libcs2
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));
        }
    }
}