diff options
author | Erich Eckner <git@eckner.net> | 2018-09-25 09:25:05 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2018-09-25 09:31:34 +0200 |
commit | 91332c5ee67aa243084d786e5298e08ec3adf22c (patch) | |
tree | fc2c730326c75c494600b36be840cd0289642633 | |
parent | 64927db92418d1c0d074d574e4f25c24cb995cdd (diff) | |
download | units-91332c5ee67aa243084d786e5298e08ec3adf22c.tar.xz |
lowlevelunit.pas: naechsterSchnittpunkt neu
-rw-r--r-- | lowlevelunit.pas | 27 |
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); |