summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lowlevelunit.pas27
1 files changed, 27 insertions, 0 deletions
diff --git a/lowlevelunit.pas b/lowlevelunit.pas
index 7d253be..26f3e29 100644
--- a/lowlevelunit.pas
+++ b/lowlevelunit.pas
@@ -90,6 +90,7 @@ function round(x: tExtPoint): tInt64Point; overload;
function symmetrischModulo(x,m: tInt64Point): tInt64Point; overload;
function symmetrischModulo(x: tExtPoint; m: tInt64Point): tExtPoint; overload;
function modulo(x,m: tInt64Point): tInt64Point;
+function naechsterSchnittpunkt(ich: tGerade; dieAnderen: tGeradenArray): tExtPoint;
function signSqr(x: extended): extended; inline;
function myTimeToStr(t: extended): string;
@@ -434,6 +435,32 @@ begin
end;
end;
+function naechsterSchnittpunkt(ich: tGerade; dieAnderen: tGeradenArray): tExtPoint;
+var
+ i: longestOrdinal;
+ lMin,l: extended;
+ n: tExtPoint;
+begin
+ lMin:=-1;
+ for i:=0 to length(dieAnderen)-1 do begin
+ n:=extPoint(dieAnderen[i].r['y'],-dieAnderen[i].r['x']);
+ if n * ich.r = 0 then // Gerade parallel zu r
+ continue;
+ l:=(n*(dieAnderen[i].a-ich.a))/(n*ich.r);
+ if l<0 then // Schnittpunkt auf der falschen Seite
+ continue;
+ if (l<lMin) or (lMin<0) then
+ lMin:=l;
+ end;
+ if lMin<0 then
+ fehler(
+ 'Konnte keinen Schnittpunkt (auf dieser Seite) finden (' +
+ dumpGerade(ich) + ' geschnitten mit ' +
+ dumpGeradenArray(dieAnderen) +
+ ')!');
+ result:=ich.a + lMin*ich.r;
+end;
+
function signSqr(x: extended): extended;
begin
result:=sign(x)*sqr(x);