Höhe eines Punktes in einem Dreieck
Übersicht

![]() |
DCSieger des B2D Retro Wettbewerb / Aug 04Betreff: Höhe eines Punktes in einem Dreieck |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie kann man von einem Punkt der sich innerhalb eines Dreiecks befindet, die Höhe (Y) ausrechnen, so dass der Punkt auch in der Höhe auf dem Dreieck liegt und nicht etwa drüber oder drunter ist?
Gegeben: - X,Y,Z der Vertices/Eckpunkte des Dreiecks - X,Z des Punktes der Innerhalb des Dreiecks -das Dreieck ist rechtwinklig und die größen sind Augrund der vorhandenen Positionen natürlich auch da. Gesucht: Y des Punktes Das ganze sieht so aus (von oben): ![]() X und Z vom roten Punkt liegen dabei irgendwo innerhalb des Dreiecks. Ich habe schon die ganze Zeit rumprobiert, aber irgendwie komme ich nicht drauf... Mein Ansatz war: -niedrigsten Punkt des Dreiecks nehmen -dann für die beiden anderen Punkte anhand der Distanz zum roten Punkt ausrechnen wieviel Prozent von ihnen in die Höhe eingeht (maximale Entfernung 0%, minimale 100%) -diese beiden Y-Prozentwerte zum Y-Wert des niedrigsten Punktes addieren Entweder ist der ganze Ansatz falsch, oder ich habe es nur falsch gemacht (der Code ist mit viel drum herum, sonst würde ich ihn einfach posten). Weiss da jemand weiter? |
||
Core i5 4670K | 4 x 3,40 GHZ | 16 GB Ram | GeForce GTX 960 | HTC Vive | Win 10 Pro
www.UnrealSoftware.de | www.StrandedOnline.de | www.CS2D.com | www.CarnageContest.com | www.Stranded3.com |
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also wenn der Punkt genau zwischen dem Punkt links unten und rechts oben liegen würde, kann man ja einfach den Mittelwert der Beiden Y-Werte nehmen... ![]() |
||
![]() |
DCSieger des B2D Retro Wettbewerb / Aug 04Betreff: Re: Höhe eines Punktes in einem Dreieck |
![]() Antworten mit Zitat ![]() |
---|---|---|
DC hat Folgendes geschrieben: [...]X und Z vom roten Punkt liegen dabei irgendwo innerhalb des Dreiecks.[...] Also nicht in der Mitte sondern immer wo anders - nur eben innerhalb des Dreiecks. Aber wo innerhalb des Dreiecks ist variabel, also kann ich leider nicht einfach die Mittelwerte nehmen.
|
||
Core i5 4670K | 4 x 3,40 GHZ | 16 GB Ram | GeForce GTX 960 | HTC Vive | Win 10 Pro
www.UnrealSoftware.de | www.StrandedOnline.de | www.CS2D.com | www.CarnageContest.com | www.Stranded3.com |
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ok, dann wirds wesentlich schwieriger... also ich würde mir nur 2 Punkte zur berechnung krallen, dann wirds etwas einfacher. Sagen wir links unten und rechts oben. jetzt könnte man ja eine Funktion berechnen für Y, nach der allg. Formel: y = mx + b. Dabei solltest du einen Punkt vielleicht als [0,0] definieren und den Anderen als [0,Distance]. Dann hättest du für jeden Punkt zwischen den beiden Koordinaten schon mal den Y-Wert.
Jetzt muss du "nur" noch deinem roten Punkt den richtigen "Funktions-X-Wert" zuweisen. Das kannst du am besten dann über die x und z Werte machen. Hoffe ich konnte dir helfen, kann auch sein das meins zu kompliziert ist oder net funzt, aber ich bin mir eigentlich ziemlich sicher ![]() Gruß Timo |
||
![]() |
DCSieger des B2D Retro Wettbewerb / Aug 04 |
![]() Antworten mit Zitat ![]() |
---|---|---|
mit 2 Punkten ist es einfach, ja, aber es muss 3d sein und auch möglichst genau. | ||
Core i5 4670K | 4 x 3,40 GHZ | 16 GB Ram | GeForce GTX 960 | HTC Vive | Win 10 Pro
www.UnrealSoftware.de | www.StrandedOnline.de | www.CS2D.com | www.CarnageContest.com | www.Stranded3.com |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Interessant dürfte da U & V sein ,
das Dreieck wird vorher gedreht und auf die Seitenlänge 1x1 gebracht . Code: [AUSKLAPPEN] Type V3D Field x# Field y# Field z# End Type Function in_triangle(o.V3D,d.V3D, v1.V3D, v2.V3D, v3.V3D, t.V3D) ;t ist ByRef !!! ;o=Beobachter , d=Richtung , v0-v2 Ecken vom Dreieck ;global e1 e2 vt vp vq Local u# Local v# Local det# Local inv_det# Local EPSILON# EPSILON = 0.0000001 VSUB v2, v1,e1 ;SUB VSUB v3, v1,e2 ;SUB VCROSS d, e2,vp ;CROSS det = (e1\x * vp\x + e1\y * vp\y + e1\z * vp\z) ;Dotproduct If det > -EPSILON And det < EPSILON Then Return 0 End If inv_det = 1.0 / det VSUB o, v1,vt ;SUB u = (vt\x * vp\x + vt\y * vp\y + vt\z * vp\z) * inv_det ;Dotproduct If u < 0.0 Or u > 1.0 Then Return 0 End If VCROSS vt, e1,vq ;CROSS v = VDOT(d, vq) * inv_det ;Dotproduct If v < 0.0 Or (u + v) > 1.0 Then Return 0 End If t\z = VDOT(e2, vq) * inv_det ;Dotproduct Return 1 End Function Function VSUB(v1.V3D, v2.V3D,vout.V3D) ;- vout\x = v1\x - v2\x vout\y = v1\y - v2\y vout\z = v1\z - v2\z End Function Function VCROSS(a.V3D,b.V3D,c.V3D) c\x = a\y * b\z - b\y * a\z c\y = a\z * b\x - b\z * a\x c\z = a\x * b\y - b\x * a\y End Function Function VDOT#(a.V3D, b.V3D) Return (a\x * b\x + a\y * b\y + a\z * b\z) End Function |
||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@DC: was willst du damit eigentlich machen? | ||
![]() |
DCSieger des B2D Retro Wettbewerb / Aug 04 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Höhe in nem Meshterrain, Timo
Danke Markus, ich gucke mir das mal an! |
||
Core i5 4670K | 4 x 3,40 GHZ | 16 GB Ram | GeForce GTX 960 | HTC Vive | Win 10 Pro
www.UnrealSoftware.de | www.StrandedOnline.de | www.CS2D.com | www.CarnageContest.com | www.Stranded3.com |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das geht sonst auch über
LinePick( Terrainmesh, x#, 200000, z#, 0, -400000, 0 ) wenn du dem Terrainmesh den Entitypickmode 2 zuweist. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Auf lange Distance kann man LinePick schlecht verwenden weil es sehr lange braucht und man muß von allem anderen den Pickmode vorher weg nehmen und dann wiederum nur für eines der MeshTerrains am besten den Pickmode wieder setzen . @DC Das gleiche Problem hatte ich auch , habe dazu ein Array genommen wo die Triangles drin gemerkt werden und dann mache ich nur einen Schnitttest mit genau diesem . Optimum wäre ein Triangle wechsel festzustellen das man ohne Array auskommt ... @All wo ich grad hier bin ![]() Ich suche noch ne Funk. die Triangles bis zu einem gewissen Winkel bzw. auf gleicher Ebene entfernt oder hat jemand das mit C4D irgendwie hinbekommen ? |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Warum solltest du auf den anderen Tiles den Pickmode wieder runternehmen? Solange man ne "intelligente" Menge an Tiles hat ( 16, 25 ) ist es kein Problem Pickmode 2 auf allen zu lassen. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Ich mein viele Surfaces = langsamer oder so . Die Mesh Terrains bei mir z.B. haben viele Polys , also gerade so viel das es auch noch wie ne Landschaft aussieht . |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ach so.
Naja wie gesagt, mit 16 oder 25 Tiles kommste auf 128000 Polygone und es läuft immer noch mit einem Frameverlust von vielleicht 0-3 fps ( bei 270-400 FPS, also eigentlich kein einfluss ). Das Pickmode setzen kann man über dies in die Cullingroutine integrieren, sprich was sichtbar gemacht wird bekommt Pick und was gehided wird verliert es. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Auf so hohe Frameraten kommste auch nur wenn du den Sync raus nimmst . Also für 100 FPS hat man nur 10 ms Zeit für ein Frame was man schnell verbraten hat . Dann kommt noch der Faktor hinzu wie viele Figuren man auf dem Terrain bewegen will . |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Als Alternative hats im englischen Codearchiv nen entsprechenden Intersectioncode von Sswift | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Jo, den habe ich auch , allerdings ist der im DebugModus lahm was man aber nicht verhindern kann , macht aber auch fast nix . Hoffe ja mal das Marc in LinePick optional den Parameter für EntityType einbaut ... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kann ich net bestätigen
Das Ulysses Foilagesystem arbeitet mit diesem Intersection Code von Sswift und man kann nicht behaupten, dass es so langsam ist. Vor allem im Vergleich mit Linepick was 2-3x langsamer war. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Ich habe gehört das LinePick alle Dreiecke auf einen Schnitttest prüft und darum langsamer ist . Aber das sind dann wohl auch nur die , die in Frage kommen würden weil es ja bei kurzer Distance schneller ist . |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group