Esempio n. 1
0
vector<intn> Quantize(
    const vector<floatn>& points, const Resln& resln,
    const BoundingBox<floatn>* customBB, const bool clamped) {
  if (points.empty())
    return vector<intn>();

  BoundingBox<floatn> bb;
  if (customBB) {
    bb = *customBB;
  } else {
    for (const floatn& p : points) {
      bb(p);
    }
  }
  const float dwidth = bb.max_size();
  if (dwidth == 0) {
    vector<intn> ret;
    ret.push_back({0,0});
    return ret;
  }

  // Quantize points to integers
  vector<intn> qpoints(points.size());
  for (int i = 0; i < points.size(); ++i) {
    const floatn& p = points[i];
    const intn q = Quantize(p, resln, bb, dwidth, clamped);
    qpoints[i] = q;
  }
  
  return qpoints;
}
void QMapGraphicsScene::mouseReleaseEvent ( QGraphicsSceneMouseEvent * mouseEvent )
{
    if(!w || w->map_image.empty())
        return;

    if (sel_point.size() > 2)
    {
        QImage bitmap(qimage.width(),qimage.height(),QImage::Format_Mono);
        {
            QPainter paint(&bitmap);
            paint.setBrush(Qt::black);
            paint.drawRect(0,0,bitmap.width(),bitmap.height());
            paint.setBrush(Qt::white);
            std::vector<QPoint> qpoints(sel_point.size());
            for(unsigned int index = 0;index < sel_point.size();++index)
                qpoints[index] = QPoint(sel_point[index][0],sel_point[index][1]);
            paint.drawPolygon(&*qpoints.begin(),qpoints.size() - 1);
        }
        QImage draw_map = bitmap.scaled(w->map_mask.width(),w->map_mask.height());
        for (tipl::pixel_index<2>index(w->map_mask.geometry());index < w->map_mask.size();++index)
            if(QColor(draw_map.pixel(index.x(),index.y())).red() > 64)
            {
                if(right_button)
                    w->map_mask[index.index()] = 0;
                else
                    w->map_mask[index.index()] = 1;
            }
        update();
    }
    else
    {
        int x = w->dim[0]*mouseEvent->scenePos().x()/(sceneRect().width()-1);
        int y = w->dim[1]*mouseEvent->scenePos().y()/(sceneRect().height()-1);
        main_scene.move_to(x,y);
    }
    sel_point.clear();







}
bool VerificacionNodosVecinosColapsoRegion::checkInterseccionNodo(Malla* malla, int indNodo){
	assert(malla->getNodo(indNodo)!=NULL);

			Nodo* nodoActual=malla->getNodo(indNodo);

			//Definimos los puntos que componen el segmento de proyeccion del nodo.
			Punto PuntoProyecNodoActual=  Punto(	nodoActual->getPunto().getX()+nodoActual->getNormal().getPunto().getX()*val*nodoActual->getConcentracion(),
													nodoActual->getPunto().getY()+nodoActual->getNormal().getPunto().getY()*val*nodoActual->getConcentracion(),
													nodoActual->getPunto().getZ()+nodoActual->getNormal().getPunto().getZ()*val*nodoActual->getConcentracion());
			Vect q=Vect(nodoActual->getPunto());
			Vect r=Vect(PuntoProyecNodoActual);

			if(q == r) // El nodo actual no se desplaza
                return false;

			//Revisamos cada una de las caras vecinas al nodo.
			vector<int> indCarasVecinas=nodoActual->getCaras();
			for (int indCara=0; indCara<(int)indCarasVecinas.size(); indCara++){
				Cara* caraVecina=malla->getCara(indCarasVecinas[indCara]);
				vector<int> puntos=caraVecina->getPuntosDistintos(indNodo);

				//Formar paredes del cilindro que rodea la proyeccion (una por cada arco (de la cara) no incidente en indNodo)
				for (int j=0; j<caraVecina->getNumElem()-2;++j) {
                    int indPuntoA=puntos[j];
                    int indPuntoB=puntos[j+1];
                    Nodo* NodoA=malla->getNodo(indPuntoA);
                    Nodo* NodoB=malla->getNodo(indPuntoB);
                    Punto PuntoProyecA=Punto(NodoA->getPunto().getX()+NodoA->getNormal().getPunto().getX()*val*NodoA->getConcentracion(),
                                             NodoA->getPunto().getY()+NodoA->getNormal().getPunto().getY()*val*NodoA->getConcentracion(),
                                             NodoA->getPunto().getZ()+NodoA->getNormal().getPunto().getZ()*val*NodoA->getConcentracion());
                    Punto PuntoProyecB=Punto(NodoB->getPunto().getX()+NodoB->getNormal().getPunto().getX()*val*NodoB->getConcentracion(),
                                             NodoB->getPunto().getY()+NodoB->getNormal().getPunto().getY()*val*NodoB->getConcentracion(),
                                             NodoB->getPunto().getZ()+NodoB->getNormal().getPunto().getZ()*val*NodoB->getConcentracion());

                    AdapterComputationalGeometry adapter;
                    char resultadoInterseccion;

                    if(PuntoProyecA != NodoA->getPunto()) { // Si A se desplaza

                        //Chequeamos interseccion con el primer triangulo
                        Vect triangulo1[3];
                        triangulo1[0]=Vect(NodoA->getPunto());
                        triangulo1[1]=Vect(PuntoProyecA);
                        triangulo1[2]=Vect(PuntoProyecB);
                        Vect qpoints(q.getPunto());
                        Vect rpoints(r.getPunto());

                        resultadoInterseccion=adapter.SegTriInt(triangulo1,qpoints,rpoints);

                        if (resultadoInterseccion!='0'){
                            return true;
                            }
                    }

                    if(PuntoProyecB != NodoB->getPunto()) { // Si B se desplaza

                        //Chequeamos interseccion con el segundo triangulo
                        Vect triangulo2[3];
                        triangulo2[0]=Vect(NodoB->getPunto());
                        triangulo2[1]=Vect(NodoA->getPunto());
                        triangulo2[2]=Vect(PuntoProyecB);
                        Vect q2points(q.getPunto());
                        Vect r2points(r.getPunto());

                        resultadoInterseccion=adapter.SegTriInt(triangulo2,q2points,r2points);

                        if (resultadoInterseccion!='0'){
                            return true;
                            }
                        }
                    }
				}

	return false;
	}