Sie sind nicht angemeldet.

  • Anmelden

1

27.08.2010, 11:40

[Mathe]Kreissegment/Tortenseqment in Rechteck optimal platzieren und ausfüllen

Hallo zusammen

Da hier ja öfters Mathefragen sehr gut behandelt werden, dachte ich, ich versuchs mal.

Folgendes Problem:
Ich habe ein Rechteck, dessen Größe mir bekannt ist.
Dazu habe ich dann 2 Öffnungswinkel des Tortenseqmentes/Kreisseqmentes.

Aus diesen 3 Werten möchte ich nun die optimale Position und den größtmöglichen Radius berechnen.

Anbei ein Bild ums zu veranschaulichen.


Die Öffnungswinkel können auch beide positiv/negativ sein.


Prinzipiell muss man ja je nach Winkel den "Startpunkt" berechnung und auch dann den maximalen Radius.


Wär super hier ein paar Anregungen zu bekommen.
»Revolt« hat folgende Datei angehängt:
  • bild.jpg (22,41 kB - 318 mal heruntergeladen - zuletzt: 30.12.2023, 05:53)
Jeder Mensch, der kein Ziel hat, ist dazu verdammt für die Ziele anderer zu arbeiten !

2

27.08.2010, 13:31

Verstehe ich das richtig, dass die Kanten des Kreissegmentes einen vorgegebenen Winkel zu einer Bezugsachse haben haben?

Angenommen sie hätten es nicht, dann hätte ja das erste Kreisegment nen Öffnungswinkel von 40 Grad. Die optimale Lösung wäre ja dann eine andere, da man das Kreissegment ja noch drehen kann.


Suchst du eine praktische Lösung (z.B. fürs Programmieren ) oder eine analytische Lösung?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Dr. Poxxx« (27.08.2010, 13:31)


3

27.08.2010, 13:56

ja, richtig

ja, praktische Lösung (programmieren)

4

27.08.2010, 15:15

da man das kreissegment nicht drehen kann, würde ich es mal so probieren:

Ich würde immer den gleichen Startpunkt nehmen und zwar den Mittelpunkt, den ich wählen würde, wenn ich einen ganzen Kreis eintragen möchte. Wenn ich einen ganzen Kreis eintragen will, dann ist der Radius ja b/2 (b ist die kurze Seite des Rechtecks. Geht man davon aus, dass dein Rechteck mit einer Ecke im Koordinatenursprung liegt, dann hat der Mittelpunkt dann die Koordinaten (b/2,y) , wobei ich y immer als a/2 wählen würde (a ist die lange Seite). Du trägst also dein Kreissegment am Anfang immer mit diesen Mittelpunktkoordinaten und dem Radius b/2 ein.

Da man nicht drehen kann, musst du ja nur den Mittelpunkt verschieben und den Radius vergrößern. Den Mittelpunkt verschiebst du wie folgt: Verlängere mal imaginär die vorgegebenen Kanten über den Mittelpunkt hinaus und denke sie dir als Bewegungsvektoren (Betrag bei beiden gleich groß , da Kanten sich nur gleichmäßig ändern können). Bilde mittels Vektoraddition die Bewegungsrichtung (Achtung bei Öffnungswinkel über 180 Grad negativen Vektor nehmen).


Iteration:
1. Bewege den Mittelpunkt in diese Richtung (nimm eine beliebige Schrittweite, möglichst klein ).
2. Vergrößere den Radius bis zur Begrenzung (Rechteck)-> z.B per Kollisionstest
3. Prüfe, ob Kreisbahn des Segments kollisionsfrei mit Rechteck
4. Wiederhole 1-4, brich ab, wenn keine Kollisionsfreie Verschiebung mehr möglich


Anmerkung: Ich glaube die Iteration brauchst du gar nicht, dass kann man sicher auch berechnen(???), wo hin ich den Startpunkt verschieben muss (Bewegungsrichtung ist ja vorgegeben), um den Radius maximal zu machen. Allerdings fehlt mir dazu die Zeit.

Dann gibts zwei Sonderfälle: Öffnungswinkel 0 Grad und 180 Grad (da ergibt die Vektoraddition Null, allerdings sind beide Fälle auch leicht abzuprüfen und zu berechnen.

Mit Öffnungswinkel mein ich immer Winkel zwischen den Kanten.

Probiers einfach mal...

5

28.08.2010, 14:35

Hi Revolt,

wie du an deinen Beispielzeichnungen wahrscheinlich schon festgestellt hast, genügt es, sicherzustellen, dass bestimmte Punkte (der oberste, der unterste etc.) des Tortenstücks innerhalb des Rechtecks liegen. Damit liegt dann auch das gesamte Tortenstück im Rechteck.

Den Radius kürze ich ab jetzt mit "r" ab.

Um die Lage von Punkten mit Koordinaten beschreiben zu können, braucht man einen Bezugspunkt. Nehmen wir mal den Mittelpunkt des Tortenstücks. Wenn du dir also das größtmögliche Tortenstück vorstellst (ganzer Kreis), dann hat
dessen oberster Punkt die Koordinaten (0, r),
der Punkt ganz links liegt in (-r, 0),
der Punkt ganz rechts in (r, 0),
der Punkt ganz unten in (0, -r)
und der Mittelpunkt in (0, 0).

Für zwei gegebene Winkel a und b, jeweils zwischen -180° und +180°, erhält das Tortenstück zwei "Endpunkte" mit den Koordinaten
(r*sin(a), r*cos(a)) und (r*sin(b), r*cos(b)).

Dein Rechteck muss folgende Punkte enthalten:
-> den Mittelpunkt (0, -r)
-> den Endpunkt (r*sin(a), r*cos(a))
-> den Endpunkt (r*sin(b), r*cos(b))
-> für jeden Winkel "phi", der ein Vielfaches von 90° ist (auch die Null!) und zwischen a und b liegt, den Punkt (r*sin(phi), r*cos(phi))

Mit diesen Punkten liegt auch das gesamte Tortenstück im Rechteck. Die Punkte besitzen x- und y-Koordinaten, die jeweils von r abhängen.
Die Differenz aus größter und kleinster x-Koordinate darf maximal so groß werden wie die vorgegebene Breite des Rechtecks.
Die Differenz aus größter und kleinster y-Koordinate darf maximal so groß werden wie die vorgegebene Höhe des Rechtecks.
Aus diesen beiden Bedingungen kannst du den optimalen Radius berechnen.

Die minimale x-Koordinate und die minimale y-Koordinate ergeben auch die Koordinaten der linken unteren Ecke des Rechtecks (bezüglich des Mittelpunkts des Tortenstücks).


(edit: -1 Tippfehler)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chevron« (28.08.2010, 18:04)


6

28.08.2010, 16:57

Hallo

Danke euch schonmal ;)

Habe nun mal folgendes gefunden und angepasst.
Funktioniert halt nur für linken Öffnungswinkel zwischen -180 und 0° und rechten Öffnungswinkel zwischen 0 und 180°.

Es ist allerdings erforderlich, dass auch beide Öffnungswinkel positiv/negativ sein können (simuliert dann halt eine gedrehte Darstellung).


winkelLinks = 90 - winkelLinks ;
winkelRechts = 90 - winkelRechts :

HilfsVar:
HlpCosLinks = (SinusLinks <=0) ?1 : abs(cos(WinkelLinks);
HlpCosRechts = (SinusRechts <=0) ?1 : abs(cos(WinkelRechts);
HlpMinSinus = min(SinusLinks, SinusRechts);
Wenn HlpMinSinus > 0, dann auf 0 setzen.

X = BreiteRechteck / (HlpCosLinks + HlpCosRechts );
Y = HöheRechteck / (1-HlpMinSinus);


Wenn Y < X:
Radius = Y;
Startpunkt.x = (BreiteRechteck + Radius * (HlpCosLinks - HlpCosRechts)) / 2);
Startpunkt.y = Radius

Wenn Y >= X:
Radius = X
Startpunkt.x = Radius * HlpCosLinks
Startpunkt.y = HöheRechteck + Radius * (1+HlpMinSinus ))/2;




Damit kann ich die 3 oberen Grafiken einwandfrei im Rechteck platzieren.
Nur eben nur dann wenn die Winkel zwischen -180 und 0 bzw 0 und +180 liegen, nicht jedoch, wenn beide Winkel negativ/positiv sind (also beispielsweise ein Segment mit WInkeln +30 und +80).



Hab hier schon versucht, die weiteren Fallunterscheidungen einzuführen, damit ich diese Fälle abdecken kann, aber noch nicht ganz draufkommen.


Vielleicht sieht ja jemand hier von euch auf den 1.Blick, was anzupassen ist, um es alle Winkel gültig zu machen.


Danke