AGB  ·  Datenschutz  ·  Impressum  







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

Quadratische fkt. Zeichnet nicht

Ein Thema von mortality · begonnen am 12. Mär 2008 · letzter Beitrag vom 13. Mär 2008
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#31

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:05
Hast du denn überhaupt schon etwas von dem probiert, was dir hier gesagt wurde. Sich einfach nur "dumm" stellen und denken, dass dir hier einer eine Lösung auf dem Silbertablett präsentiert, das wird wohl kaum der Fall sein.

Wo genau hakt es denn bei TChart?
  Mit Zitat antworten Zitat
mortality

Registriert seit: 12. Mär 2008
30 Beiträge
 
#32

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:14
genau das problem ist es ja ich kann mirs überhaupt nicht vorstellen!

also wenn ich dan den graph über den tchart ausgebe sieht es dann genau so aus wie bei der tpaintbox odet timage.(ohne jegliche einteilung)
wenn ich im design menü doppelklick auf tchart mache ..dankt ein menü über versch einstellungen un diagramme....aber was soll ich dort drin jetzt einstellen???
  Mit Zitat antworten Zitat
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#33

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:15
Funktioniert dieser Quellcode richtig?
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ed_a: TEdit;
    ed_b: TEdit;
    ed_c: TEdit;
    edbereich: TEdit;
    edscalex: TEdit;
    edscaley: TEdit;
    btsolve: TButton;
    btreset: TButton;
    functionbox: TPaintBox;
    procedure btSolveClick(Sender: TObject);
    procedure ClearBox();
    procedure btResetClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure functionboxPaint(Sender: TObject);
     private
       { Private-Deklarationen } 
      FHasFunction: Boolean;
     public
       { Public-Deklarationen } 
     end;

   var
     Form1: TForm1;

   implementation

   {$R *.DFM} 

   procedure TForm1.btSolveClick(Sender: TObject);
   var i,a,b,c,bereich,goright,goup: Integer;
       y1,y2,scalex,scaley: Real;
   begin
     bereich:= Round(StrToInt(edbereich.Text)/2); //Breite eines Parabelastes
     scalex:= StrToFloat(edscalex.Text); //Zoomfaktor für x-Achse(z.B. wenn man Breite halbieren will ScaleX:= 0,5)
     scaley:= StrToFloat(edscaley.Text); //Zoomfaktor für y-Achse

     goright:= Round(FunctionBox.Width/2); //GoRight schiebt Fkt nachrechts um sie in die Mitte zu bringen
     goup:= Round(FunctionBox.Height/2); //GoUp schiebt Fkt nach oben umsie in die Mitte zu bringen

    ClearBox;
    FHasFunction := true;
     For i:= -(bereich) to (bereich-1) do
     begin
       a:= StrToInt(ed_a.Text);
       b:= StrToInt(ed_b.Text);
       c:= StrToInt(ed_c.Text);
       y1:= (a*(i*i)+b*i+c); //Funktion für x alsAusgangspunkt für die Linie
       y2:= (a*((i+1)*(i+1))+b*(i+1)+c); //Funktion für dennachfolgenden Wert von x für Endpunkt der Linie

       with FunctionBox do
       begin
         Canvas.Pen.Color:= clBlack;
      Canvas.MoveTo(Round((i)*scalex + goright), Height-Round(y1*scaley) -goup);
                                                    //MoveTo läst denCanvaszeiger zum Ausgangspunkt gehen
                                                    //*ScaleY skalliert die Parbel(kann man als einfachen Zoom verstehen)
                                                    //z.B.: Verdoppeln entspricht2; Halbieren entspricht 0,5
      Canvas.LineTo(Round((i+1)*scalex + goright), Height-Round(y2*scaley) -goup);
                                                    //LineTo ziechnet eine Linievon Ausgangspunkt zu Endpunkt
                                                    //also von (x1,y1) zu (x2,y2)wobei x1=i, x2=(i+1), y1,y2 wurden vorher berechnet
         //So wird die ganze Funktion im Bereich durchgerechnet und von jedem Punktzum nächsten eine Linie gezeichnet
    end;
     end;
   end;

   procedure TForm1.ClearBox(); //Prozedur, die ein simples Koordinatensystemzeichnet
   begin
     with FunctionBox do
     begin
       Canvas.Pen.Color:= clGray;
       Canvas.Brush.Color:= clWhite;
    Canvas.Rectangle(0,0,Width,Height); //zeichnet Rahmen
       Canvas.MoveTo(0,round(Height/2));
       Canvas.LineTo(Width,round(Height/2)); //zeichnet x-Achse
       Canvas.MoveTo(round(Width/2),0);
       Canvas.LineTo(round(Width/2),Width); //zeichnet y-Achse
  end;
   end;

   procedure TForm1.FormCreate(Sender: TObject);
begin
  FHasFunction := false;
end;

procedure TForm1.functionboxPaint(Sender: TObject);
begin
  if FHasFunction then
    btSolveClick(self)
  else
    ClearBox;
end;

procedure TForm1.btResetClick(Sender: TObject);
begin
  FHasFunction := false;
  invalidate;
end;

end.
Wenn ja, dann arbeite doch damit weiter.

mfg Looper
  Mit Zitat antworten Zitat
mortality

Registriert seit: 12. Mär 2008
30 Beiträge
 
#34

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:20
arbeite weiter...bloß an was?
wir haben im informatik unterricht noch nie mit canvas programmiert....ich hab mir mit mühe hier das zeug herausgehollt.
hab aber wirklich kp wie ich weiter machen soll....
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#35

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:23
Naja, mir fällt da noch eine "Schummellösung" ein: eine Vektorgrafik (wmf, als Klassen TMetaFile und TMetaFileCanvas) im Speicher erzeugen, dort alles maßstabgetreu drauf zeichnen und diese dann per StretchBlt auf die PaintBox klatschen, erspart eine Menge Arbeit beim Skalieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mortality

Registriert seit: 12. Mär 2008
30 Beiträge
 
#36

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:30

ich bereuhe es informatik leistungskurs genommen zu haben....ich verstehe nur bahnhof
  Mit Zitat antworten Zitat
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#37

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:41
Also ich gebe jetzt einfach mal ein Beispiel, wie ich das machen würde (vielleicht nicht die beste Methode, aber sie funktioniert und ist einfach zu verstehen - hoffe ich jedenfalls):

Du nimmst dir ein Image und gibst ihm eine gewisse Breite (Width, z.B. 800) und Höhe (Height, z.B. 600). Nun hat die Imagekomponente sein eigenes Canvas (=Leinwand). Auf diesem Canvas kannst du jedes einzelne Pixel ansprechen und färben oder auch Linien, Kreise, Rechtecke, etc. zeichnen. Als Angabe gibtst du immer die Pixel an und zwar ist die Position 0|0 oben links in der Ecke und 800|600 unten rechts.
Hoffe das hast du soweit verstanden, wenn du Fragen zu Befehlen des Canvas hast, siehe hier:
http://www.delphi-treff.de/tipps/grafik/tipp/263/

Und jetzt die Idee zum Zeichnen. Als erstes malst du ein Koordinatenkreuz mit den Methoden
Delphi-Quellcode:
//Koordinatenkreuz zeichnen
Image1.Canvas.MoveTo(Image1.Width div 2,0); //Cursor bewegt sich oben mitte
Image1.Canvas.LineTo(Image1.Width div 2,Image1.Height); //Cursor zeichnet unten mitte
Image1.Canvas.MoveTo(0, Image1.Height div 2); //Cursor bewegt sich nach links mitte
Image1.Canvas.LineTo(Image1.Width, Image1.Height div 2); //Cursor zeichnet rechts mitte
Nun legst du zwei Variablen an: EinheitX und EinheitY, beide vom Typ Single. Diese Einheiten brauchst du um eine Skalierung hinzubekommen und den Graph richtig zu zeichnen.
EinheitX ist leicht auszurechnen: Teile einfach die Breite des Images durch die Anzahl deiner X.
Wenn du z.B. den Graphen von -5 bis 5 X zeichnen willst, dann hats du 11x (Die 0 zählt mit) also istEinheitX := Image1.Width / 11; Bei EinheitY brauchst du den maximalen Funktionswert für deine X-Spanne, also wenn du die Funktion X^2 zeichnest (von X = -2 .. 2) dann ist der maximale Funktionswert = 4, da 2^2 bzw. -2^2 = 4 ist.
Also rechnest du
EinheitY := Image1.Height / 4 * 2 Das "*2" ist wichtig, weil du ja das feste Koordinatenkreuz in der Mitte hast.
Wie du den maximalen Funktionswert herausbekommt kannst du ja mal überlegen. Tipp: Schleife

Nun musst du hinterher nur noch zeichnen und die Skalierungen vornehmen, aber versuche erstmal das oben genannte zu verstehen. Bei Fragen immer her damit. Ich werde mein Bestes versuchen

mfg Looper

[Edit] Gib nicht auf, wenn du den Grundgedanken raus hast, is es gnaz leicht!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#38

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:47
OK, schau Dir mal dieses Beispiel an (hat jetzt nix mit der Vektorgrafik zu tun):
Delphi-Quellcode:
procedure TForm1.ClearBox(); //Prozedur, die ein simples Koordinatensystemzeichnet
const Abst = 10; //10 Pixel Abstand zwischen den Markierungen
var x,y,i: integer;
begin
  with FunctionBox do
  begin
    Canvas.Pen.Color:= clGray;
    Canvas.Brush.Color:= clWhite;
    Canvas.Rectangle(0,0,Width,Height); //zeichnet Rahmen
    y := round(Height/2);
    //Markierungen von der Mitte nach unten
    while y < Height do
      begin
        Canvas.MoveTo(round(Width/2) - 5, y);
        Canvas.LineTo(round(Width/2) + 5, y);
        inc(y,Abst);
      end;
    y := round(Height/2);
    //Markierungen von der Mitte nach oben
    while y > 0 do
      begin
        Canvas.MoveTo(round(Width/2) - 5, y);
        Canvas.LineTo(round(Width/2) + 5, y);
        dec(y,Abst);
      end;
    x := round(Width/2);
    //Markierungen von der Mitte nach rechts
    while x < Width do
      begin
        Canvas.MoveTo(x,round(Height/2) + 5);
        Canvas.LineTo(x,round(Height/2) - 5);
        inc(x,Abst);
      end;
    x := round(Width/2);
    //Markierungen von der Mitte nach links
    while x > 0 do
      begin
        Canvas.MoveTo(x,round(Height/2) + 5);
        Canvas.LineTo(x,round(Height/2) - 5);
        dec(x,Abst);
      end;
    Canvas.MoveTo(0,round(Height/2));
    Canvas.LineTo(Width,round(Height/2)); //zeichnet x-Achse
    Canvas.MoveTo(round(Width/2),0);
    Canvas.LineTo(round(Width/2),Width); //zeichnet y-Achse
  end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bluesbear

Registriert seit: 14. Dez 2005
Ort: Hahnstätten
355 Beiträge
 
Delphi 2007 Enterprise
 
#39

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 21:58
Zitat von mortality:
ich bereuhe es informatik leistungskurs genommen zu haben....ich verstehe nur bahnhof :
Bei Dir krieg ich jetzt langsam das entgegengesetzte Gefühl vom Paranoia (gibt es eigentlich ein Wort dazu?) Du bist IMHO zu schlau. Das ist wirklich so einfach! Mach Experimente! Solange rumklicken, bis das Programm tut, was du willst. Ich kann mich natürlich auch irren, aber Dein Verhalten erinnert mich grad an mich in Bezug auf Computer, als ich zum ersten mal damit in Kontakt kam.
Klaus M. Hoffmann
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#40

Re: Quadratische fkt. Zeichnet nicht

  Alt 13. Mär 2008, 22:00
Zitat von bluesbear:
Bei Dir krieg ich jetzt langsam das entgegengesetzte Gefühl vom Paranoia (gibt es eigentlich ein Wort dazu?)
Verfolgerwahn?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 22:55 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