Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Okt 17, 2018 10:19

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Schnittpunkte 2er Geraden.
BeitragVerfasst: Sa Jan 27, 2018 21:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1203
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Momentan rechne ich folgendermassen den Schnittpunkt 2er Geraden aus:
Code:
  1. function getSchnitt(p1, p2, p3, p4: TVector2f): TVector2f;
  2. var
  3.   spx: single;
  4. begin
  5.   Result.x := ((p3.y - p1.y) + (p2.y - p1.y) / (p2.x - p1.x) * p1.x - (p4.y - p3.y) / (p4.x - p3.x) * p3.x) /
  6.     ((p2.y - p1.y) / (p2.x - p1.x) - (p4.y - p3.y) / (p4.x - p3.x));
  7.  
  8.   Result.y := ((p2.y - p1.y) / (p2.x - p1.x)) * (Result.x - p1.x) + p1.y;
  9. end;
  10. .......
  11. var
  12.   p1, p2, p3, p4, sp: TVector2f;
  13. begin
  14.   p1 := vec2(170, 150);
  15.   p2 := vec2(10, 50);
  16.   p3 := vec2(120, 10);
  17.   p4 := vec2(40, 80);
  18.  
  19.   sp := getSchnitt(p1, p2, p3, p4);
  20.   Caption := 'X:' + FloatToStr(sp.x) + '  Y:' + FloatToStr(sp.x);
  21.   DrawPoint(sp);


Bevor ich dies in GLSL umsetzte, frage ich zuerst, gibt es in GLSL eine fertige Funktion dafür ?
So ähnlich, wie es für das Kreuzprodukt dot gibt.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkte 2er Geraden.
BeitragVerfasst: So Jan 28, 2018 11:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 562
Programmiersprache: C++
Dafür gibt es keine fertige Funktion, die bereits im Standardumfang von GLSL enthalten ist. Beachte, dass deine Funktion nicht prüft, ob es überhaupt einen Schnittpunkt gibt. dot ist das Skalarprodukt.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkte 2er Geraden.
BeitragVerfasst: Di Jan 30, 2018 20:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1203
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
dot ist das Skalarprodukt.
Ups, da habe ich etwas verwechselt. Das Kreuzprodukt wird für die Senkrecht(Normale) auf einem Polygon verwendet.

Zitat:
Beachte, dass deine Funktion nicht prüft, ob es überhaupt einen Schnittpunkt gibt.
Das musste ich leider auch feststellen. Lazarus spuckt ein "Inf" aus. Dies entspricht einem "division by zero". Was macht GLSL mit solchen Werten ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkte 2er Geraden.
BeitragVerfasst: Di Jan 30, 2018 23:09 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 228
Programmiersprache: c++, c, JavaScript
Es gibt glsl die Funktionen isinf und isnan, die sollte man verwenden, wenn man sowas vermutet und entsprechend abfangen, bzw. einen Wert setzen, mit dem weitergerechnet werden kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkte 2er Geraden.
BeitragVerfasst: Mi Jan 31, 2018 07:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 562
Programmiersprache: C++
Wobei man erwähnen sollte, dass GLSL durchaus mit inf-Werten weiterrechnen kann. Es ist also nicht so, dass das Programm bei einer Division durch 0 abstürzen würde oder so.
Code:
  1. // So rechnet GLSL
  2. float x = 1.0;
  3. float infinity = x / 0.0;
  4. float minus_infinity = -x / 0.0;
  5. float zero = x / infinity;

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schnittpunkte 2er Geraden.
BeitragVerfasst: Mi Jan 31, 2018 20:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1203
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich musste gerade feststellen, das meine Formel einen Fehler hat. Wen eine Linie genau senkrecht ist, wird ein "Nan" ausgespuckt.

Ich habe diese Formel übernommen: https://archiv.blendpolis.de/viewtopic. ... 15&t=26215

Ist eine Schnittpunktberechnung so was exotisches, das Google nichts gescheites findet ?

Ich habe es mal mit diesem Trick versucht, jetzt sehe ich wenigstens eine rote und grüne Linie bei der Senkrechten, aber verstümmelt.
Lasse ich die beiden Zeilen weg, dann kommen die Linien gar nicht.

Code:
  1. vec2 SP(in vec2 p1, in vec2  p2, in vec2 p3, in vec2 p4) {
  2.   p1.x += 0.0000001;
  3.   p3.x += 0.0000001;
  4.   vec2 Result;
  5.   Result.x = ((p3.y - p1.y) + (p2.y - p1.y) / (p2.x - p1.x) * p1.x - (p4.y - p3.y) / (p4.x - p3.x) * p3.x) /
  6.     ((p2.y - p1.y) / (p2.x - p1.x) - (p4.y - p3.y) / (p4.x - p3.x));
  7.  
  8.   Result.y = ((p2.y - p1.y) / (p2.x - p1.x)) * (Result.x - p1.x) + p1.y;
  9.   return Result;
  10. }

Kennt jemmand eine Formel, welche funktioniert.


Dateianhänge:
Bildschirmfoto vom 2018-01-31 20-52-15.png
Bildschirmfoto vom 2018-01-31 20-52-15.png [ 7.75 KiB | 944-mal betrachtet ]

_________________
OpenGL
Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.020s | 19 Queries | GZIP : On ]