AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sinuskurve auf PlotGrid ausgeben

Ein Thema von fristo23 · begonnen am 15. Feb 2016 · letzter Beitrag vom 19. Feb 2016
Antwort Antwort
Seite 1 von 2  1 2      
fristo23

Registriert seit: 29. Dez 2015
8 Beiträge
 
#1

Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 13:43
Hallo liebe Gemeinde,

ich versuche derzeit eine plattformübergreifende Anwendung mit Delphi zu schreiben. (RAD Studio)
Diese soll eine Kurve darstellen, dazu nun 3 Fragen.

1. Wieso wird bei mir nach dem Zeichnen der Kurve noch eine Linie vom letzten zum ersten Punkt gezeichnet.
2. Weiß jemand ob es (speziell Andorid) möglich ist, in einer gezeichneten Funktion auf einem PlotGrid die Zoomfunktion zu nutzen? Habe eine GestureManger hinzugefügt und Zoomen aktiviert, Zoomt aber nix :/
3. Ich habe versucht über den Timer die Kurve "punktweise" zeichnen zu lassen, also so, dass ein Graph wächst quasi (schlecht zu umschreiben).

Kann mir vielleicht jemand helfen

Ich hänge mal den von Rad Studio (aus einem Tutorial) vorgefertigten Code mit an.
Vielen Dank schon einmal für eure Mühe.


Code:
procedure TForm1.SetParams;
begin
  Resolution := 200;                   // Set resolution to 200 points
  Radian := -2.0 * Pi;                 // Start angle at -2Pi
  xPixels := PlotGrid1.Width / 4;       // Contain graph width within a quarter of the grid width (actually half because of neg values)
  yPixels := PlotGrid1.Height / 4;      // Contain graph height within a quarter of the grid height (actually half because of neg values)
  Origin := PointF(PlotGrid1.Width / 2, // Calculate the center point of the plot grid
    PlotGrid1.Height / 2);
  Interval := 4.0 * Pi / Resolution;   // Set interval between two points in which function values are calculated
end;

procedure TForm1.CalculateSin;
var
  I: Integer;
 begin

  SetLength(FPoints, Resolution);                        // Alloc space for number of points to be calculated
  SetParams;

  for I := 0 to High(FPoints) do
  begin
    FPoints[I].X := Origin.x + Radian * xPixels / Pi;    // Calculate X value with scaling
    FPoints[I].Y := Origin.y - sin(Radian) * yPixels;    // Calculate Y value (f(X)) with scaling
    Radian := Radian + Interval;                         // Set next point
  end;

end;

procedure TForm1.PlotGridPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);

begin
       plotgrid1.Frequency:=1000;


  PlotGrid1.Canvas.StrokeThickness := 1;             // Set stroke thickness

  CalculateSin;                                         // Calculate and scale X and sin(X) values and save them in FPoints
  PlotGrid1.Canvas.Stroke.Color := TAlphaColorRec.Red;  // Set color for sin to red
  PlotGrid1.Canvas.DrawPolygon(FPoints, 1);              // Draw sin graph

end;
Miniaturansicht angehängter Grafiken
12597059_944010609018794_1545547151_o.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 14:29
Zu 1.:

Das ist so dokumentiert
FMX.Graphics.TCanvas.DrawPolygon (Seattle)
Zitat:
Hinweis: Wenn der erste und der letzte Punkt im Points -Array nicht übereinstimmen, verbindet DrawPolygon den ersten und den letzten Punkt automatisch miteinander und schließt das Polygon.
Es gab da allerdings eine geändertes Verhalten zu XE8
FMX.Graphics.TCanvas.DrawPolygon (XE8)
Zitat:
Wenn der erste und der letzte Punkt des Arrays Points nicht übereinstimmen, wird die letzte Seite des Polygons nicht gezeichnet.
Korrekterweise müsste man hier einen Pfad (TPathData ) erzeugen und mit FMX.Graphics.TCanvas.DrawPath arbeiten.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
fristo23

Registriert seit: 29. Dez 2015
8 Beiträge
 
#3

AW: Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 15:26
Vielen Dank für die schnelle Antwort.
Ich guck mir das gleich mal an
BTW ich arbeite mit XE8.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 15:42
BTW ich arbeite mit XE8.
Dann gab/gibt es da wohl einen Fehler in der XE8 Dokumentation
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
fristo23

Registriert seit: 29. Dez 2015
8 Beiträge
 
#5

AW: Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 15:44
Mich verwirrt dabei nur, dass in der Doku die Sinusfunktion normal dargestellt wird. Ich les mich jetzt mal in das TPathData ein und hoffe das ich das umsetzen kann.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 15:46
Mich verwirrt dabei nur, dass in der Doku die Sinusfunktion normal dargestellt wird. Ich les mich jetzt mal in das TPathData ein und hoffe das ich das umsetzen kann.
Du brauchst doch nur in den Source schauen und abschreiben. Das Polygon wird mit einem Pfad gezeichnet. Lediglich am Ende wird der Pfad noch geschlossen.

Use the force of the source, Luke!
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
fristo23

Registriert seit: 29. Dez 2015
8 Beiträge
 
#7

AW: Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 16:01
Das sagst du so leicht
Für mich ist das eine Herausforderung, hab auch erstmal 5 Tage nur gedrosseltes mobiles Internet, von daher ist auch alles ordentlich langsam.
  Mit Zitat antworten Zitat
fristo23

Registriert seit: 29. Dez 2015
8 Beiträge
 
#8

AW: Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 16:23
Ich hab dabei folgendes Problem, ich hab mir ein TPathData angelegt und würde das jetzt in der gleichen Weise befüllen wollen. Bei FPoints, einem einfachen Array konnte ich ja schreiben FPoints[i].X:=.... die Möglichkeit hab ich aber bei dem TPathData nicht. Kann ich das einfach mit TPathData.point:= ... machen?
Ich weiss schon das ist jetzt nicht die beste Frage, aber mir fehlt hier grad der Einstieg.

Danke schon mal
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 17:04
  1. Schreibst du
    PlotGrid1.Canvas.DrawPolygon(FPoints, 1);
  2. Klickst du mit gedrückter STRG-Taste auf DrawPolygon
  3. Kommst du
    Delphi-Quellcode:
    procedure TCanvas.DrawPolygon(const Points: TPolygon; const AOpacity: Single);
    begin
      ...
    end;
  4. Schreibst du ab und kommentierst alle Path.ClosePath; aus
  5. Bist du fertig
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
fristo23

Registriert seit: 29. Dez 2015
8 Beiträge
 
#10

AW: Sinuskurve auf PlotGrid ausgeben

  Alt 15. Feb 2016, 17:14
Meinst du einfach so? DIe komplette Prozedur einfügen?
Wieso hab ich das mit Strg drücken nicht gewusst ;D ich hab mir die Doku durchgelesen, du meintest mit Source aber wirklich Source

Code:
 procedure TCanvas.DrawPolygon(const Points: TPolygon; const AOpacity: Single);
var
  I: Integer;
  Path: TPathData;
  PathBreakFound: Boolean;
begin
  if not DoDrawPolygon(Points, AOpacity, FStroke) then
  begin
    Path := TPathData.Create;
    try
      PathBreakFound := False;
      for I := 0 to High(Points) do
      begin
        if I = 0 then
          Path.MoveTo(Points[I])
        else
        if (Points[I].X = PolygonPointBreak.X) and (Points[I].Y = PolygonPointBreak.Y) then
        begin
         // Path.ClosePath;
          PathBreakFound := True;
        end
        else
          Path.LineTo(Points[I]);
      end;
      if not PathBreakFound then
       // Path.ClosePath;
      DrawPath(Path, AOpacity);
    finally
      Path.Free;
    end;
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz