Höhenberechnung eines Punktes

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

schalli

Betreff: Höhenberechnung eines Punktes

BeitragFr, Mai 28, 2010 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist eine mathematische Frage.
Also, ich habe eine Heightmap und daraus ein Meshterrain berechnet. Ich will mit Hilfe der Heightmap die Höhe herausfinden.

Wenn ich beispielsweise den Punkt x=1.5 y=5.6 habe, dann kann ich mit Floor und Ceil die umliegenden Punkte berechnen:
x1=1
x2=2
y1=5
y2=6
Die Höhe dieser Punkte kann ich aus der Heightmap auslesen. Aber wie kann ich nun berechnen, wie hoch der ursprüngliche Punkt liegt?

EDIT
Die umliegenden Punkte sind:
x1,y1
x1,y2
x2,y1
x2,y2

Badudel

BeitragFr, Mai 28, 2010 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh nicht ganz - warum kannst du die Höhe der umliegenden Punkte herausfinden, aber die des gewünschten Punktes nicht?
Wir werden dem Schwein schon schlachten, auch wenn ihm quiekt.
Zum Teufel mit das Grammatik!
 

schalli

BeitragFr, Mai 28, 2010 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil die umliegenden Punkte als Pixel auf der Heightmap vermerkt sind, der dazwischen aber nicht.
Theovention - meine Homepage

Noobody

BeitragFr, Mai 28, 2010 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Local Height# = HeightMap( X1, Y1 )*( X2 - X# )*( Y2 - Y# ) + HeightMap( X2, Y1 )*( X# - X1 )*( Y2 - Y# ) + HeightMap( X1, Y2 )*( X2 - X# )*( Y# - Y1# ) + HeightMap( X2, Y2 )*( X# - X1 )*( Y# - Y1 )
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

schalli

BeitragFr, Mai 28, 2010 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@Noobody:
Super, das hat geklappt! Danke.
Theovention - meine Homepage
 

schalli

BeitragMo, Jun 07, 2010 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich muss das ganze hier leider noch mal mit einem Doppelpost "ausgraben", denn ich habe noch eine Frage dazu. Ich benutze bei mir jetzt mit Erfolg Noobodys Code, aber bei einem Freund gibt das ganze beim Y Wert ein NaN (Not a Number) zurück.

Mein Code zur Höhenberechnung ist:
BlitzBasic: [AUSKLAPPEN]
Function MTerrainY#(xpos#,zpos#)
xpos# = xpos# / 8
zpos# = zpos# / 8
x1# = Float(Floor(xpos#))
x2# = Float(Ceil(xpos#))
y1# = Float(Floor(zpos#))
y2# = Float(Ceil(zpos#))
hmp# = HeightMap( X1, Y1 )*( X2 - xpos# )*( Y2 - zpos# ) + HeightMap( X2, Y1 )*( xpos# - X1 )*( Y2 - zpos# ) + HeightMap( X1, Y2 )*( X2 - xpos# )*( zpos# - Y1# ) + HeightMap( X2, Y2 )*( xpos# - X1 )*( zpos# - Y1 ) ; Hier passiert es (nachgeprüft!!!)
Return 25*(hmp#/255.0)
End Function

Function HeightMap(hx,hy)
LockBuffer ibuf
rpix = ReadPixelFast(Int(hx),Int(hy) ,ibuf)
UnlockBuffer ibuf
ret# = Float((rpix And $FF0000)/$10000)
Return ret#
End Function


Ich hab keine Ahnung, woran es liegen kann. Er hat XP, ich Vista, aber das kann auch nicht der Fehler sein, denn ich konnte es auf einem XP-PC erfolgreich testen.
Theovention - meine Homepage

hazumu-kun

BeitragMo, Jun 07, 2010 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem NaN(Not a Number) ist komplett vom Betriebssystem unabhängig.

Weist aber auf so Rechnungen wie 0/0 hin.

1/0 = infinity
-1/0 = -infinity
0/0= NaN
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
 

Blitzjockey

BeitragMo, Jun 07, 2010 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann es mir so auch nicht direct erklären, anhand Deiner Code.

Was Du vielleicht zur weitere Einschränkung noch machen könntest, ist der hmp#= -teil noch mal weiter aufteilen.
Du hast ja 4x "HeightMap( X1, Y1 )*( X2 - xpos# )*( Y2 - zpos# )" da stehen (bzw, vergleichbare Termen.)
Wenn Du die noch mal in 4 separate Abschnitten schreibst, würde es vielleicht mehr ergeben, bzw, vielleicht sogar das Problem lösen.

Das kannst Du ja so machen:
ersetze
BlitzBasic: [AUSKLAPPEN]

hmp# = HeightMap( X1, Y1 )*( X2 - xpos# )*( Y2 - zpos# ) + HeightMap( X2, Y1 )*( xpos# - X1 )*( Y2 - zpos# ) + HeightMap( X1, Y2 )*( X2 - xpos# )*( zpos# - Y1# ) + HeightMap( X2, Y2 )*( xpos# - X1 )*( zpos# - Y1 )


durch

BlitzBasic: [AUSKLAPPEN]
 
hmp# = HeightMap( X1, Y1 )*( X2 - xpos# )*( Y2 - zpos# )
hmp# = hmp + HeightMap( X2, Y1 )*( xpos# - X1 )*( Y2 - zpos# )
hmp# = hmp + HeightMap( X1, Y2 )*( X2 - xpos# )*( zpos# - Y1 )
hmp# = hmp + HeightMap( X2, Y2 )*( xpos# - X1 )*( zpos# - Y1 )


Weiter glaube ich dass Du
BlitzBasic: [AUSKLAPPEN]
Function HeightMap(hx,hy)

eventuell mit
BlitzBasic: [AUSKLAPPEN]
Function HeightMap#(hx,hy)

korrigieren könnte. Damit ist es sicher gestellt das es ein Float zurück gibt, und kein abgeschnittene Integer. Nur weil Du auch Ret# schreibst, anstatt Ret%. Aber das dürfte nicht der Fehler sein.


Bin mal gespannt ob das was interessantes ergibt.

Noobody

BeitragMo, Jun 07, 2010 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Die einzige Möglichkeit, bei der da ein NaN herauskommt, ist, wenn mindestens einer der Operanden NaN ist.

Da du ja schon überprüft hast, ob xpos#, ypos#, X1, Y1, X2 und Y2 vor der Berechnung schon NaN sind, muss der Zugriff auf HeightMap() NaN zurückliefern.

NaN entsteht entweder bei 0/0, Sqr von negativen Zahlen, ACos/ASin mit Zahlen kleiner als -1 oder grösser als 1 oder Log() mit Zahlen <= 0. Ich würde also den Code auf solche Befehle untersuchen.

Was ich mir bei deinem Code auch noch vorstellen kann, ist, dass du auf Stellen des Arrays zugreifst, die ausserhalb der Grösse des Arrays liegen. Da bei dir X1 etc. nicht überprüft werden, ob sie im Array liegen, kann es passieren, dass ohne Debugger einfach irgendwo im Speicher gelesen wird. Dabei kommt natürlich nur Müll heraus, je nach dem auch NaN.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group