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

Dofter

Treue Seele

  • »Dofter« ist der Autor dieses Themas

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

1

20.07.2006, 18:22

Frage zur Übung 3 auf Seite 101

Hallo
ich hätt ne Frage zur Übung 3 auf Seite 101.

sowit müsste mein code doch richtig sein oda?

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
#include "TriBase.h"

void main()
{
    tbVector3 aVector[4999];
    tbInit();

    for (int i = 0; i < 4999; i++)
    {
        aVector[i] = tbVector3Random(); 
    }

    int r1,r2,r3;
    r1 = (int)tbFloatRandom(0,4999);
    r2 = (int)tbFloatRandom(0,4999);
    r3 = (int)tbFloatRandom(0,4999);

    tbPlane ThePlane(tbPlaneFromPoints(aVector[r1],aVector[r2],aVector[r3]));

    int davor=0, darauf=0, dahinter=0;
    for (int i = 0; i < 4999; i++)
    {
        
        if (tbPlaneDotCoords(ThePlane,aVector[i])<0)
        {
            dahinter++;
        }
        else if (tbPlaneDotCoords(ThePlane,aVector[i])>0)
        {
            davor++;
        }
        else
        {
            darauf++;
        }
    }
    tbWriteToLog("Dahinter: %d, darauf: %d, davor: %d",dahinter,darauf,davor);

    tbExit();
}


doch bei mir zeigt es an, im Loagbuch, dass kein Punkt darauf liegt.
als ich bei der if abfragen dann geschrieben hab >0.0000001 und <-0.0000001 gab es drei Punkte. Kann es sein dass durch diverse Rechenfehler das so gemacht werden muss oda is in meinem Code was Falsch?

mfg Dofter
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

20.07.2006, 21:11

Das ist ganz normal so, denn in der Tat verliert man beim Rechnen mit float (und auch double) auf dem Computer immer an Genauigkeit. Stell dir mal vor, wie du z.B. 1/3 als float darstellen willst.

So wie du deine Abfrage programmiert hast, sind Punkte nur dann auf der Ebene, wenn sie genauu den Abstand 0 davon haben, was mathematisch zwar völlig korrekt ist, in der Realität der Fliesskommazahlen auf dem Computer aber praktisch niemals so berechnet wird.

Darum ist es wichtig, bei Vergleichen von float und double immer eine kleine Toleranz zu benutzen, um die Rundungsfehler wieder auszugleichen. In deinem Fall findest du die drei definierenden Punkte der Ebene, wenn du mit einer Toleranz von +/- 1.0e-7f auf 0.0 vergleichst.

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif