diff options
author | Erich Eckner <git@eckner.net> | 2018-07-30 13:50:03 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2018-07-30 13:50:03 +0200 |
commit | dd8c2a6eeedea22559c9ac5272b37b2690ad6f4d (patch) | |
tree | f8fb4f64cd5faf68459f13e5cf6fd2ab108b70f3 /romunit.pas | |
parent | 807f9bc2be261d6ea1ac41777f93d0895a81f444 (diff) | |
download | ROM-dd8c2a6eeedea22559c9ac5272b37b2690ad6f4d.tar.xz |
romunit.pas: dx hamonisch mitteln
Diffstat (limited to 'romunit.pas')
-rw-r--r-- | romunit.pas | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/romunit.pas b/romunit.pas index ff8ea7c..41fa0c3 100644 --- a/romunit.pas +++ b/romunit.pas @@ -869,24 +869,29 @@ begin end; procedure interpoliere(var dat: tExtPointArray); -var i,j: longint; - tmp: extended; - tdat: tExtPointArray; +var i,j: longint; + tmp,xLen: extended; + tdat: tExtPointArray; begin - tmp:=dat[1]['x']-dat[0]['x']; - for i:=2 to length(dat)-1 do - tmp:=min(tmp,dat[i]['x']-dat[i-1]['x']); - if tmp<=0 then Fehler('Die Daten müssen sortiert sein und dürfen keine doppelten x-Werte enthalten! ('+floattostr(tmp)+')'); + tmp:=0; + xLen:=dat[length(dat)-1]['x']-dat[0]['x']; + for i:=1 to length(dat)-1 do begin + if dat[i]['x']<=dat[i-1]['x'] then + Fehler('Die Daten müssen sortiert sein und dürfen keine doppelten x-Werte enthalten! ('+floattostr(tmp)+')'); + tmp:=tmp + 1/(dat[i]['x']-dat[i-1]['x']); + end; + tmp:=length(dat)/tmp; setlength(tdat,length(dat)); for i:=0 to length(dat)-1 do tdat[i]:=dat[i]; - setlength(dat,max(2*length(tdat),round(min(power(length(tdat),1.3),(tdat[length(tdat)-1]['x']-tdat[0]['x'])/tmp+1)))); + setlength(dat,round(xLen/tmp+1)); j:=0; for i:=0 to length(dat)-1 do begin - dat[i]['x']:=tdat[0]['x']+(tdat[length(tdat)-1]['x']-tdat[0]['x'])*i/(length(dat)-1); + dat[i]['x']:=tdat[0]['x'] + xLen*i/(length(dat)-1); while (j<length(tdat)-1) and (tdat[j+1]['x'] <= dat[i]['x']) do inc(j); - if j=length(tdat)-1 then tmp:=tdat[j]['y'] + if j=length(tdat)-1 then + tmp:=tdat[j]['y'] else begin tmp:=(dat[i]['x']-tdat[j]['x'])/(tdat[j+1]['x']-tdat[j]['x']); tmp:=tdat[j]['y']*(1-tmp) + tdat[j+1]['y']*tmp; |