unit baselineunit; {$mode objfpc}{$H+} interface uses Classes, SysUtils; procedure baselineindexes; procedure notsubstract; procedure straightbaseline; procedure linearbaseline; procedure curvedbaseline; implementation uses variables, main, loadunit,fit; procedure baselineindexes; begin index1:=index2+10; mainform.marker1constantline.Active:=true; mainform.marker1datapointdragtool.Enabled:=true; if xaxispointer=1 then mainform.marker1constantline.position:=time2_01(t1[index1]) else mainform.marker1constantline.position:=temp2_01(temp1[index1]); baselineindex1b:=true; resultout('Set lower baseline point by dragging the line'); upallowed:=false; end; procedure notsubstract; begin if substracted then exit; t2:=t1; temp2:=temp1; a2:=a1; minmax; redraw; end; procedure straightbaseline; var i:longint; slopeb,zerob:double; begin if index1=index2 then exit; slopeb:=(a1[index2]-a1[index1])/(t1[index2]-t1[index1]); zerob:=a1[index1]; for i:=index1 to index2 do if evaldta then a2[i]:=zerob+slopeb*(t1[i]-t1[index1]) else dtg2[i]:=zerob+slopeb*(t1[i]-t1[index1]); redraw; end; procedure linearbaseline; var i:longint; slopeb,zerob:double; begin if index1=index2 then exit; slopeb:=(a1[index2]-a1[index1])/(t1[index2]-t1[index1]); zerob:=a1[index1]; for i:=1 to datanum1 do if evaldta then a2[i]:=zerob+slopeb*(t1[i]-t1[index1]) else dtg2[i]:=zerob+slopeb*(t1[i]-t1[index1]); redraw; end; procedure courveline(x0,x1:longint; y0,y1,y14,y12,y34:double); var i:longint; diff,d1,ri,xx:double; a:x_vector; begin diff:=x1-x0; d1:=diff/4; a[0]:=y0; a[1]:=y0; a[round(diff)]:=y1; a[round(diff+1)]:=y1; a[1+trunc(d1)]:=y14; a[1+trunc(3*d1)]:=y34; d1:=d1+d1; a[1+trunc(d1)]:=y12; d1:=d1/2; while d1>1 do begin for i:=1 to trunc((diff+1)/d1) do begin ri:=i*d1; a[1+trunc(ri-d1/2)]:=(a[1+trunc(ri-d1)]+a[1+trunc(ri)])/2; end; for i:=1 to trunc((diff+1)/d1)-1 do begin ri:=i*d1; a[1+trunc(ri)]:=a[1+trunc(ri)]/2+(a[1+trunc(ri-d1/2)]+ a[1+trunc(ri+d1/2)])/4; end; d1:=d1/2; end; mainform.Curvedbaselinelineseries.active:=true; for i:=0 to x1-x0 do begin bt[i+x0]:=t1[x0]+(t1[x1]-t1[x0])/diff*i; btemp[i+x0]:=temp1[x0]+(temp1[x1]-temp1[x0])/diff*i; by[i+x0]:=a[i+1]; end; bindex1:=index1; bindex2:=index2; end; procedure curvedbaseline; var aa:x_vector; j:longint; m1,m2,cy14,cy12,cy34:double; begin if index2datanum1 then j:=index2-10; m2:=(a1[index2]-a1[j])/(t1[index2]-t1[j]); j:=index1+((index2-index1) div 4); cy14:=a1[index1]-m1*(t1[index1]-t1[j]); x0drag:=j; y0drag:=cy14; j:=index2-((index2-index1) div 4); cy34:=a1[index2]-m2*(t1[index2]-t1[j]); x2drag:=j; y2drag:=cy34; j:=index1+((index2-index1) div 2); cy12:=a1[index1]-m1*(t1[index1]-t1[j])+a1[index2]-m2*(t1[index2]-t1[j]); cy12:=cy12/2; x1drag:=j; y1drag:=cy12; courveline(index1,index2, a1[index1],a1[index2],cy14,cy12,cy34); mainform.Curvedbaselinedragglineseries.active:=true; mainform.CurvedbaselinedataPointdragtool.enabled:=true; mainform.marker1constantline.Active:=true; redraw; end; end.