summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2018-09-25 09:25:05 +0200
committerErich Eckner <git@eckner.net>2018-09-25 09:31:34 +0200
commit91332c5ee67aa243084d786e5298e08ec3adf22c (patch)
treefc2c730326c75c494600b36be840cd0289642633
parent64927db92418d1c0d074d574e4f25c24cb995cdd (diff)
downloadunits-91332c5ee67aa243084d786e5298e08ec3adf22c.tar.xz
lowlevelunit.pas: naechsterSchnittpunkt neu
-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);