Problema con potenziale

di il
7 risposte

Problema con potenziale

Buona sera, io devo fare un programma in c++ usando delle classi. L'obiettivo e far muovere un “robot” da una posizione iniziale ad una finale calcolando il potenziale attrattivo. Il problema è che il mio funziona solo se i dati sono in diagonale altrimenti no. Allego file Robot.cpp, oltre a questo ho creato un'altra classe Cordinate.

#include "Robot.h"
#include "Cordinate.h"

#include <iostream>
#include <cmath>
#include <vector>
#include <iterator>
using std::vector;
#include <array>
using std::array;
using std::min;
using std::max;
using std::cout;
using std::endl;
#include <algorithm>
using std::min_element;
using std::distance;
#define k 10

Robot::Robot()
    : p_robot_{0, 0}, goal_{0, 0}, passo_{0}, ccvicine_{}, pcelle_{0, 0, 0, 0, 0, 0, 0, 0}, track_{}
{}

Robot::Robot(Cordinate p_robot, Cordinate goal, int passo)
    : p_robot_(p_robot), goal_(goal), passo_(passo)

{}
void Robot::sccvicine(){
    ccvicine_[0] = Cordinate(p_robot().x() + passo(), p_robot().y() + passo());         //(x+1, y+1)
    ccvicine_[1] = Cordinate(p_robot().x(), p_robot().y() + passo());                   //(x. y+1)
    ccvicine_[2] = Cordinate(p_robot().x() - passo(), p_robot().y() + passo());         //(x-1, y+1)
    ccvicine_[3] = Cordinate(p_robot().x() - passo(), p_robot().y());                   //(x-1, y)
    ccvicine_[4] = Cordinate(p_robot().x() - passo(), p_robot().y() - passo());         //(x-1, y-1)
    ccvicine_[5] = Cordinate(p_robot().x(), p_robot().y() - passo());                   //(x, y-1)
    ccvicine_[6] = Cordinate(p_robot().x() + passo(), p_robot().y() - passo());         //(x+1, y-1)
    ccvicine_[7] = Cordinate(p_robot().x() + passo(), p_robot().y());                   //(x+1, y)
   
}  
         

double Robot::distanza(Cordinate& punto_uno, Cordinate& punto_due){
    double xmin = min (punto_uno.x(), punto_due.x());
    double ymin = min (punto_uno.y(), punto_due.y());
    double xmax = max (punto_uno.x(), punto_due.x());
    double ymax = max (punto_uno.y(), punto_due.y());

    double d = sqrt ((xmax - xmin)*(xmax - xmin) + (ymax - ymin)*(ymax - ymin));
    return d;
}

double Robot::F_att(Cordinate& punto_uno, Cordinate& punto_due){
    double Fatt =(k * distanza(punto_uno, punto_due));
    return Fatt; 
}

void Robot::potenzialecc(){
    for (size_t i=0; i < ccvicine_.size(); ++i)
        pcelle_[i] = F_att(ccvicine_.at(i), goal_);
    
}

void Robot::spostamento(){

     while ((p_robot_.x() != goal_.x()) && (p_robot_.y() != goal_.y())){
        distanza(p_robot_, goal_);
        F_att(p_robot_, goal_);
        sccvicine();
        potenzialecc();
        double *mpotenziale = min_element (std::begin(pcelle_), std::end(pcelle_));      // va solo in diagonale                               
        p_robot_ = ccvicine_[pcelle_[*mpotenziale]];
        track_.push_back(p_robot_);
        cout << track_.back() << endl;
     }
     }

7 Risposte

  • Re: Problema con potenziale

    A “naso” proverei a modificare questa

    while ((p_robot_.x() != goal_.x()) || (p_robot_.y() != goal_.y())){
  • Re: Problema con potenziale

    15/12/2022 - oregon ha scritto:


    A “naso” proverei a modificare questa

    while ((p_robot_.x() != goal_.x()) || (p_robot_.y() != goal_.y())){

    Avevo già provato a fare questo cambio, penso l'errore sia questo “p_robot_ = ccvicine_[pcelle_[*mpotenziale]];” ,

    perché io qui voglio dare alla posizione del robot la posizione della cella vicina con il minor potenziale, ma non so se è corretto scriverlo così.

  • Re: Problema con potenziale

    Credo sia l' AND il problema, perché quando la casella obiettivo si trova in orizzontale o verticale, una delle due coordinate è già soddisfatta (non è diversa) quindi non entra nell'AND. L'OR dovrebbe andare. 

  • Re: Problema con potenziale

    15/12/2022 - Alexv ha scritto:


    Credo sia l' AND il problema, perché quando la casella obiettivo si trova in orizzontale o verticale, una delle due coordinate è già soddisfatta (non è diversa) quindi non entra nell'AND. L'OR dovrebbe andare. 

    Ho provato e non funziona neanche con l'OR. Facendo il debug ho notato che trovo giustamente il potenziale minimo nell'array pcelle_ ma poi sbaglio a dire a quale cella corrisponde tale potenziale dunque penso che  l'errore sia questo: “p_robot_ = ccvicine_[pcelle_[*mpotenziale]];”, il problema è che non ho altre idee su come scriverlo. Anche perchè funziona solo se x ed y hanno la stessa distanza dall'obiettivo altrimenti no.

  • Re: Problema con potenziale

    Ho risolto grazie a tutti

  • Re: Problema con potenziale

    Min_element restituisce un iteratore. Dovresti ricavarne un indice. La funzione std::distance dovrebbe aiutarti. 

  • Re: Problema con potenziale

    Ah ok hai risolto. 

Devi accedere o registrarti per scrivere nel forum
7 risposte