Benötige Hilfe für Facharbeit (Delphi 7)


#1
Liebe Community,

ich benötige eure Hilfe bei einer Mathematik Facharbeit, in der ich ein Programm entwickeln muss. Mein Thema lautet "Splines und Bezierkurven bei TrueType ähnlichen Schriften".

kurze Einführung in die Problematik:
Buchstaben bei heutigen Rechnern, werden ja nicht mehr nach dem Bausteinprinzip also pixel für pixel aufeinander aufgebaut sondern werden durch Berechnung von Randfunktionen bestimmt, was beim Zoomen zum Beispiel nicht für unscharfe Buchstaben sorgt. Mein Programm soll nun (für den Anfang) einen solchen Buchstaben zeichnen. Dies soll er so leisten:



Die Funktion soll durch zwei Punkt (hier A und C) laufen und durch einen (oder mehrere) Punkte abgelenkt werden. (hier ein Punkt B). Dafür werden imaginäre Strecken zwischen allen nebeneinander liegenden Punkten gedacht, und Punkte auf diesen Strecken definiert die durch einen Parameter 0<t<1 auf dieser Strecke sich von einem bis zum anderen Punkt bewegen. Von diesen Punkten werden wieder die Mittelwerte genommen, und wieder, und wieder, bis nurnoch ein Punkt übrigbleibt. der nun eine Spur vom ersten bis zum letzten Punkt beschreibt welche die Funktion ist.

Mein Problem:
Bei der Übersetzung des Problems in ein Programm weiß ich nicht, wie ich diese Mittelwertberechnung durchführen kann. Ich habe mir überlegt ob man eine Art Rekursion für die Berechnungen heranführen kann. Weiß allerdings nicht genau wie. Habe mich nun schon eine weile daran probiert, doch kriege nichts vernünftiges hin.

HILFE!!^^
 
Zuletzt bearbeitet:

CSANecromancer

Erfahrenes Mitglied
#2
Die Funktion soll durch zwei Punkt (hier A und C) laufen und durch einen (oder mehrere) Punkte abgelenkt werden. (hier ein Punkt B). Dafür werden imaginäre Strecken zwischen allen nebeneinander liegenden Punkten gedacht, und Punkte auf diesen Strecken definiert die durch einen Parameter 0<t<1 auf dieser Strecke sich von einem bis zum anderen Punkt bewegen. Von diesen Punkten werden wieder die Mittelwerte genommen, und wieder, und wieder, bis nurnoch ein Punkt übrigbleibt. der nun eine Spur vom ersten bis zum letzten Punkt beschreibt welche die Funktion ist.
Wenn du das evtl. noch einmal anders erklären/umschreiben könntest, dann kann ich evtl. helfen. Aber so wie es da steht, kann ich mit den Informationen nichts anfangen. Evtl. stehe ich einfach nur auf dem Schlauch.

Ein Source deinerseits, was du bislang zusammen gebastelt hast, könnte auch zum Problemverständnis beitragen.
 
#3
Danke für wenigstens die Reaktion, dass es nich gereicht hat^^
Code:
function TForm1.faltungx(i:integer;var xKoord: array of double;var zKoord: array of double; t:double): double;
begin
   // Von 1 bis Länge des Arrays - 1 (damit ich nurnoch
   // zwei Werte übrig habe um den letzten Punkt zu berechnen
   for i:= 1 to n-1 do
   begin
      //Das soll der Algorithmus sein mit dem er den Punkt berechnet
      //So ganz habe ich auch nicht verstanden, wie das funktionieren soll,
      //Das Programm soll wohl ein array (hier zKoord) durchrechnen bis n-1
      zKoord[i]:= t*xKoord[i] + (1-t)*xKoord[i-1];
   end;
   result:=zKoord[i];
   //und das solange, bis nurnoch zwei Werte übrig sind
   if i=2 then
   begin
      result:=xKoord[1]
   end
   else
      //und wenn nicht, soll die Funktion sich selbst nochmal aufrufen mit
      //dem gerade berechneten Array, welches ja nun einen Wert weniger haben soll
      faltungx(i,zKoord,xKoord,t);
end;
man muss sich das so vorstellen, dass ein punkt auf einer strecke zwischen zwei punkten berechnet wird dieser weiterhin durch eine strecke verbunden is auf der ein weiterer punkt liegt und so weiter...auf Wikipedia gibt es einige gute Darstellungen dieses Problems unter "Bezierkurve"
 

CSANecromancer

Erfahrenes Mitglied
#4
Ich habe mir das jetzt mal ein wenig angeschaut. Mit dem Sourcefragment, das du gepostet hast, habe ich ein paar Probleme.
Nummer 1:
Code:
for i:= 1 to n-1 do
Da n nicht definiert ist, kann das natürlich nicht funktionieren. Meintest du evtl.
Code:
for i := 1 to high(xKoord) -1 do
?

Nummer 2:
Code:
result:=zKoord[i];
//und das solange, bis nurnoch zwei Werte übrig sind
if i=2 then
begin
result:=xKoord[1]
end
else
//und wenn nicht, soll die Funktion sich selbst nochmal aufrufen mit
//dem gerade berechneten Array, welches ja nun einen Wert weniger haben soll
faltungx(i,zKoord,xKoord,t);
Du weist zwar Result den Wert deiner Berechnung zu... aber was machst du dann damit? Weder xKoord noch zKoord werden verändert.
Fehlt da evtl. noch ein Schritt?
Wo verringerst du die Anzahl von xKoord oder zKoord?
Der erneute rekursive Aufruf von faltung() kann nichts bringen, da kein Ende des Algorithmus erreicht wird, da xKoord und zKoord in der Größe unverändert bleiben.