Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Prbl. mit zeichnen meiner Kompo (Sin,Cos) (https://www.delphipraxis.net/45784-prbl-mit-zeichnen-meiner-kompo-sin-cos.html)

Alex_ITA01 12. Mai 2005 10:37


Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo erstmal,
ich habe ein komisches Problem und komme da nicht weiter.
Ich hoffe ihr könnt mir helfen...

Folgende Situation:
Ich habe eine eigene Kompo mit einem Kreis in der Mitte. Von diesem Kreis, zeichne ich immer anhand eines Wertes (0-100%) eine Linie vom Mittelpunkt bis zu den Wert in Grad umgerechnet. Z.B. Mein Wert hat 100%, dann zeichne ich einfach eine Linie vom Mittelpunlt bis 0° (also senkrecht nach oben).
Hat mein Wert 25% dann zeichne ich 90° (also waagerecht nach rechts).

Der Wert wird immer vorgegeben...

Jetzt soll der User aber die Möglichkeit haben, die Linie, die ich zeichne selber zu "setzen" (MouseDown) und dementsprechend wird der Wert angepasst.
Ich habe mal eine kleine Grafik angehangen. Die blauen Kreuze kennzeichnen ein möglichen Mausklick. Die gestrichelte Linie in der Mitte stellt eine mögliche Linie vom Mittelpunkt dar.

Das Problem jetzt ist, wenn die Maus irgendwo hin klickt (aber innerhalb meiner Kompo) wie wandle ich den Wert (X,Y) dann so um, damit ich weiß, wohin ich zeichnen muss?

Delphi-Quellcode:
procedure TMeineKompo.Paint;
var
  tmpValue,
  tmpGrad : Double;
  tmpX,
  tmpY    : Integer;
begin
  inherited Paint;
  if ComponentState = [csDesigning] then Exit; { Nur zur Laufzeit ausführen }

  tmpValue := Wert; //Enthält mein %Wert
  tmpGrad := (tmpValue * 360) / MaxWert; //Enthält den Maximalwert meines %Wertes (=100)

  tmpX := Round(sin(DegToRad(tmpGrad)) * Radius);
  tmpY := Round(cos(DegToRad(tmpGrad)) * Radius);

  Canvas.MoveTo(Self.Mittelpunkt.X, Self.Mittelpunkt.Y);
  Canvas.LineTo(Self.Mittelpunkt.X + tmpX, Self.Mittelpunkt.Y - tmpY);
end;
Ich hoffe ihr könnt mir irgendwie helfen, die "Umrechnung der Mausposition zu zeichnen"...


MFG Alex

alcaeus 12. Mai 2005 10:41

Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
Hallo Alex,

sieh dir mal Delphi-Referenz durchsuchenTControl.ScreenToClient an.

Greetz
alcaeus

Alex_ITA01 12. Mai 2005 10:45

Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
danke für den Tip aber da bekomme ich die X und Y Werte heraus, dass stimmt. Nur wie weiß ich jetzt, wieviel Grad das von "Norden" (0°) zu zeichnen sind?!

MFG Alex

alcaeus 12. Mai 2005 10:50

Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
Naja, du hast X und Y des Punktes. Zusammen mit X und Y des Mittelpunktes, weisst du wie der Punkt im Verhaeltnis zum Mittelpunkt liegt. Mit Hilfe von arctan usw. kannst du den Winkel ausrechnen.

Greetz
alcaeus

Alex_ITA01 12. Mai 2005 11:00

Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
werde es mal versuchen...
Stehe trotzdem noch irgendwie auf dem Schlauch... Hast du ein kleinen Codeschnipsel für mich?

MFG Alex

alcaeus 12. Mai 2005 11:06

Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
Hallo Alex,

also, der tan eines Winkels ist definiert als das Verhaeltnis zw. Gegenkathete (y) und Ankathete (x). Wenn wir nun den umgekehrten Weg gehn, bekommen wir den Winkel:

Code:
Angle = arctan(dy/dx)
Wobei gilt:
Code:
dy = ym-y
dx = xm-x
X, Y sind die Koordinaten des Punktes, Xm und Ym jene des Mittelpunktes. Beachte dass du allerdings nicht den Winkel von Norden, sondern vom "mathematischen Nullwinkel" (=Osten) bekommst. Das Umzurechnen duerfte kein Problem sein. Weiters gibt der ArcTan nur Werte zwischen -90 und +90 Grad zurueck, d.h. du musst anhand de Vorzeichen von dx und dy rausfinden, im welchen Quadranten der Punkt liegt und den Winkel dahinrechnen (Mathe ist zu lange her als dass ich jetzt gleich wuesste wie das geht). Sobald du den "wirklichen" Ergebniswinkel des arctan hast, kannst du diesen auf deinen Nullpunkt rechnen (-90 Grad wenn ich richtig gedacht habe), und fertig ;)

Hoffe das hilft.

Greetz
alcaeus

Alex_ITA01 12. Mai 2005 11:15

Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
achja... Die Mathematik :-)

Danke alcaeus...
Das wird mir sicher helfen

MFG Alex

Alex_ITA01 12. Mai 2005 11:52

Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
habe es jetzt mal so hier versucht:

Delphi-Quellcode:
procedure TMeineKompo.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  tmpGrad : Double;

  Point : TPoint;

  dy,
  dx : Integer;
begin
  inherited;
  if ComponentState = [csDesigning] then Exit; { Nur zur Laufzeit ausführen }

  if Button = mbLeft then
  begin
    if Style = tsLine then
    begin
      Point.X := X;
      Point.Y := Y;

      dy := Self.Mittelpunkt.Y - Point.Y; //Mittelpunkt enthält nur die X und Y von dem Kreis.
                                             Nicht von der gesamten Komponente
      dx := Self.Mittelpunkt.X - Point.X;

      tmpGrad := ArcTan(dy/dx);
    end;
  end;
end;
Leider gibt mir ArcTan immer nur Werte im Bereich von -2 bis +2 zurück. (ich hatte immer so 1,8... -1,3 obwohl ich an komplett verschiedene Stellen geklickt habe)

Hast du eine Idee woran das liegt?

MFG Alex

alcaeus 12. Mai 2005 11:56

Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
Hallo Alex,

du bekommst den Winkel im Bogenmass. Sonst seh ich keinen Fehler, aber ich habe einen kleinen Tipp: anstatt
Delphi-Quellcode:
if ComponentState = [csDesigning] then Exit;
zu schreiben, verwende
Delphi-Quellcode:
if csDesigning in ComponentState then Exit;
AFAIK kann mehr als nur csDesigning in ComponentState sein ;)

Greetz
alcaeus

Alex_ITA01 12. Mai 2005 12:29

Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
 
Also meinst du , RadToDeg würde helfen?

Danke für den Tip mit dem ComponentState :-)

MFG Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 Uhr.
Seite 1 von 2  1 2      

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