![]() |
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:
Ich hoffe ihr könnt mir irgendwie helfen, die "Umrechnung der Mausposition zu zeichnen"...
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; MFG Alex |
Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
|
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 |
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 |
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 |
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:
Wobei gilt:
Angle = arctan(dy/dx)
Code:
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 ;)
dy = ym-y
dx = xm-x Hoffe das hilft. Greetz alcaeus |
Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
achja... Die Mathematik :-)
Danke alcaeus... Das wird mir sicher helfen MFG Alex |
Re: Prbl. mit zeichnen meiner Kompo (Sin,Cos)
habe es jetzt mal so hier versucht:
Delphi-Quellcode:
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)
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; Hast du eine Idee woran das liegt? MFG Alex |
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:
zu schreiben, verwende
if ComponentState = [csDesigning] then Exit;
Delphi-Quellcode:
AFAIK kann mehr als nur csDesigning in ComponentState sein ;)
if csDesigning in ComponentState then Exit;
Greetz alcaeus |
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 10:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz