Einzelnen Beitrag anzeigen

Renate Schaaf

Registriert seit: 25. Jun 2020
Ort: Lippe
135 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: Ellipsenalgo aus Formelsammlung kreieren

  Alt 10. Jul 2025, 09:27
Also, Ihr wollt z.B. eine Ellipse aus Smileys zeichnen, und dabei sollen die immer den gleichen Abstand haben?
Dazu braucht man eine variable Schrittweite. So ganz krieg ichs nicht hin für die Extremfälle, da brauchts eine bessere Schrittweitensteuerung, und das Schließen der Ellipse ist auch ein Problem. Sh. Anhang.

Für die Schrittweite braucht man die Formel für die Länge einer Kurve, nicht die explizite Formel, man muss nur wissen, wie die in Abhängigkeit vom Parameter t wächst:

(x(t),y(t)) : Kurve l(t): Länge der Kurve.

dl/dt = sqrt((x'(t))² + (y'(t))²) (Ableitungen)

Wenn man jetzt so tut, als wäre dl kein Differential sondern ein Abstand, und dt ein t-Schritt, dann möchte man dl konstant haben. Die Konstante nenne ich mal dist, wie Distanz. Das gibt

dt = dist/sqrt((x'(t))² + (y'(t))²)

Für die Ellipse: x(t) = xm + a*cos(t) y(t) = ym + b*sin(t) x'(t) = -a*sin(t) = -a/b*(y-ym) y(t) = b*cos(t) = b/a*(x-xm)
(Achtung: t ist hier in radian, sonst stimmen die Ableitungen nicht)

dt = dist/sqrt(sqr(a/b*(y-ym))+sqr(b/a*(x-xm))

Hier ist der Code für mein Testprogramm:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var xm,ym,x,y,t,dt,a,b, dist: double;
    xp,yp: integer;
begin
  Image1.Picture.Bitmap.SetSize(image1.width,image1.height);
  Image1.Picture.bitmap.Canvas.Brush.Color:=clblack;
  Image1.picture.bitmap.canvas.FillRect(Image1.clientrect);
  xm:=image1.Width/2; ym:=image1.Height/2;
  a:=Spinedit1.Value; b:=Spinedit2.Value;
  dist:=Spinedit3.Value;
  t:=0;
  while t<2*Pi do
  begin
    x:=a*cos(-t);
    y:=b*sin(-t);
    xp:=round(xm+x);
    yp:=round(ym+y);
    image1.Picture.Bitmap.Canvas.Draw(xp-8,yp-8,image2.Picture.Graphic);
    dt:=dist/sqrt(sqr(a/b*y)+sqr(b/a*x));
    t:=t+dt;
  end;
end;
Miniaturansicht angehängter Grafiken
smileyellipse.jpg  
Renate
  Mit Zitat antworten Zitat