odległość punktów

0

pomocy proszę :)

jak zmusić poniższe do poprawnego działania? jeśli wczytam po int main wszystkie punkty ręcznie a.x,a.y,a.z, b.x,b.y,b.z to liczy dobrze, a tak jak poniżej nie działa poprawnie liczenie odległości

#include <math.h>
#include <iostream>

using namespace std;

struct Punkt {
    int x, y,z;
};

 struct Punkt a, b;


double liczOdleglosc(struct Punkt a, struct Punkt b)
{
    double odleglosc;
    odleglosc = sqrt((a.x - b.x) * (a.x - b.x) + (a.y-b.y) *(a.y-b.y));
    return odleglosc;
}

void wczytaj(Punkt pkt)

{
    
     cout<<"Wczytaj x: ";
  cin>>pkt.x;
     cout<<"Wczytaj y: ";
  cin>>pkt.y;
    cout<<"Wczytaj z: ";
  cin>>pkt.z;
   
  
}


int main()
{
 
    
   wczytaj(a);
    wczytaj(b);
    
    
    cout<<"Odległość A i B: "<<liczOdleglosc(a, b);


    return 0;
}
0

A może zamiast tak:
double liczOdleglosc(struct Punkt a, struct Punkt b)
to tak
double liczOdleglosc(struct Punkt& a, struct Punkt& b)

A ponadto popraw to (literówka przy przepisywaniu?):
odleglosc = sqrt((a.x - b.x) (a.x - b.x) + (a.y-b.y) (a.y-b.y));
na
odleglosc = sqrt((a.x - b.x)*(a.x - b.x) + (a.y-b.y)*(a.y-b.y));

oraz to:
#include <math.h>
na
#include <cmath>

0
ReallyGrid napisał(a):

a może zamiast tak:
double liczOdleglosc(struct Punkt a, struct Punkt b)
to tak
double liczOdleglosc(struct Punkt& a, struct Punkt& b)

i popraw to:
odleglosc = sqrt((a.x - b.x) (a.x - b.x) + (a.y-b.y) (a.y-b.y));
na
odleglosc = sqrt((a.x - b.x)*(a.x - b.x) + (a.y-b.y)*(a.y-b.y));

  • tam było przed wklejeniem, musiało gdzieś przy wklejaniu zniknąć, po zmianie na double liczOdleglosc(struct Punkt& a, struct Punkt& b), wciąż wychodzi wynik 0
0

A dlaczego masz tak:
sqrt((a.x - b.x) (a.x - b.x) + (a.y-b.y) (a.y-b.y));
skoro struktura ma 3 zmienne? Odległość w 3D w takim przypadku to:
sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y) + (a.z - b.z)*(a.z - b.z));
Zmiennej z się nie liczy? :P

0
ReallyGrid napisał(a):

A dlaczego masz tak:
sqrt((a.x - b.x) (a.x - b.x) + (a.y-b.y) (a.y-b.y));
skoro struktura ma 3 zmienne? Odległość w 3D w takim przypadku to:
sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y) + (a.z - b.z)*(a.z - b.z));
Zmiennej z się nie liczy? :P

już się w tych wersjach pogubiłem i gdzieś zaginęło w akcji, ale było po drodze :) co nie zmienia faktu że wychodzi 0 :)

0

Słuchaj, ja już też się pogubiłem. Mówię, gdzie masz błędy, Ty odpowiadasz, że to jest tylko zniknęło przy przepisywaniu.
Po pierwsze: to wklej jeszcze raz cały kod tak jak wygląda w pliku (najlepiej poczciwą metodą Kopiuj-Wklej) bo inaczej się nie dogadamy.
Po drugie: umieść go jako kod C++ a nie jako zwykły tekst bo czytać się tego nie daje.
Po trzecie: umieść odpowiednie tabulacje.

0

jeszcze raz cały kod

#include <math.h>
#include <iostream>

using namespace std;

struct Punkt {
    int x, y,z;
};

 struct Punkt a, b;


void wczytaj(Punkt pkt)


{
    
     cout<<"Wczytaj x: ";
  cin>>pkt.x;
     cout<<"Wczytaj y: ";
  cin>>pkt.y;
    cout<<"Wczytaj z: ";
  cin>>pkt.z;
  
 }
 
 double liczOdleglosc(struct Punkt a, struct Punkt b)
{
    double odleglosc;
    odleglosc = sqrt(pow(b.x - a.x, 2) +  
                pow(b.y - a.y, 2) +  
                pow(b.z - a.z, 2) * 1.0); 
    return odleglosc;
}


int main()

{
    
    
   wczytaj(a);
    wczytaj(b);
  
    
    cout<<"Odległość a i b: "<<liczOdleglosc(a, b);


    return 0;
}
0

Dopisz w końcu te referencje
double liczOdleglosc(Punkt& a, Punkt& b)

I jak wczytujesz to też użyj referencji bo chcesz w końcu wczytać do pierwotnych obiektów a nie do kopii, które znikają po wyjściu z funkcji. Czyli popraw jeszcze to:
void wczytaj(Punkt pkt)
na
void wczytaj(Punkt& pkt)

--- Edit ---
Trochę przesadziłem że musisz mieć
double liczOdleglosc(Punkt& a, Punkt& b)
Przy tym liczeniu odległości akurat funkcja liczOdleglosc nie wymaga podania argumentów przez referencje, co nie znaczy że nie jest to sposób zalecany.

0

#include <math.h>
#include <iostream>

using namespace std;

struct Punkt {
int x, y,z;
};

struct Punkt a, b;

void wczytaj(Punkt pkt)

{

 cout<<"Wczytaj x: ";

cin>>pkt.x;
cout<<"Wczytaj y: ";
cin>>pkt.y;
cout<<"Wczytaj z: ";
cin>>pkt.z;

}

double liczOdleglosc(Punkt& a, Punkt& b)
{
double odleglosc;
odleglosc = sqrt(pow(b.x - a.x, 2) +
pow(b.y - a.y, 2) +
pow(b.z - a.z, 2) * 1.0);
return odleglosc;
}

int main()

{

wczytaj(a);
wczytaj(b);

cout<<"Odległość a i b: "<<liczOdleglosc(a, b);


return 0;

}

0

co wkleję to formatowanie ginie

0

Dobra, nieważne.
Tak jak napisałem referencje z liczOdleglosc nie są konieczne (ale zalecane). Natomiast dodaj koniecznie referencję do void wczytaj(Punkt& pkt) i wszystko zagra jak powinno :)

0

Przepraszam za niepoprawne wklejenie bez formatowania odpowiedniego, dziękuję za pomoc, już działa poprawnie

0
ReallyGrid napisał(a):

Dziękuję również za uwagę o #include<math.h>, poprawiłem, tak, już wiem dlaczego

1 użytkowników online, w tym zalogowanych: 0, gości: 1