AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi In Koordinatensystem auf Punkt "zuzoomen"

In Koordinatensystem auf Punkt "zuzoomen"

Ein Thema von Fussball-Robby · begonnen am 16. Okt 2010 · letzter Beitrag vom 17. Okt 2010
Antwort Antwort
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#1

In Koordinatensystem auf Punkt "zuzoomen"

  Alt 16. Okt 2010, 23:37
Hey,
ich programmiere gerade ein dynamisches Koordinatensystem zur Darstellung von Funktionsgraphen. Man soll auch zoomen können. Das Fenster ist begrenzt durch einen Start-/Endwert von X bzw. Y (sprich: X-Werte gehen von StartX bis EndX, y-Werte von StartY bis EndY).
Das Zoomen ohne Verschieben des Koordinatenursprungs ist kein Problem, dazu versehe ich einfach alle 4 Grenzwerte mit einem Faktor, beispielsweise 1,1.

Nun will ich aber auf einen Punkt "zuzoomen". Wenn man also die Maus auf eine bestimmte Stelle des Graphen hält und hochscrollt, soll das Fenster sich nach und auf diesen Punkt zentrieren. Die 4 Grenzwerte StartX, EndX, StartY und EndY müssen also verschieden verändert werden. Aber wie? Koordinaten des Cursors sind natürlich bekannt. Hat jemand Ideen?

[Edit]Habs selbst gelöst. Musste für den x-Zoom beispielsweise die relative x-Position (also in Prozent) ausrechnen. Die linke Grenze wird dann um diese "X" Prozent größer, die rechte Grenze um (1-X) Prozent kleiner. Grüße

[Edit2] Igrendwie will das doch noch nicht so recht.. Denn wenn eine Grenze bei 0 ist, bringt eine prozentuale Veränderung nichts mehr.. Ich probiere gerade eigentlich nur rum. Ideen sind immer noch willkommen!
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox

Geändert von Fussball-Robby (17. Okt 2010 um 00:19 Uhr)
  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: In Koordinatensystem auf Punkt "zuzoomen"

  Alt 17. Okt 2010, 00:29
Du musst zunächst die Cursor-Position auf deine Koordinatenposition (x,y) umrechnen.
Dann kannst du die neuen min,max Werte wie folgt berechnen
Code:
Ymaxneu = (Ymax + y) / Zoom
Yminneu = (Ymin + y) / Zoom
Xmaxneu = (Xmax + x) / Zoom
Xminneu = (Xmin + x) / Zoom
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
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: In Koordinatensystem auf Punkt "zuzoomen"

  Alt 17. Okt 2010, 10:10
und wenn Du die Zeichenroutinen/Berechnungen unangetastet lässt und nur das Rendering anpasst?
Delphi-Quellcode:
unit ExCanvasTools;
// 20100915 by Thomas Wassermann
interface
uses
  Windows, SysUtils, Classes, Graphics;

  Function Grad2Rad(w:Double):Double;
  Procedure PaintGraphic(ACanvas:TCanvas;x,y:Integer;AGraphic:TGraphic;Faktor,Winkel:Double;PosIsCenter:Boolean=false);
  Procedure PaintText(ACanvas:TCanvas;Const s:String;x,y:Integer;Faktor,Winkel:Double;PosIsCenter:Boolean=false);
  Procedure ResetCanvas(ACanvas:TCanvas);
  procedure SetCanvasZoomAndRotation(ACanvas: TCanvas;Zoom:Double;Angle:Double;CenterpointX,CenterpointY:Double);

implementation

Function Grad2Rad(w:Double):Double;
  begin
     Result := w / 360 * PI *2;
  end;

Procedure PaintText(ACanvas:TCanvas;Const s:String;x,y:Integer;Faktor,Winkel:Double;PosIsCenter:Boolean=false);
var
  px,py:Integer;
begin
     SetCanvasZoomAndRotation(ACanvas , Faktor, Winkel, x,y);
     if PosIsCenter then
        begin
          px := Round( ACanvas.TextWidth(s) / 2 );
          py := Round( ACanvas.TextHeight(s) / 2 );
        end
     else
        begin
          px := 0;
          py := 0;
        end;

     ACanvas.TextOut(-px ,-py ,s);
     ResetCanvas(ACanvas);
end;




Procedure PaintGraphic(ACanvas:TCanvas;x,y:Integer;AGraphic:TGraphic;Faktor,Winkel:Double;PosIsCenter:Boolean=false);
var
  px,py:Integer;
begin
     if PosIsCenter then
        begin
          px := Round( AGraphic.Width / 2 );
          py := Round( AGraphic.Height / 2 );
        end
     else
        begin
          px := 0;
          py := 0;
        end;
     SetCanvasZoomAndRotation(ACanvas , Faktor, Winkel, x , y );
     ACanvas.Draw(-px ,-py ,AGraphic);
     ResetCanvas(ACanvas);
end;





Procedure ResetCanvas(ACanvas:TCanvas);
begin
   SetCanvasZoomAndRotation(ACanvas , 1, 0, 0,0);
end;

Procedure SetCanvasZoomAndRotation(ACanvas:TCanvas;Zoom:Double;Angle:Double;CenterpointX,CenterpointY:Double);
var
    form : tagXFORM;
    Winkel:Double;

begin
      Winkel := Grad2Rad(Angle);
      SetGraphicsMode(ACanvas.Handle, GM_ADVANCED);
      SetMapMode(ACanvas.Handle,MM_ANISOTROPIC);
      form.eM11 := Zoom * cos( Winkel);
      form.eM12 := Zoom *Sin( Winkel) ;
      form.eM21 := Zoom * (-sin( Winkel));
      form.eM22 := Zoom * cos( Winkel) ;
      form.eDx := CenterpointX;
      form.eDy := CenterpointY;
      SetWorldTransform(ACanvas.Handle,form);
end;

end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 02:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf