höhe eines punktes im dreieck

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

bjh

Betreff: höhe eines punktes im dreieck

BeitragSo, Feb 10, 2013 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo community,

ich suche schon seit ein paar stunden nach einer funktion, die mir die y-koordinate eines punktes aus einem dreieck berechnen kann. Crying or Very sad

es ist ein rechtwinkliges dreieck mit einer hypotenuse von wurzel 2 und den katheten mit 1:

0
|
| p
|
0---------0

die verschiedenen punkte können einen beliebigen y-wert über 0 haben, aber die x- und z-koordinaten bleiben gleich.

wie kann man jetzt ausrechnen, welche y-koordinate der punkt p hat, von dem man die x- und z-koordinaten schon weiß Question

ich will aber kein linepick verwenden Exclamation

und einfach den mittelwert der mittelwerte zu nehmen ist zu ungenau.

ich hoffe, jemand kann mir weiterhelfen

aMul

Sieger des Minimalist Compo 01/13

BeitragSo, Feb 10, 2013 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehme an, du kennst die Koordinaten der drei Punkte(Ecken des Dreiecks). Dann kannst du die Ebene von der das Dreieck ein Teil ist als Gleichung darstellen(Normalenform oder Parameterdarstellung, je nach dem was praktischer ist), dort deine zwei bekannten Koordinaten von P einfüllen und die fehlende Koordinate ausrechnen.

Ebenengleichungen:
http://de.wikipedia.org/wiki/E...ngleichung
 

bjh

BeitragSo, Feb 10, 2013 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
tut mir leid, aber ich hab leider kein plan von matrizen.
ich bin in der 10.klasse aufm gymnasium aber das hatte ich noch nie.

ich wäre sehr dankbar, wenn mir jemand ein beispiel machen könnte.

vielleicht gibt es noch eine bessere/einfachere methode, weil sich nur meine y-werte verändern können

Tennisball

BeitragSo, Feb 10, 2013 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Zitat:
(Normalenform oder Parameterdarstellung, je nach dem was praktischer ist), dort deine zwei bekannten Koordinaten von P einfüllen und die fehlende Koordinate ausrechnen.

Afaik geht das weder bei der Normalenform noch der Parameterdarstellung. Man braucht die Koordinatengleichung -> a*x + b*y + c*z = d. Hier kannst du dein x und z einsetzen, umformen und erhältst y. Um auf die Koordinatengleichung zu kommen braucht man meines Wissens nach erstmal eine der anderen Formen.


Vielleicht hilft dir das hier ja weiter: http://www.klissh.de/vektorrechnung17.htm

Noch kurz, weil nicht dabeisteht wie du deine Parametergleichung aufstellst:
Sagen wir mal du hast die Punkte A, B und C.
Du nimmst Punkt A als "Stützvektor". Du brauchst zusätzlich zwei "Richtungsvektoren". Dazu musst du jeweils die Koordinaten von einem der übrigen Punkte (B und C) nehmen und subtrahierst die X, Y und Z-Koordinaten von A von diesem Punkt: Beispielsweise ist Bx - Ax die X-Koordinate deines ersten Richtungsvektors.
Am Ende hast du als Gleichung: Stützvektor + r*Richtungsvektor1 + s*Richtungsvektor2

Dann gehst du vor wie es bei dem Link oben beschrieben ist.

Ich hoffe, das war einigermaßen verständlich erklärt. Wenn nicht einfach sagen, was zu kompliziert war.

Gruß,
Tennisball

DAK

BeitragSo, Feb 10, 2013 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will ja nichts sagen, aber Normalvektorform = Ebenengleichung, oder das was du Koordinatengleichung nennst.
Gewinner der 6. und der 68. BlitzCodeCompo

Tennisball

BeitragSo, Feb 10, 2013 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, das kann sein. Ich bekam das halt so in der Schule beigebracht, dass das 2 unterschiedliche Dinge wären.
Aber sind "(q-p)*n = 0" und "ax+by+cz = d" nicht unterschiedliche Darstellungsweisen?

Gruß,
Tennisball

DAK

BeitragSo, Feb 10, 2013 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ui, sorry, das ist wieder mal einer dieser Punkte, wo Mathematik in Deutschland und Österreich unterschiedlich ist. (Gibt's unglaublicherweise doch einige, meine Frau, in Deutschland aufgewachsen ist und jetzt hier Mathe-Nachhilfelehrerin ist, schimpft öfters darüber Wink )

Die Normalvektordarstellung in Österreich ist nach dem Schema X*n = P*n, was, nachdem man es ausrechnet, x*a + y*b + z*c = d, was ja die Ebenengleichung ist, weswegen bei uns Ebenengleichung und Normalvektorform synonym war, da es die gleiche Gleichung in nur anderer Umformung ist.
Gewinner der 6. und der 68. BlitzCodeCompo

aMul

Sieger des Minimalist Compo 01/13

BeitragSo, Feb 10, 2013 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Übrigens:
Alle diese Gleichungen, solange sie nur eine die Ebene eindeutig beschreiben lassen sich benutzen um das Problem zu lösen, manche sind nur komplizierter in der Umformung und Berechnung.
Deswegen ist es vor allem wichtig zu wissen in welcher Form die Daten(Representation der Ebene/des Dreiecks) vorliegen.

@bjh:
Falls du mir den gegeben Posts noch nicht genug anfangen kannst, dann beschreib mal genauer welche Daten in welcher Form gegeben sind.
Auch wichtig, du sagst das Dreieck ist rechtwinklig: sind zwei seiner Seiten entlang der Achsen ausgerichtet?
Mit den gegebenen Längen scheint es mir so, als ob es sich evtl um eine Art von Terrain-System handelt, und die die Höhe in einem gegebenen Punk bestimmen möchtest.
Ist das der Fall, dann kannst du all diese Formel-spielereien hier umgehen und den entsprechenden Wert tatsächlich ohne weiteres interpolieren.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

bjh

BeitragSo, Feb 10, 2013 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ja es handelt sich hier um ein terrain.

die vertices haben eine quadratische anordnung und einen abstand von 4
um herauszufinden, welches dreieck berechnet werden muss, hab ich einfach die abfrage:

if x+z>4
zweites dreieck
else
erstes dreieck
endif

die y-werte der vertices liegen zwischen 0 und 255.
diese werte sind aber in einer bank abgespeichert, sind also schon zur verfügung.

das mit den vektoren und matrizen check ich nicht, deshalb wäre ich sehr dankbar, wenn es auch ohne geht. Wink

vielen dank für die schnelle hilfe

Tennisball

BeitragMo, Feb 11, 2013 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, Folgendes sollte funktionieren:

Du nimmst Punkt C (der gegenüber der Hypotenuse c, also da wo der rechte Winkel ist).
Von diesem aus berechnest du quasi 2 Steigungen. Einmal dy/dx zu Punkt A, einmal dy/dz zu Punkt B. Da die Katheten und somit dx und dz immer 1 sind, musst du eigentlich nur die Differenzen entlang der Y-Achse berechnen.
Also:
Code: [AUSKLAPPEN]
Mx = Cy - Ay
Mz = Cy - By


Nun berechnest du die Differenz der X- und Z-Koordinate von Punkt C und P:
Code: [AUSKLAPPEN]
dx = Px - Cx
dz = Pz - Cz


Nun erhältst du deinen Y-Wert (Py) folgendermaßen:
Code: [AUSKLAPPEN]
Py = Cy + Mx*dx + Mz*dz


Wie gesagt, ich habs nicht wirklich ausprobiert, konnte aber auf die Schnelle keinen Denkfehler erkennen. Vielleicht probiert's ja einer von euch aus? Wink

Gruß,
Tennisball
 

bjh

BeitragMo, Feb 11, 2013 0:33
Antworten mit Zitat
Benutzer-Profile anzeigen
@tennisball entweder mach ich was falsch oder das, was du da geschrieben hast ist falsch Wink
aber ich glaub ich hab das mit den vektoren gecheckt

ich meld mich dann, wenns funktioniert und poste die lösung.

Tennisball

BeitragMo, Feb 11, 2013 0:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Was auf jeden Fall falsch ist, ist der erste Teil, dort muss es nämlich heißen:
Code: [AUSKLAPPEN]
Mx = By - Cy
Mz = Ay - Cy


Außerdem musst du natürlich darauf achten, dass du A und B nicht vertauschst.


Edit:
So, ich habe zur Überprüfung mal ein Programm in BlitzMax geschrieben:
BlitzMax: [AUSKLAPPEN]
Graphics 256,256


Local Cx:Float = 0, Cy:Float = 0, Cz:Float = 0
Local Ax:Float = 0, Ay:Float = -1, Az:Float = 1
Local Bx:Float = 1, By:Float = 1, Bz:Float = 0


Local Mx:Float = ( By - Cy ) / 1.0
Local Mz:Float = ( Ay - Cy ) / 1.0

Local Px:Float, Py:Float, Pz:Float
Local dx:Float, dz:Float

Local Color


For Px = 0 To 1 Step 0.001
For Pz = 0 To 1 Step 0.001

If Px+Pz <= 1 Then
dx = Px - Cx
dz = Pz - Cz

Py = Cy + dx*Mx + dz*Mz
Color = 128 + Py * 127
SetColor Color, Color, Color
Plot 256.0*Px, 256.0*(1.0-Pz)
End If

Next
Next



Flip

WaitKey()

End


Das Ergebnis:
user posted image
Ich finde, das sieht richtig aus.


Gruß,
Tennisball
  • Zuletzt bearbeitet von Tennisball am Mo, Feb 11, 2013 1:13, insgesamt 6-mal bearbeitet
 

bjh

BeitragMo, Feb 11, 2013 0:59
Antworten mit Zitat
Benutzer-Profile anzeigen
so vielen dank an alle für die hilfe.
ich habs geschafft und in sachen vektoren und matrizen was dazugelernt Wink

das ist die lösung:
BlitzBasic: [AUSKLAPPEN]
Graphics3D 0,0,32,1

ay=7
by=6
cy=88
px#=.5
pz#=.25

m=CreateMesh()
s=CreateSurface(m)
EntityPickMode m,2
AddVertex(s,0,ay,0)
AddVertex(s,0,by,1)
AddVertex(s,1,cy,0)
AddTriangle s,0,1,2

LinePick px#,99,pz#,0,-100,0
Print PickedY()
Print (cy-ay)*px+(by-ay)*pz+ay

WaitKey
End


das dreieck sieht so aus:

b
|
|
a-------c

px+pz muss zwischen 0 und 1 liegen, damit es funktioniert.

auf jedem fall ist mein problem gelöst und ich war schon fast am verzweifeln Cool

vielen dank

Tennisball

BeitragMo, Feb 11, 2013 1:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur so, die Lösung hat nichts mit Matrizen zu tun *klugscheiß*. Wink

Ja, das musste sein.
 

bjh

BeitragMo, Feb 11, 2013 1:23
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiß Wink
aber ich habs trotzdem verstanden

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group