![]() |
Benötige Hilfe von einen Mathematiker
Liste der Anhänge anzeigen (Anzahl: 1)
Mein Problem ist folgendes.
Ich möchte ein Rundes Frame erstellen (kein Problem) Unter diesen sollen dann abhängig vom Radius den der user über zwei Punkte bestimmt meine VisRadioButton positioniert werden. Gehe ich nun von Rund aus dann ist der anfangspunkt an dem der Pfeil nach links steuert und der Endpunkt wo der Pfeil sitzt der nach rechts die Plugins weiter schaltet. Also Links .. (Point x,y) und rechts (Point x,y) dazwichen sollen nun die RadioButton stehen abhängig vom Kreisbogen der übergeben wird. Habe es nicht so mit Tangent,Sinus und Konsorte. :oops: Kann mir jemand ein Beispiel erstellen mit simplen RadioButton die sich um einen Ovalen oder Runden Kreis positionieren ? Hab ein Pic angehängt wie das aussehen soll. Meine Idee dabei ist wenn jemand einen Skin macht möchte ich nicht die Button unbedingt immer horizontal an eine Fix position setzen. Das Vis Window soll dann etwa 320x240 in der mitte des Kreises sitzen oder so wie der User es angibt. Auf jedenfall 4x3 gruss Emil |
Re: Benötige Hilfe von einen Mathematiker
Also das Problem hört sich für mich nicht unlösbar an. Du kannst ausgehend von dem Mittelpunkt des Kreises deine Buttons anhand einens größeren Radius und fest vorgegebenen Winkeln relativ einfach anordnen. Dies wird dadurch vereinfacht, dass auch die Radionbuttons, von denen du sprichst mit der linken oberen Ecke referenziert wird.
Du kannst also einfach mit folgendem Vorgehen die Positionen deiner Buttons festlegen: geg: Raduis des Kreises R x-Koordinate des Kreismittelpunktes X y-Koordinate des Mittelpunktes Y Für das Beispiel nehmen wir jetzt einfach mal einen um 20 Pixel größeren Radius an --> R+20 Der Startwinkel soll 30° sein Damit ergibt sich als x-Koordinate XB1 für den ersten Button: XB1 = X - (R+20)*Sin(30°) und für die Y-Koordinate YB1 YB1 = Y - (R+20)*Cos(30°) der nächste Button soll um 5° weiter vom 1. Button liegen: XB2 = X - (R+20)*Sin(35°) und für Y-Koordinate YB2 = Y - (R+20)*Cos(35°) und so weiter. Hoffe das hilft dir erstmal. Kann dir leider kein gesondertes Programm schreiben, da ich noch nicht so viel mit Grafik programmiert habe. Wenn du noch fragen hast, schreib mir einfach. MfG BAMatze |
Re: Benötige Hilfe von einen Mathematiker
Moin, Moin.
Bin kein Mathematiker, ich versuch's trotzdem mal... Wenn ich's richtig verstehe, dann definiert der User durch die beiden Punkte den Kreisdurchmesser. Der Kreisdurchmesser entspricht der Hypotenuse des Rechtecks. Damit sind wir wohl bei a²+b²=c² angelangt. Da das Seitenverhältnis des Rechtecks 4 zu 3 sein soll, also b/a=3/4 (Sorry, keine Ahnung, wie man hier Formeln darstellen kann). Das wird umgestellt, z.B. in b=3*a/4 und setzt das ein: c=Wurzel(a²+(3*a/4)²). Das c ist die Länge der Hypotenuse (=Punktabstand), also bekannt. Deshalb Auflösen nach a (oder ganz banal iterieren). Wenn a gefunden, b ausrechnen. Damit hast du die Abmessungen des Buttons. Nun fehlt noch die Position - da kannst du ja vielleicht noch mal selber überlegen. // Hmmm, sehe gerade eine andere Antwort. Na, ich schicke meinen Ansatz mal ab :stupid: da ich die Aufgabenstellung doch irgendwie völlig anders verstanden habe. // Ohh, die Punkte um den Kreis herum waren gefragt. Na dann kann meine Antwort in den Papierkorb :roll: |
Re: Benötige Hilfe von einen Mathematiker
In diesem Sinne wäre es praktisch, mehr Infos zu haben:
:arrow: Was ist gegeben? Gehen wir vom Kreis aus und soll am besten noch das Rechteck berechnet werden oder ist das Rechteck gegeben? :arrow: Sollen die Knöpfe am Rand im gleichen Abstand oder in gleichen Winkeln angeordnet sein? Oder eine Mischung beider (Minimaler Abstand damit sie sich nicht überlappen ansonsten konstanter Winkel?) Ach, und das: Zitat:
Oder heißt das, dass du 2 Punkte gegeben hast und zwischen diesen beiden Punkten eine gewisse Anzahl anderer Knöpfe anordnen möchtest? Grüße von Julius, der gleich in die "Höhere Mathematik 3"-Vorlesung geht ;) |
Re: Benötige Hilfe von einen Mathematiker
Liste der Anhänge anzeigen (Anzahl: 1)
So viel hab ich aus dem obigen Text verstanden:
Zitat:
Delphi-Quellcode:
type
TPointArray = array of TPoint; function KreisPunkte( P: TPoint; {Mittelpunkt des Kreises auf dem die Punkte liegen} R: Word; {Radius des Kreises} Alpha: Double; {Winkel 0..360 für den Ersten Punkt; 0 = 0Uhr; 90 = 3Uhr} StepAlpha: Double; {Winkel zwischen den Punkten} StepCount: Integer {Anzahl der Punkte} ): TPointArray; var i: Integer; begin {Grad in Bogenmaß umrechnen} Alpha := DegToRad(Alpha); StepAlpha := DegToRad(StepAlpha); SetLength(Result, StepCount); for i := 0 to StepCount - 1 do begin with Result[i] do begin x := P.x + Round(R * sin(Alpha)); y := P.y - Round(R * cos(Alpha)); end; Alpha := Alpha + StepAlpha; end; end; procedure TForm1.PaintBox1Paint(Sender: TObject); var PointArray: TPointArray; P: TPoint; R: Word; i: Integer; s: String; begin with PaintBox1 do begin P.x := Left + (Width div 2); P.y := Top + (Height div 2); R := (Min(Width, Height) div 2) - 40; PointArray := KreisPunkte(P, R, 180, 15, 6); {Ausgabe Punkt P} Canvas.Pen.Color := clBlack; Canvas.MoveTo(P.x, P.y - 4); Canvas.LineTo(P.x, P.y + 5); Canvas.MoveTo(P.x - 4, P.y); Canvas.LineTo(P.x + 5, P.y); {Ausgabe Kreis um P mit Radius R} Canvas.Brush.Style := bsClear; Canvas.Pen.Color := clBlack; Canvas.Pen.Style := psDot; Canvas.Ellipse(P.x - R, P.y - R, P.x + R, P.y + R); {Ausgabe Punkte auf dem Kreis} for i := Low(PointArray) to High(PointArray) do begin s := IntToStr(i + 1); with PointArray[i] do begin Canvas.Brush.Color := clYellow; Canvas.Brush.Style := bsSolid; Canvas.Pen.Color := clBlack; Canvas.Pen.Style := psSolid; Canvas.Ellipse(x - 10, y - 10, x + 10, y + 10); Canvas.Brush.Style := bsClear; Canvas.Font.Color := clRed; Canvas.TextOut(x - (Canvas.TextWidth(s) div 2), y - (Canvas.TextHeight(s) div 2), s); end; end; end; end; |
Re: Benötige Hilfe von einen Mathematiker
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:
Eigentlich hat das nichts mit Grafik zu tun sondern mit Controls. Aber dein Grundgedanke ist schon richtig. Einfache Radiobutton werden auf die Form gelegt und diese sollen sich dann ausgehend von den Eckpunkten um den Kreis positionieren. Das problem bei mir ist halt die Berechnung. Wobei man nicht vergessen darf, wird die Form in der größe verändert, verändert sich der Kreisbogen was bedeutet die angegebenen Eckpunkte müssen zur größe der Form und den Mittelpunkt des Kreises berechnet werden. Die Form bleibt ja nicht immer genau Quadratisch wenn man sie vergrößert. ZU schierig für mich. gruss Emil EDIT: Sorry drei pics Das Frame.png ist das ausgangs Bilf für das FrameControl mit unteren halb kreis. BogenOrg.png ist die ausgangsgröße wenn das programm gestartet wird Bogen.png ist die veränderte größe "Bogenmaß wurde verändert" Um den Kreis sollen nun die unteren radiobutton positioniert werden wobei die Pfeile end und startpunkt festlegen. |
Re: Benötige Hilfe von einen Mathematiker
Interessant ...
3 Fragen: 1. Auf dem kleinen Frame.png Bild ist das unten ja ein Halbkreis. auf den anderen beiden ist da aber irgendwie ein Knick rechts und links ... :?: 2. Welche Pfeile? Ich sehe einen rechts von den Radiobuttons, und einen im Zweischenraum rechts zwischen den Einstelluingsdingern und dem vertikalen Schriftzug. Wie legen die jetzt Start und Endpunkt fest? 3. Sollen die Optionskästchen eien konstanten horizontalen Abstand haben, einen konstanten Abstand entlang des Kreises oder konstante Winkel? |
Re: Benötige Hilfe von einen Mathematiker
Zitat:
zu zwei der zweite pfeil wird dann sichtbar wenn der erste RadioButton(Plugin) nach links verschoben (unsichtbar) ist. zu drei ja im Horizontaler lage haben sie einen abstand von 32 Denke aber das es besser aussieht wenn ich den Label dann auf Multiline setze so das die Nummer in dem fall dann unter den Button ist. Das verändert dann die länge, aber grundsätzlich fester abstand. gruss Emil |
Re: Benötige Hilfe von einen Mathematiker
Liste der Anhänge anzeigen (Anzahl: 1)
Bevor ich den Code so kommentiere, dass du ihn verstehen kannst: Ist das im Anhang ungefähr dass, was du dir gedacht hast?
|
Re: Benötige Hilfe von einen Mathematiker
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
So kann ich schlecht die exakte position erkennen. Wenn du 10 Button addierst sollt rechts und links ein Pfeil oder zum testen ein normaler Button sein mit denen man die RadioButton verschieben kann. Beispiel: Maximale Plugins sind 10 Innerhalb des Radius Start und End Position passen aber nur 9 also wäre in diesen Fall der rechte SlideButton(Pfeil) sichtbar da du den 10 RadioButton ja nicht sehen kannst. Klickst du nun auf den rechten SlideButton dann sollten alle RadioButton um eins nach links wandern ohne das eine Position verändert wird. Nun siehst du den 1 RadioButton nicht mehr aber dafür den 10. Was bedeutet das nun der rechte SlideButton unsichtbar wird und der linke SlideButton sichtbar. Also die SlideButton sollen abhängig von den sichtbaren Plugins ein oder ausgeschaltet werden. Wird die Form größer verändert sich der Radius und mehr RadioButton passen dann zwischen den start und Endpunkt Sind alle 10 sichtbar dann sollten auch die SlideButton unsichtbar sein. Hoffe du verstehst was ich meine ist was schlecht zu erklären ;) Danke für die Arbeit die du dir machst.. EDIT: Im Moment sind beim ändern der Höhe die RadioButton innerhalb des Frame sollten aber drunter bleiben. Die wandern mit bzw.. setzen sich falsch Dann sehe ich das die Button zentriert zur Mittelpunktachse des Frames addiert werden Sollten aber eigentlich vom Startpunkt aus addiert werden. So wie auf meinen Pic was ich hochgeladen habe. Bild im Anhang zur besseren verständigung :) gruss Emil |
Re: Benötige Hilfe von einen Mathematiker
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
|
Re: Benötige Hilfe von einen Mathematiker
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Hab noch ein Report Pic angehängt. (auch eins im vorherigen Post) Das ist mein problem das genau zu berechnen. gruss Emil |
Re: Benötige Hilfe von einen Mathematiker
Oh, ja Bilder sagen mehr als 1000 Worte :mrgreen:
Dass die Abstände da nicht gleich sind kommt weil ich mit nem Kreis rechne und den dann nachträglich (Nur in Y-Richtung) stauche. Muss ich mal gucken wie ich das Hinbekommen ... |
Re: Benötige Hilfe von einen Mathematiker
Zitat:
Habt ja alle was von spätestens dann wenn ich den fertigen source hochlade. Ob ihr dann damit zurecht kommt ist ne andere sache :) gruss Emil |
Re: Benötige Hilfe von einen Mathematiker
Liste der Anhänge anzeigen (Anzahl: 1)
Sooo, ich glaube ich habs jetzt :)
(Da hast du dir was ganz tolles ausgesucht, der Umfang einer Ellipste ist nicht analytisch lösbar - geschweige denn eine Funktion die den neuen Winkel zurückgibt wenn man ihr sagt wie weit man auf dem Umfang weitergehen will :stupid: ) Ist also nicht mathematisch korrekt, abere ich bin ja (angehender) "Indscheniör" und kein Mathematiker :mrgreen: Anbei also noch ein Beispiel Program: :arrow: Start- und Endpunkt sind duch blaue unkte deutlich gemacht :arrow: Der Abstand zwischen der Ellipse und den Radiobuttons ist konstant (hier 30px) :arrow: Der Abstand zwischen den Radiobuttons ist nahezu konstant und minimal > 50px :arrow: Es ist nicht mehr allzu super duper schnell. (Tradeoff: je schneller, desto mehr Toleranz bei dem Abstand untereinander) (Der winkel wird kontinuierlich um ein epsilon vergrößert, bis der Abstand größer ist als vorgegeben. Je kleiner epsilon, desto genauer aber langsamer ist das ganze) Nicht gerade trivial, das muss ich dir lassen 8) Also allgemein kannst du das knicken mit dem "genau berechnen". Grüße, Julius Edit: Um das mit den SlideButtons und so hab ich mir jetzt mal gespart ;) Die Hauptschleife sieht mittlerweile so aus:
Code:
* for(int i = 0; i < buttons.Count; i++)
{ buttons[i].Visible = true; buttons[i].Location = PointToKoord(a, b, phi, margin); // a und b sind die Daten der Ellipse, phi ist der Winkel // margin gibt an, wie weit die Buttons von der Ellipse weg sind. phi = GetNewPhi(a, b, phi, distance); // distance gibt den Abstand zwischen den Buttons wieder. // GetNewPhi berechnet (iterativ) den neuen Winkel, unter dem man dann die nächste Box zeichnen muss. if (phi > end_angle) break; } |
Re: Benötige Hilfe von einen Mathematiker
@Julius
Jo das sieht doch gut aus so hab ich mir das gedacht.. Mit dem Berechnen na ja denke für den zweck ist das gut. :) Mit den positionen kann man dann ja noch spielen aber das ist dann user sache wie weit oder nah er die zusammen haben will. Die RadioButton werden nur dann entfernt und neu addiert wenn der Plugin typ geändert wird ansonsten bleibt die Maximale menge immer gleich. Das addieren und entfernen macht der SlideButton aber das bekomm ich dann schon selber hin. gruss Emil |
Re: Benötige Hilfe von einen Mathematiker
Okay, ich poste dann mal den momentanen Code:
Code:
Wie du siehst, kängt da noch ein kleiner Rattenschwanz an Funktionen dran, damit es etwas einfacher wird.
public partial class Form1 : Form
{ float margin = 30; // Abstand Ellipse <> Button float distance = 50; // Abstand Button <> Button double start_angle = 1.15 * Math.PI; // Startwinkel im Bogenmaß, hier so "links unten" double end_angle = 1.75 * Math.PI; // Endwinkel, hier ~ "unten rechts" List<RadioButton> buttons; public Form1() { InitializeComponent(); buttons = new List<RadioButton>(); buttons.Add(radioButton1); button1_Click(null, null); button1_Click(null, null); } private float sqr(float a) { return a * a; } private float Abstand(PointF p1, PointF p2) { return (float)Math.Sqrt(sqr(p1.X - p2.X) + sqr(p1.Y - p2.Y)); } private PointF GetPoint(float a, float b, double phi) { return new PointF((float)(a * Math.Cos(phi)), (float)(b * Math.Sin(phi))); } private double GetNewPhi(float a, float b, double oldphi, double arc) { double step = 0.005; double result = oldphi; PointF old = GetPoint(a, b, oldphi); do { result += step; } while (Abstand(old, GetPoint(a, b, result)) < arc); return result; } private Point PointToKoord(float a, float b, double phi, float margin) { PointF Res = GetPoint(a + margin, b + margin, phi); Res.Y = -Res.Y; // Y-Achse umkehren Res.X += a; Res.Y += (pictureBox1.Height - b); Res.X += pictureBox1.Left; Res.Y += pictureBox1.Top; Res.X -= radioButton1.Width / 2; Res.Y -= radioButton1.Height / 2; return new Point((int)Res.X, (int)Res.Y); } private void pictureBox1_SizeChanged(object sender, EventArgs e) { float hratio = (240f / 293) * pictureBox1.Height / pictureBox1.Width; float a = pictureBox1.Width / 2f; float b = a * hratio; double phi = start_angle; foreach (RadioButton elem in buttons) elem.Visible = false; for(int i = 0; i < buttons.Count; i++) { buttons[i].Visible = true; buttons[i].Location = PointToKoord(a, b, phi, margin); phi = GetNewPhi(a, b, phi, distance); if (phi > end_angle) break; } } Mal kurz alles erklärt: Allgemein a und b beschreiben die Ellipse. ![]() Der Winkel in der Ellipse beschreibt dann einen Punkt. Der Koordinatenursprung hierfür ist der Ellipsenmittelpunkt. Der Winkel fängt nach rechts mit 0 an und ist positiv gegen den Uhrzeigersinn. Er wird im Bpgenmaß gezählt. D.h. ein Wert von PI entspricht "links" und ein Wert von 1.5 * Pi entspricht "unten". :arrow: sqr() Quadriert das Argument. :arrow: Abstand() Berechnet den Abstand zwischen 2 Punkten mit Pythagoras. :arrow: GetPoint() Rechnet die Koordinaten um. Die Parameter a und b beschreiben die Ellipse, der Winkel phi beschreibt dann einen Punkt auf der Ellipse. Die Funktion gibt dann den Punkt in kartesischen Koordinatren zurück. (hier zeigt die y-Achse noch nach oben, beim debuggen nicht wundern) :arrow: GetNewPhi Das ist die iterative Berechnung von Phi. Es wird sozusagen solange der Winkel ein Stückchen erhöähtr, bis der gegebene Anstand erreicht (= etwas überschritten) wurde. GetNewPhi berechnet allerdings der Geschwindigkeit wegen den Abstand mit dem Pythagoras, was aber falsch ist. Korrekt wäre, alle infinitesimalen Abstände zu integrieren. Wenn die Ellipse aber nicht gerade ein Verhältnis von 10:1 hat, ist das eine akzeptable Näherung. (Näherung wird schlechter, wenn der Abstand größer wird, oder die Ellipse "platter") :arrow: PointToKoord Rechnet die Koordinaten um, machst also aus einem Punkt auf der Ellipse die Position für den Radiobutton. Zuerst wird die Position ind kartesische Koordinaten umgewandelt, dann muss die Y-Achse umgedreht werdern. (Da bei uns ja Y nach unten größer wird.) Anschließend muss man noch die Koordinaten (Die ja relativ zum Ellipsenmitelpunkt sind) relativ zum Formular machen. :arrow: SizeChanged Hier werden die Buttons neu arrangiert. a und b müssen berechnet werden (Beschreiben ja die Ellipse die auf dem Bild zu sehen ist) In jedem Schritt wird dann ein Radiobutton angeordnet, und der Winkel für den nächsten berechnet. Sollte dieser über dem endwinkel liegen, wird abgebrochen ;) Wieviele Radiobuttons in den Bereich passen, kann man vorher leider nicht genau sagen. Falls du noch Fragen hast, frag :) Grüße, Julius |
Re: Benötige Hilfe von einen Mathematiker
Werd schon damit klar kommen ;)
Egal ob C++, VB_NET , C# oder VB gruss Emil |
Re: Benötige Hilfe von einen Mathematiker
Liste der Anhänge anzeigen (Anzahl: 1)
Dann ist ja gut :)
Da ich im Moment kein Delphi hab, isses halt in C# geschrieben (so nur aus dem Kopf in den Browser alles richtig kann ich noch nicht ...) Um den Source mal zu erhalten hab ich das ganze zip mal angehangen ;) (Ich brauch das Projekt jetzt für das EE/DF Gewinnspiel Nr.3 ...) Mein Übungsleiter hat übrigens bestätigt, dass er sich erinnern kann, dass elliptische Integrale bewiesenermaßen nicht analytisch lösbar sind. Grüße, Julius |
Re: Benötige Hilfe von einen Mathematiker
Zitat:
Danke nochmal für deine Mühe gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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-2025 by Thomas Breitkreuz