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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

07.06.2007, 11:38

Zitat von »"dot"«

normalen new


ich weis...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

07.06.2007, 11:39

Zitat von »"dot"«

Zitat von »"dot"«

normalen new


ich weis...


Ja du weißt das, aber sicher nicht die meisten anderen! ;-P
@D13_Dreinig

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

13

07.06.2007, 11:53

Ok, werde mir die Stringstreams mal ankucken(noch nie was von gehört^^).

Die 2te Aufgabe habe ich wegen dem Auslesen aus einer Datei mal ausgelassen.

Hier mal die dritte:(Noch mit sprintf())

C-/C++-Quelltext

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <TriBase.h>
#include <windows.h>
#include <iostream>
#include <string>


using namespace std;


//int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int showCmd)

int main()
{
    if(tbInit())
        tbWriteToLog("TriBase konnte nicht initialisiert werden!");
    else
    {
        tbVector3 *vectors = new tbVector3[5000];


        for( int i = 0; i < 5000; i++)
            vectors[i] = tbVector3Random();




            //3 beliebige herausnehmen

            int A = tbIntRandom(0, 4999);
            int B = tbIntRandom(0, 4999);
            int C = tbIntRandom(0, 4999);

            tbPlane plane = tbPlaneFromPoints(vectors[A], vectors[B], vectors[C]);

            //´Punkte in Ebene einsetzen.

            // Prüfen, ob der Punkt auf oder hinter der Ebene liegt.

            // Ergebnis in Logdatei schreiben.

            int over  = 0;
            int under = 0;
            for( int i = 0; i < 5000; i++)
            {
                float result =  tbPlaneDotCoords(plane, vectors[i]);
                if( result > 0.0f)
                    over++;
                else
                    under++;
                    

            }

            char buffer[50];
            sprintf(buffer, "%i Vektoren liegen unter der Ebene, %i darüber", under, over);

            tbWriteToLog(buffer);




        delete[] vectors;

    }


    tbExit();


    return 0;
}

Stimmt das so? ungefähr? Es kommen ganz realistische Werte dabei raus:
2402 Vektoren liegen unter der Ebene, 2598 darüber

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

07.06.2007, 11:57

Sieht ok aus. Aber du zählst auch die Punkte mit zu "unter" die evtl AUF der Ebene liegen! ;-)
@D13_Dreinig

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

15

07.06.2007, 12:03

Ok, wird geändert ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

07.06.2007, 12:07

Bei Floatwerten solltes du aber ohnehin mit einer kleinen Toleranzgrenze testen.

C-/C++-Quelltext

1
2
3
4
if ( result > numeric_limits< float >::zero_tolerance() ) 
  over++;
else
  under++;


Die Methode zero_tolerance() gibts standardmäßig nich, is aber nich schwer zu implementieren:

C-/C++-Quelltext

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
template< typename T >
struct numeric_limits
    : public ::std::numeric_limits< T >
{
    static const T zero_tolerance()
    {
        return ( T( 0 ) );
    }
};

template<>
struct numeric_limits< float >
    : public ::std::numeric_limits< float >
{
    static const float zero_tolerance()
    {
        return 1e-06f;
    }
};

template<>
struct numeric_limits< double >
    : public ::std::numeric_limits< double >
{
    static const double zero_tolerance()
    {
        return 1e-08;
    }
};

#ifdef __cplusplus
template<>
struct numeric_limits< long double >
    : public ::std::numeric_limits< long double >
{
    static const long double zero_tolerance()
    {
        return 1e-10;
    }
};
#endif
@D13_Dreinig

17

09.06.2007, 18:23

Irgendwie bin ich mir nicht ganz schlüssig warum das

C-/C++-Quelltext

1
vectors[i]*tbFloatRandom(0.0f, 10.f);


heißen muss.
Könnte dies evtl. jemand kurz erklären?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

09.06.2007, 18:26

^^gute frage. imo ist diese zeile sinnlos (zumindest wenn operator * von tbVector3d keine komischen sachen macht... ;))

Progater

Treue Seele

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

19

09.06.2007, 19:22

Zitat von »"dot"«

^^gute frage. imo ist diese zeile sinnlos (zumindest wenn operator * von tbVector3d keine komischen sachen macht... Wink)

Es heißt eigentlich tbVector3 und der *-Operator macht hier nicht dasselbe wie der *=-Operatur.

@Spacemuck: Hier wird eigentlich versucht einem Vektor eine Länge von 0 bis 10 (zufällig) zu verpassen, allerdings etwas daneben.
Es müsste heißen:

C-/C++-Quelltext

1
vectors[i] = tbVector3Normalize(tbVector3Random()) * tbFloatRandom(0.0f, 10.0f);

Korrigiert mich, falls ich was falsch gesagt habe. ;)
To go back to the drawing board is not everyone's cup of tea! :-)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

09.06.2007, 19:35

Ne, ist korrekt. Vermutlich liefert tbVector3Random() aber bereits einen Normierten Vektor. Wobei das aber geraten ist! ;-)
Die Zeile im Orginal hat, soweit das Verhalten von Operator* normal ist, garkeine Wirkung! ;-)
@D13_Dreinig

Werbeanzeige