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; }