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