summaryrefslogtreecommitdiff
path: root/romunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'romunit.pas')
-rw-r--r--romunit.pas25
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;