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

1

30.03.2010, 21:32

Klasse für Vecktor

Ein guten Abend an alle,

jetzt wo ich mein DirectX-Dialog fertig hab, wollte ich mir die Mathe Sachen wie eine Vectoren Klasse selber programmieren, weil ich dadurch erreichen will das ich weiß wie und warum es so funktioniert, auch wissen möchte was im Hintergrund passiert was ich bie der D3DX-Libary nicht weiß und ich will natürlich mein codestil dadurch verbessern^^ Deshalb wollte ich fragen wie man eine Vector-Klasse am besten umsetzt... Sollte ich es so umsetzen wie in Davids-Buch wo dann auch die ganzen Funktion außerhalb der Klasse sind oder wie soll ich es am besten angehen? Mein bisherige Klasse sieht so aus

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include<cmath> 
class CVector3 
{ 
private: 
    float x, y, z; 
public: 
    CVector3() 
    CVector3(float vx, float vy, float vz); 
    CVector3(const CVector3& v); 
    ~CVector3(); 
    float Length() 
};


Vielen Dank im voraus

Mfg Male

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

30.03.2010, 21:40

Das kann man nicht einfach mal so beantworten. Es gibt ja kein richtig oder falsch in dem Sinne. Ich würde dir vorschlagen, dass du es einfach mal probierst und dann siehst du relativ schnell, was du besser hättest machen können, wenn du deine Klasse oft benutzt.

Aber doch ein paar Tipps:
  • Destruktor wirst du nicht brauchen, da du nur automatische Objekte als Member hast.
  • Überladungen für Operatoren wirst du bestimmt auch gut gebrauchen können (+=, -= usw.)
  • Kreuzprodukt, Skalarprodukt braucht man auch immer mal wieder (wohl eher als freie Funktionen implementieren)

3

30.03.2010, 21:46

Insbesondere beim Programmierstil gibt's keinen besten weg, verscheidene wege haben einfach nur unterschiedliche Vor- und Nachteile, und was man schließlich benutzt, hängt teilweise auch von den persönlichen Vorlieben ab.
Was bei den Vector- und matrixfunktionen Möglichkeiten sind:
  • normale Methoden: möglich, unkompliziert, aber v1.cross(v2) sieht meiner meinung nach einfach furchtbar aus, weil v1 udn v2 ja eigentlich gleichwertig sind - m1.transform(v1) macht also wieder sinn
  • globale/namespace Funktionen: passt imo bei gleichwertigen Operanden ( cross(v1,v2) ), führt einen aber in versuchung, extra einen namespace für die vectorfunktionen zu machen, oder gar die Funktionsnamen mit dem klassennamen zu beginnen, wo dann imo statische methoden die bessere möglichkeit sind
  • statische Methoden: verdeutlichen die Zugehörigkeit zur Klasse, Operanden sind aber gleichwertig

4

30.03.2010, 21:48

Vielen Dank :)

Dann werde ich den Destkrotur kicken... Die Operatoren Überladung hab ich schon implentiert... Mit freien Funktionen ist gemeint das sie außerhalb der Klasse erstellt werden?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

30.03.2010, 21:51

Sie werden unabhängig von der Klasse implementiert ja. Zugriff auf die Member hast du ja sowieso, also brauchst du auch kein friend

6

31.03.2010, 10:38

Dito.

Wenn ich es auch richtig herauslese willst du wissen was im Hintergrund passiert. Da würde es sich auch empfehlen einen eigenen SoftwareRenderer zu schreiben, dadurch kriegt man einen guten Einblick in die ganze Sache die dahinter steckt.

7

31.03.2010, 13:01

Ich hab das jetzt so umgesetzt das ich die Funktionen in ein namespace gepackt habe, weil ich keine Namen haben will wie "Vector3Length"

und zu einem weiß ich dann wo die Funktion her kommt...

Ich wollte mir die Mathesachen selber zusammenschreiben weil ich die D3DX-Mathelib nicht als gegeben hinnehmen möchte und wenn ich die Mathemathik wie die Vektoren und die Matrizen umsetze hab ich es auch verstanden... Und wäre ein Software-Renderer für den Anfang nicht so schwer?

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

8

31.03.2010, 13:15

Ich hab das jetzt so umgesetzt das ich die Funktionen in ein namespace gepackt habe, weil ich keine Namen haben will wie "Vector3Length"

und zu einem weiß ich dann wo die Funktion her kommt...
Warum kein static, wie PCShadow es empfahl? Ich finde, einen Namespace dafür zu benutzen, ist die schlechteste Lösung.
<< an dieser Stelle ist eine Signatur verstorben >>

9

31.03.2010, 13:45

Einen eigenen Namensraum für das Kreuzprodukt zweier Vektoren brauchst du nicht. Ich habe mir auch einmal eine Vektor-Klasse (dreidimensional) zusammengeschustert. Allerdings als Template-Klasse. Ich gruppiere meine Namensräume immer nach Aufgaben. So könnte die Vektorklasse selbst zum Beispiel im Namensraum "math" oder "geom" liegen.

Das Interface sieht folgendermaßen aus (Pseudo-UML):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Vector3 < T >
========================================
+ x : T
+ y : T
+ z : T
    # Attribute sind public, da hier
    # kein Anlass besteht, diese vor
    # einem Zugriff schützen zu müssen.
----------------------------------------
{ctor} Vector3(x : T=0, y : T=0, z : T=0)
    # Copy-Constructor, Zuweisung und
    # Destruktor werden vom Compiler
    # generiert.

+ magnitude() : T const 

+ {unary} operator - () : T const
+ operator += (Vector3) : Vector3
+ operator -= (Vector3) : Vector3
+ operator *= (T) : Vector3
+ operator /= (T) : Vector3

Globale Operatoren: +, -, *, /
Globale Operatoren: <<, >> (Streams)
Globale Funktionen:
    + cross(Vector3< T >, Vector3< T >) : Vector3< T >
    + dot(Vector3< T >, Vector3< T >) : T


Wobei man die "cross" und "dot"-Funktionen ohne Probleme verwenden kann, da die Parameter ja zur Signatur gehören.

Grüße ... Heiko

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

10

31.03.2010, 13:50

Jupp,
static würde hier wesentlich besser sein. Und alle Klassen dann in ein gemeinsames namespace packen.
EDIT: Wurde gerade von bwbg geschrieben.


Ein SoftwareRenderer ist für den Anfang ein gutes Stück Arbeit, ein wirklich guter ist Mesa3D wenn man einmal reinschnuppern will jedoch ganz gut.

Wenn du jedoch nur die mathematischen Aspekte betrachten willst brauchst du dich erstmal nicht um so Sachen wie Renderer kümmern.

Werbeanzeige