Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

21.06.2010, 18:05

Wieso nimmst du nicht einfach ein Array? Du hast ja bereits gesagt der Vektor hat fix 3 Komponenten?
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

21.06.2010, 18:05

Wenn die Performance komplett egal ist kannst du natürlich einen std::vector nehmen. Auch wenn ich deine Beweggründe absolut nicht nachvollziehen kann...

13

21.06.2010, 18:37

ok... ich seh schon... dann mach halt alles selber... nimm ein array und keinen vector und wirf die exception selber..

achja, was muss ich sehn, also ich mit der maus über deine liederliste fahre...
du bist doch offenbar wirkli CG tutor ...
hab cg1/2 grad gmacht(prüfung cg2 fehlt ja no) lg

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

14

21.06.2010, 18:37

ich hab noch nie ne vectorklasse mit nem array für die elemente gesehen.

die einfachste und schnellste variante ist eine struktur. danach eine klasse getter-/setterfunktionen für x, y und z(z.b. wenn du sicher gehen willst dass die variablen keinen ungültigen wert zugewiesen bekommen).

ein array würd ich nur bei einer dynamischen anzahl von dimensionen nutzen.

C-/C++-Quelltext

1
2
3
4
5
6
struct Vector3D{
float x, y, z;

// memberfunktionen und operatorüberladung

}


edit: oder hat das was mit CG zutun?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

15

21.06.2010, 18:44

mh... naja wenn i jetzt getter und setter mach dann ists ja nicht perfekt.

i will später dann einfach mit vektor[0] auf x zugreifen und net mit vektor.get(0)

aber eig is ja wurscht... ich dachte halt nur wenns schon sowas wie index operator überladungen gibt, dann mach ichs so...


nein das ganze thema hat nix mit cg zu tun.
hab nur den echten namen von dot gsehn und hab bemerkt, dass er tutor in einer vo is, die i grad gmacht hab cg(computer graphic)

lg

16

21.06.2010, 18:45

Hm, kannst ja auch das Array union mit den x y z machen.

@NachoMan in C++ Struktur fast gleich Klasse, nur dass bei Struktur alles public ist per Default.
also denk ich, das macht von geschwindigkeit her gar nichts. Wer will kann jetzt noch um die letzten bits kämpfen, indem er die Elemente der Klasse noch richtig sortiert ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

17

21.06.2010, 18:47

vektor.x bzw. vektor.x() ist doch viel schöner und eindeutiger [edit2 ] und sicherer[/edit2 ] als vektor[0].

edit:
@NachoMan in C++ Struktur fast gleich Klasse, nur dass bei Struktur alles public ist per Default.


ist mir schon klar. aber bei einer struktur weiß man gleich dass sie public ist. deswegen sollte man das auch unterscheiden und beides nutzen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

18

21.06.2010, 18:48

ich glaub das is ein bisschen Geschmackssache.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

21.06.2010, 18:49

ok... ich seh schon... dann mach halt alles selber... nimm ein array und keinen vector und wirf die exception selber..

Ich weiß ja nicht für was genau du diesen Vektor verwenden willst aber wie gesagt wenn du z.B. was in Richtung 3D Grafik machen willst wo Performance eine Rolle spielt dann vergiss Exceptions hier. Wenn du mit falschen indices drauf zugreifst gibts einfach undefiniertes Verhalten und fertig. Überleg mal wieviele tausend Zugriffe auf irgendwelche Vektoren pro Sekunde deine fertige Anwendung haben wird und denkt dann nochmal drüber nach ob du da wirklich auch nur ein einzelnes unnötiges if drin haben willst...

vektor.x bzw. vektor.x() ist doch viel schöner und eindeutiger als vektor[0].

Das Problem damit ist aber dass du eben oft (z.B. in irgendwelchen Algorithmen) gerne über einen Index auf die Komponenten zugreifen möchtest. Natürlich kann man sich mit Hacks helfen wie z.B. sowas:

C-/C++-Quelltext

1
2
3
4
5
6
7
struct vector3d
{
  float x, y, z;

  float operator[](int index) const { return (&x)[index]; }
  float& operator[](int index) { return (&x)[index]; }
};


Das wird auf den meisten Compilern/Platformen funktionieren, ist im allgemeinen aber nicht definiert...

achja, was muss ich sehn, also ich mit der maus über deine liederliste fahre...
du bist doch offenbar wirkli CG tutor ...

Schon möglich :D

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (21.06.2010, 18:54)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

21.06.2010, 18:50


die einfachste und schnellste variante ist eine struktur. danach eine klasse getter-/setterfunktionen für x, y und z(z.b. wenn du sicher gehen willst dass die variablen keinen ungültigen wert zugewiesen bekommen).


Klasse und Struktur sind in C++ genau das Selbe (einzigster Unterschied is der default access specificator)...


ein array würd ich nur bei einer dynamischen anzahl von dimensionen nutzen.


Ein Array würd ich vor allem dann nutzen wenn die Größe bei der Compilierzeit bereits bekannt ist:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Vector3D 
{
private:
    float xyz[3];

public:
    float operator[](int idx) const
    {
        assert(idx >= 0 && idx < 3);
        return xyz[idx];
    }

    float& operator[](int idx) 
    {
        assert(idx >= 0 && idx < 3);
        return xyz[idx];
    }
};


Das assert wird im Release-Compilat entfernt. D.h. es findet dort keine Überprüfung mehr statt, falls die Performance ganz kritisch ist.
@D13_Dreinig

Werbeanzeige