AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Prbl. mit zeichnen meiner Kompo (Sin,Cos)
Thema durchsuchen
Ansicht
Themen-Optionen

Prbl. mit zeichnen meiner Kompo (Sin,Cos)

Ein Thema von Alex_ITA01 · begonnen am 12. Mai 2005 · letzter Beitrag vom 12. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

Prbl. mit zeichnen meiner Kompo (Sin,Cos)

  Alt 12. Mai 2005, 10:37
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
Angehängte Grafiken
Dateityp: bmp kreis_981.bmp (44,6 KB, 16x aufgerufen)
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

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

  Alt 12. Mai 2005, 10:41
Hallo Alex,

sieh dir mal Delphi-Referenz durchsuchenTControl.ScreenToClient an.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 12. Mai 2005, 10:45
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#4

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

  Alt 12. Mai 2005, 10:50
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 12. Mai 2005, 11:00
werde es mal versuchen...
Stehe trotzdem noch irgendwie auf dem Schlauch... Hast du ein kleinen Codeschnipsel für mich?

MFG Alex
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#6

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

  Alt 12. Mai 2005, 11:06
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 12. Mai 2005, 11:15
achja... Die Mathematik

Danke alcaeus...
Das wird mir sicher helfen

MFG Alex
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 12. Mai 2005, 11:52
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#9

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

  Alt 12. Mai 2005, 11:56
Hallo Alex,

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

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 12. Mai 2005, 12:29
Also meinst du , RadToDeg würde helfen?

Danke für den Tip mit dem ComponentState

MFG Alex
Let's fetz sprach der Frosch und sprang in den Mixer
  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 14:25 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