From 07cacf5918f0b9489a0b066285847e8be84a77e9 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Thu, 24 May 2018 11:00:45 +0200 Subject: Kontur kann nun auch aus Gerade erzeugt werden --- epostunit.pas | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 101 insertions(+), 15 deletions(-) (limited to 'epostunit.pas') diff --git a/epostunit.pas b/epostunit.pas index 700ab5c..0acf74f 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -77,6 +77,7 @@ type function liesVonDatei(sT: boolean; s: string; xMi,xMa,tMi,tMa: extended): boolean; function erzeugeAusWerten(sT: boolean; s: string; w: pTWerteArray; mT: longint; _xmin,_xmax,_tmin,_tmax: string): boolean; function erzeugeAusFunktion(sT: boolean; s: string; xMi,xMa,tMi,tMa,dX,dT: extended; mT: longint): boolean; + procedure erzeugeAlsGerade(sT: boolean; von,bis: tExtPoint; dX,dT: extended); property xMin: extended read rxmin; property xMax: extended read rxmax; property tMin: extended read rtmin; @@ -195,6 +196,8 @@ type function paramsDump: string; function knownValues: tKnownValues; procedure beendeLeseThreadWennFertig; + function diskRand: tGeradenArray; + function kontRand: tGeradenArray; property transformationen: tTransformation read rTransformationen write wTransformationen; property _xSteps: longint read rXSteps write wXSteps; property _tSiz: longint read rTSiz write wTSiz; @@ -6052,7 +6055,6 @@ var i,schritte: longint; integriere,iWaag: boolean; tmpValues: tKnownValues; - rand: array[0..3] of tGerade; begin result:=false; warteAufBeendigungDesLeseThreads; @@ -6064,18 +6066,6 @@ begin ab['x']:=extPoint(0,0); ab['y']:=extPoint(_xSteps-1,_tSiz-1); - for i:=0 to 3 do - rand[i]:= - gerade( - extPoint( - byte(i in [1,2])*(_xSteps-1), - byte(i in [2,3])*(_tSiz-1) - ), - extPoint( - byte(odd(i+1)), - byte(odd(i)) - ) - ); skalierung:='1'; verschiebung:=0; @@ -6144,7 +6134,7 @@ begin tmpPoint, extPoint(-cos(tmp),-sin(tmp)) ), - rand + diskRand ); ab['y']:= naechsterSchnittpunkt( @@ -6152,7 +6142,7 @@ begin tmpPoint, extPoint(cos(tmp),sin(tmp)) ), - rand + diskRand ); continue; end; @@ -6711,6 +6701,46 @@ begin end; end; +function tWerte.kontRand: tGeradenArray; +var + i: longint; +begin + setLength(result,4); + for i:=0 to 3 do + result[i]:= + gerade( + extPoint( + byte(i in [1,2])*_xStop + + byte(i in [0,3])*_xStart, + byte(i in [2,3])*_tStop + + byte(i in [0,1])*_tStart + ), + extPoint( + byte(odd(i+1)), + byte(odd(i)) + ) + ); +end; + +function tWerte.diskRand: tGeradenArray; +var + i: longint; +begin + setLength(result,4); + for i:=0 to 3 do + result[i]:= + gerade( + extPoint( + byte(i in [1,2])*(_xSteps-1), + byte(i in [2,3])*(_tSiz-1) + ), + extPoint( + byte(odd(i+1)), + byte(odd(i)) + ) + ); +end; + // tZuZeichnendeKontur ********************************************************* constructor tZuZeichnendeKontur.create; @@ -7561,6 +7591,8 @@ function tKontur.init(sT: boolean; f: tMyStringList; w: pTWerteArray; mT: longin var s,xMi,xMa,tMi,tMa,dX,dT: string; i,j,k: longint; + tmp: extended; + tmpPoint: tExtPoint; bekannteBefehle: tMyStringList; begin result:=false; @@ -7686,6 +7718,39 @@ begin end; continue; end; + if istDasBefehl('Werte, Aufpunkt und Richtung:',s,bekannteBefehle,true) then begin + i:=findeWerte(erstesArgument(s,','),nil,w,nil,false); + if i<0 then + exit; + tmp:=w^[i].exprToFloat(sT,erstesArgument(s,',')); + tmpPoint:=extPoint(tmp,w^[i].exprToFloat(sT,erstesArgument(s,','))); + if sT then + tmpPoint:=extPoint( + (w^[i]._xStop+w^[i]._xStart)/2, + (w^[i]._tStop+w^[i]._tStart)/2 + ); + tmp:=w^[i].exprToFloat(sT,s); + erzeugeAlsGerade( + sT, + naechsterSchnittpunkt( + gerade( + tmpPoint, + extPoint(-cos(tmp),-sin(tmp)) + ), + w^[i].kontRand + ), + naechsterSchnittpunkt( + gerade( + tmpPoint, + extPoint(cos(tmp),sin(tmp)) + ), + w^[i].kontRand + ), + (w^[i]._xStop-w^[i]._xStart)/(w^[i]._xSteps-1), + (w^[i]._tStop-w^[i]._tStart)/(w^[i]._tSiz-1) + ); + continue; + end; if istDasBefehl('Ende',s,bekannteBefehle,false) then break; bekannteBefehle.sort; gibAus('Verstehe Option '''+s+''' nicht beim Einlesen/Berechnen einer Kontur!'#10'Ich kenne:'#10+bekannteBefehle.text,3); @@ -7942,6 +8007,27 @@ begin result:=true; end; +procedure tKontur.erzeugeAlsGerade(sT: boolean; von,bis: tExtPoint; dX,dT: extended); +var + i: longestOrdinal; + r: tExtPoint; +begin + if sT then begin + setLength(orte,1); + orte[0]:=0.5*(von+bis); + exit; + end; + r:=bis-von; + if abs(r['x']*dT) > abs(r['y']*dX) then // mehr Schritte in x-Richtung + setLength(orte,abs(round(r['x']/dX))) + else + setLength(orte,abs(round(r['y']/dT))); + for i:=0 to length(orte)-1 do + orte[i]:= + von + + i/(length(orte)-1) * r; +end; + function tKontur.sortiereNachY(mT: longint): boolean; begin result:=sortiereNachY(mT,0,length(orte)-1); -- cgit v1.2.3-70-g09d2