Permalänk
Medlem

problems med skalärprodukt

Jopp detta är övningar vi fått av skolan, då man inte får betyg på dessa utan de endast finns till för att man själv skall förstå och lära sig så är det inga problem att jag får hjälp här.

-----------------------------------------------------------
Uppgiften lyder:
"Ö1.4 Skriv en klass Vector3D som representerar en vektor i tre dimensioner. Använd flyttal för privata medlemmar i klassen, representerande x-, y-, resp z-komponenterna. En konstruktor ska initiera ett objekt av klassen med givna värden. En lämplig default-konstruktor ska finnas. Skriv publika medlemsfunktioner för addition, subtraktion, skalärprodukt och vektorprodukt av vektorer, samt för utskrift av en vektorn på formen (x, y, z). Skriv och kör ett testprogram."

det jag redan gjort och kan är:
-skrivit klassen
-använd flyttal för privata medlemmar i klassen....
-konstruktorn är klar
-default konstruktorn är klar

det som är knepigt:
-att skriva dem publika medlemsfunktionerna.
-----------------------------------------------------------

Jag är rätt färsk på c++-programmering så kom helst inte med helt sjukt komplicerade lösningar ;).

Permalänk
Medlem

hm tycker det borde gå med lite forsatser... skulle man kunna få se klassen kanske?

Visa signatur

LAN i stockholmv9
http://www.hazard.nu

Permalänk
Medlem

Vet inte om det är 'rätt', den är iaf inte klar, fattas dessa medlemsfunktioner som jag inte är säker på hur man skriver..

class Vector3d
{
public:
Vector3d()
{
x = y = z = 0;
}
Vector3d(float a, float b, float c)
{
x = a;
y = b;
z = c;
}
Vector3dAdd()
{
}
private:
float x, y, z;
};

Permalänk
Medlem

---- Vector3d.h ---- class Vector3d { ... // Metoden add tar en referens till en konstant vektor // Returnerar summan som en ny vektor Vector3d add(const Vector3d &rhs) const; .... }; ---- Vector3d.cpp ---- Vector3d Vector3d::add(const Vector3d &rhs) const { const float xi = x + rhs.x; const float yi = y + rhs.y; const float zi = z + rhs.z; // Returnera ny vektor initierad med summerade komponenter return Vector3d(xi, yi, zi); } ---- exempel ---- Vector3d A(1, 0, 0), B(0, 1, 0); Vector3d sum = A.add(B); // sum = (1, 1, 0)

Ungefär så går det till, resten får du skriva själv.

Permalänk
Medlem

aah, hänge tom med.. men det där var addition, då vet jag även hur man gör subtraktion och vektorprodukt...

men hur gör man skalärprodukten?, det var ju vinklar o grejjer inblandat läste jag någonstans. Och ska jag bara skriva ut värderna på x, y, z i min printfunktion, eller menar han något annat?

Permalänk
Medlem

Jepp... Du skall nog bara skriva ut värdena inom parantes och med komma, typ (4, 2.4566, 32)

http://home.tnv.mh.se/per-edstrom/interaktiv_matematik/2d-kor...

Som du ser så är skalärprodukten = x1*x2 + y1*y2 + z1*z2

Visa signatur

Man kan inte polera en bajskorv

Permalänk
Medlem

"..." betyder att du får fylla i själv med konstruktorer, medlemmar och vad det nu kan vara. Mao, jag orkade inte kopiera hela klassen.

Permalänk
Medlem

Tack för all hjälp, tänkte bara dubbelkolla med er så att det verkligen blev rätt. Vill ju lära mig det här ;D.

//här kommer min kod
#include <iostream>
using namespace std;

//Classer--------------------------------------
class Vector3d
{
public:
// ////////////////////////
// KONSTRUKTORS///
Vector3d()
{
x = y = z = 0;
}
Vector3d(float a, float b, float c)
{
x = a;
y = b;
z = c;
}
// //////////////////////////////////
// MEDLEMMSFUNKTIONER///
void Vector3dAdd(float a, float b, float c)
{
x += a;
y += b;
z += c;
}
void Vector3dSub(float a, float b, float c)
{
x -= a;
y -= b;
z -= c;
}
void Vector3dMul(float a, float b, float c)
{
x *= a;
y *= b;
z *= c;
}
void Vector3dSka(Vector3d Vector3dNew)
{
x *= Vector3dNew.Vector3dGetx();
y *= Vector3dNew.Vector3dGety();
z *= Vector3dNew.Vector3dGetz();
}
float Vector3dGetx(){ return x; }
float Vector3dGety(){ return y; }
float Vector3dGetz(){ return z; }
void Vector3dPrint()
{
cout << "Vector3d(" << Vector3dGetx() << ", " << Vector3dGety() << ", " << Vector3dGetz() << ")" << endl;
}

private:
float x, y, z;
};

//---------------------------------------------
//---------------------------------------------
int main()
{
Vector3d a(1.3, 0.1, 2.2), b(1, 2, 3);

cout << "Startverde:" << endl;
a.Vector3dPrint();
cout << endl;
cout << "+1,1,1" << endl;
a.Vector3dAdd(1,1,1);
a.Vector3dPrint();
cout << endl;
cout << "-1,1,2" << endl;
a.Vector3dSub(1,1,2);
a.Vector3dPrint();
cout << endl;
cout <<"*3,2,5" << endl;
a.Vector3dMul(3, 2, 5);
a.Vector3dPrint();
cout << endl;
cout << endl << "Skalerprodukten av a och b(1,2,3)." << endl;;
a.Vector3dSka(b);
a.Vector3dPrint();

return 0;
}

EDIT: Hur skriver jag för att få min kodsom Karlsson gjort i ett code "fönster" ?

Permalänk
Medlem

[ code ][ /code ] fast utan mellanslag. Sen så känns det ganska dumt med x,y och z som privata i en vector-klass. Koden blir ju bara ful med getX, getY osv, fast det stod ju i uppgiften att de skulle va privata =/

Permalänk
Medlem

Datagömnng är ett av målen i objektorientering. Tanken är att du ska kunna ändra hur klassen ser ut inuti utan att man ska behöva skriva om alla program som använder klassen. T.ex. om du inte vill beskriva x,y och z med float utan med en struktur av int.

Permalänk
Medlem

Jag vet att det är målet och i många fall bra, men i det här fallet skulle jag hellre ha x, y och z publika.

Permalänk
Medlem

Publika eller inte, är skalärprodukt-funktionen rätt gjort? :>.

Permalänk
Medlem

Det är väldigt vanligt med x,y,z publika i vektorklasser ja.
Och så anser jag att det ska vara
Fast visst, jag idiotförklarar inte dem som säger motsatsen.
Men dessa är också det enda i ett helt projekt (vad jag kommer på nu) som jag anser ska vara publika...
Kommer inte på något mer som jag har publikt iaf
*ehm, förutom ett gäng funktioner*

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av q3maniac
Publika eller inte, är skalärprodukt-funktionen rätt gjort? :>.

Tyvärr verkar den vara lite knas. Jag hade gjort på följande sätt (om vi förenklar lite):

class Vector3d { ... float Vector3dSka(Vector3d v) { return x * v.x + y * v.y + z * v.z; } ... }; --- Exempel --- Vector3d u(1, 0, 0), v(1, 1, 0); float s = u.Vector3dSka(v); // s = 1.0

Dvs, summan av produkterna returneras som float (som Pelle76 förklarade lite längre upp). Ursäkta spoilern men jag kom inte på något bättre sätt att förklara utan att behöva skriva en mindre uppsats.

Sedan måste jag påpeka att din namnkonvention verkar onödigt jobbig. Det finns ingen vettig anledning att döpa alla metoder till Vector3dMetod() när Metod() gott och väl duger. T ex: när du skrivit Vector3dGetX() för femtioelfe gången hade du nog önskat att metoden hette GetX() eller, som jag föredrar, kort och gott x().

Konstruktorn måste däremot ha samma namn som klassen.

Permalänk
Medlem

Eftersom vi pratar om rena matematik objekt så tycker jag du ska överladda operatorerna +-*/ istället för att skriva medlemsfunktioner. Inte nog med att koden blir snyggare och mer lättläst, utan semantiken blir mer som i matematiken.

Sen för övrigt, istället för detta:

void Vector3dSka(Vector3d Vector3dNew)

skriv hellre:

void Vector3dSka(const Vector3d &Vector3dNew)

Det blir snabbare så eftersom bara referens (i praktiken en pekare) skickas snarare än att hela classen kopieras på stacken.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Hummus
Eftersom vi pratar om rena matematik objekt så tycker jag du ska överladda operatorerna +-*/ istället för att skriva medlemsfunktioner. Inte nog med att koden blir snyggare och mer lättläst, utan semantiken blir mer som i matematiken.

Sen för övrigt, istället för detta:

void Vector3dSka(Vector3d Vector3dNew)

skriv hellre:

void Vector3dSka(const Vector3d &Vector3dNew)

Det blir snabbare så eftersom bara referens (i praktiken en pekare) skickas snarare än att hela classen kopieras på stacken.

Aldrig hört talas om överladda, är det något speciellt för c++ eller menade du överlagra?

Permalänk
Medlem

överlagra menar han nog. Det hade jag menat iaf

Visa signatur

Man kan inte polera en bajskorv

Permalänk
Inaktiv

Förslag (struntar i operatoröverlagring, vet inte om ni pysslar med sånt än):
Vore det inte snyggare om man adderade en vektor istället för tre floats?
a.Vector3dAdd(b);
istälelt för:
a.Vector3dAdd(1,2,3);

Koden för detta:

void Vector3dAdd(const Vector3d& b) { x += b.Vector3dGetx(); y += b.Vector3dGety(); z += b.Vector3dGetz(); }

Sen vill jag inte starta krig om OOP nu, men i det här fallet så kan det vara trevligt att ha x, y och z publika. Man kan tycka att det försämrar inkapslingen, fast själv tycker jag att det är väldigt praktiskt i det här fallet. Problemet är väl att läraren kanske inte tycker det

Permalänk
Medlem

Då ska du i så fall berätta för din lärare att fundamentalistisk OOP där allt är objekt och inkapslat är lika galet som det gamla icke OOPade som det skulle ersätta. Finns vissa som går så långt att de vill bygga in heltal och trams i klasser. Finns ingen poäng med det. Poängen med OOP är ju att tvinga sig själv att skriva vettig kod redan från början. Men det finns inget som säger att .getX() är bättre i sig än .x. Har man en vektor så är det ju en matematisk enhet, det är inget man kommer att ha några behov av att kunna ändra i .getX() funktionen i framtiden för att returnera något annat än just x. I min egna vektor-klass jag använder i alla mina projekt så är x,y,z,w publika.

Permalänk
Inaktiv
Citat:

Ursprungligen inskrivet av Hummus
Då ska du i så fall berätta för din lärare att fundamentalistisk OOP där allt är objekt och inkapslat är lika galet som det gamla icke OOPade som det skulle ersätta.

Då jag inte lär mig C++ i skolan så menade jag ingen lärare personligen utan snarare lärare rent allmänt (vilket kan innefatta q3manaics lärare)
Själv kör jag med en "hybrid" i min vektorklass; publika xyz och använder operatorn () som "getter/setter" om man vill kunna använda den i någon form av loop.