Gå til innhold

Todimensjonale vektorer i c++


Anbefalte innlegg

Hei og god morgen! :)

 

Jobber med en oppgave nå som omhandler vektor- og matrisesamhandling.

Jeg har aldri vært borti vektorer i c++ før, og har litt problemer med å forstå hvordan jeg skal gjøre oppgaven, så tenkte jeg skulle spørre om hjelp her.

 

Oppgaven går som følger:

Lag ei klasse Vector2 som held ein to-dimensjonal vektor.

Forsikre deg om at designet ditt følgjar OOP-konvensjonane angåande innkapsling (encapsulation),

og skriv nødvendige/passande get- og set-funksjonane.

 

Blir det riktig å skrive en todimensjonal vektor som

vector< vector<int> > name?

 

Isåfall vil klassen se slik ut?

#include <vector>
class Vector2{
private:
vector < vector<int> > name
public:
Vector2();
double setValue();
void getValue();
..
..
..
};

Hvordan vil isåfall get- og set-funksjonene se ut for en slik vektor?

 

Oppgaven fortsetter så slik:

Implementer følgjande medlemsfunksjonar:

- Returnerer dot-produktet mellom this og rightHandSide

double dot(const Vector2 &rightHandSide) const;

 

- Returnerer den kvadrerte lengden av vektoren

double lengthSquared() const;

 

- Returnerer lengden av vektoren. Kvadratrota av verdien kan reknast ut med funksjonen sqrt(double) som finst i <cmath> headeren.

double length() const;

 

Hint: Du kan gjenbruke dot-funksjonen for å rekne ut lengthSquared, og gjenbruke lengthSquared for å rekne ut length().

 

Hva menes med "this" og "rightHandSide", hvor kommer disse verdiene fra?

Noen som kan hjelpe meg med å sette opp disse funksjonene?

Lenke til kommentar
Videoannonse
Annonse

#include <vector>
class Vector2{
private:
double elements [2];
public:
Vector2();
double setValue();
void getValue();

Prøv det. Slik jeg skjønte det er det ingen grunn til å bruke vector til vektoren. Da skal get og set bare jobbe på arrayet elements.

Lenke til kommentar

Hva menes med "this" og "rightHandSide", hvor kommer disse verdiene fra?

Noen som kan hjelpe meg med å sette opp disse funksjonene?

 

dot er en medlemsfunksjon til Vector2, som tar ett argument. At det er en medlemsfunksjon betyr at du kan kalle den som a.dot(b), hvor a og b er Vektor2. Da tar "this" automatisk verdien a. b er da det som i prototypen heter righthandside.

Lenke til kommentar

dot er en medlemsfunksjon til Vector2, som tar ett argument. At det er en medlemsfunksjon betyr at du kan kalle den som a.dot(b), hvor a og b er Vektor2. Da tar "this" automatisk verdien a. b er da det som i prototypen heter righthandside.

 

Betyr det at jeg kan skrive

 

double Vector2::dot(const Vector2 &rightHandSide) const{

return (this[0]*rightHandSide[0] + this[1]*rightHandSide[1]);

}

 

for et skalarprodukt mellom 2 todimensjonale vektorer?

Lenke til kommentar

Ok her er koden jeg har så langt:

 

Headeren:

class Vector2{
private:
 double vector[2];
public:
 Vector2();
 Vector2(double A, double B);
 void setValue(int index, double value);
 double getValue(int index) const;
 double dot(const Vector2 &rightHandSide) const;
 double lengthSquared() const;
 double length() const;
};

 

Medlemsfunksjonene:

Vector2::Vector2(){}
Vector2::Vector2(double A, double B){
vector[0] = A;
vector[1] = B;
}
double Vector2::getValue(int index) const{
return vector[index];
}
void Vector2::setValue(int index, double value){
vector[index] = value;
}
double Vector2::dot(const Vector2 &rightHandSide) const{
return (this[0]*rightHandSide[0] + this[1]*rightHandSide[1]);

 

Prøver så å lage to vektorer og regne ut skalarproduktet av dem på følgende måte:

void part3(){
Vector2 vector1;
vector1.setValue(0,1);
vector1.setValue(1,2);
Vector2 vector2;
vector2.setValue(0,2);
vector2.setValue(1,4);
cout << vector1.dot(vector2);
}

 

Får følgende feilmelding:

error C2676: binary '[' : 'const Vector2' does not define this operator or a conversion to a type acceptable to the predefined operator
error C2676: binary '[' : 'const Vector2' does not define this operator or a conversion to a type acceptable to the predefined operator
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

 

Følgende linje får feilmeldingen:

return (this[0]*rightHandSide[0] + this[1]*rightHandSide[1]);

 

Feilmeldingen peker på hakeparantesene [ rett etter rightHandSide

 

Hva gjør jeg feil? Ser det andre greit ut? Har ikke overlagret noe.

Endret av ole1991
Lenke til kommentar

 

template<typename TScalar>struct vector2
{
 private:
   TScalar x;
   TScalar y;
 public:
   vector2() : x(0), y(0)
   {
   }

   vector2(const TScalar x, const TScalar y) : x(x), y(y)
   {
   }
   const TScalar getX() const { return x; }
   const TScalar getY() const { return y; }
   void setX(const TScalar value) { x = value; }
   void setY(const TScalar value) { y = value; }

   TScalar& operator [](const int index)
   {
     if(~(index | 1)) // Kun 0 og 1 er gylidge indekser. Gi exception dersom noen andre bit er satt.
       throw "Index out of bounds.";
     return ((TScalar*)&x)[index];
   }

   const vector2<TScalar> operator + (const vector2<TScalar>& rhs) const
   {
     return vector2<TScalar>(x + rhs.x, y + rhs.y);
   }

   const vector2<TScalar> operator - (const vector2<TScalar>& rhs) const
   {
     return vector2<TScalar>(x - rhs.x, y - rhs.y);
   }

   const vector2<TScalar> operator * (const vector2<TScalar>& rhs) const
   {
     return vector2<TScalar>(x * rhs.x, y * rhs.y);
   }

   const vector2<TScalar> operator / (const vector2<TScalar>& rhs) const
   {
     return vector2<TScalar>(x / rhs.x, y / rhs.y);
   }

   const double magnitude() const
   {
     return sqrt((double)(x * x + y * y));
   }

   operator vector2<double>() const
   {
     return vector2<double>((double)x, (double)y);
   }

   operator vector2<float>() const
   {
     return vector2<float>((float)x, (float)y);
   }

   double dot(const vector2<TScalar>& rhs) const
   {
     return x * rhs.x + y * rhs.y;
   }

   static const double distance(const vector2<TScalar>& lhs, const vector2<TScalar>& rhs)
   {
     return (rhs - lhs).magnitude();
   }
};

 

 

edit forumet herpa formateringen

Endret av GeirGrusom
  • Liker 1
Lenke til kommentar

double Vector2::dot(const Vector2 &rightHandSide) const{
return (vector[0]*rightHandSide[0] + vector[1]*rightHandSide[1]);
}

void part3(){
Vector2 vector;
vector.setValue(0,1);
vector.setValue(1,2);
Vector2 vector2;
vector2.setValue(0,2);
vector2.setValue(1,4);
cout << vector.dot(vector2);
}

 

Merk at jeg har kalt arrayet vector og ikke elements.

Dette gir fortsatt samme feilmelding:

error C2676: binary '[' : 'Vector2' does not define this operator or a conversion to a type acceptable to the predefined operator

 

Noen forslag?

Lenke til kommentar

double Vector2::dot(const Vector2 &rightHandSide) const{
return (this->vector[0]*rightHandSide.vector[0] + this->vector[1]*rightHandSide.vector[1]);
}

 

Løste seg når jeg gjorde dette. Takk for hjelpen :)

Endret av ole1991
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...