Höhe eines Punktes in einem Dreieck

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

DC

Sieger des B2D Retro Wettbewerb / Aug 04

Betreff: Höhe eines Punktes in einem Dreieck

BeitragSo, Aug 29, 2004 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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):
user posted image
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

BeitragSo, Aug 29, 2004 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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... Smile

DC

Sieger des B2D Retro Wettbewerb / Aug 04

Betreff: Re: Höhe eines Punktes in einem Dreieck

BeitragSo, Aug 29, 2004 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 29, 2004 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Gruß Timo

DC

Sieger des B2D Retro Wettbewerb / Aug 04

BeitragSo, Aug 29, 2004 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 29, 2004 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 29, 2004 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@DC: was willst du damit eigentlich machen?

DC

Sieger des B2D Retro Wettbewerb / Aug 04

BeitragMo, Aug 30, 2004 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Aug 30, 2004 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Aug 30, 2004 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
@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 Smile
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

BeitragMo, Aug 30, 2004 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Aug 30, 2004 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragDi, Aug 31, 2004 0:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 31, 2004 5:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragDi, Aug 31, 2004 5:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Sep 01, 2004 0:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragMi, Sep 01, 2004 2:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Sep 01, 2004 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@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 .

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group