Aneinander hängende Kreise

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Aneinander hängende Kreise

    Hallo!

    Ich bin neu im Forum und dies ist mein erster Beitrag. Ich programmiere seit ca. 2 Jahren für Mac und fange jetzt mit iOS an. Dabei habe ich für eine SpieleApp-Idee eine Frage.

    In der Mitte des Screens befindet sich ein einfacher Kreis (mit CoreGraphics). Nun fliegen von unten kleine Kreise nach oben. Wenn sie in die Nähe des großen Kreises kommen, sollen sie daran hängen bleiben. Das dürfte auch nicht allzu schwer sein, aber, wenn an der Stelle schon ein kleiner Kreis "festklebt", wie ermittle ich dann programmatisch am einfachsten die benötigte Position für den neuen Kreis, der also nicht am großen Kreis, sondern am kleinen Kreis hängen bleiben soll? Nach einer Weile werden einige kleine Kreise daran hängen, daher auch die Frage:
    Hat jemand einen Ansatz für ein Algorithmus?

    Ich würde mich sehr auf Antworten oder Verweise freuen!
    Osxer
  • Ein einfacher Ansatz ist es, paarweise Kollisionen der Kreise zu erkennen. Zwei Kreise kollidieren, wenn der Abstand ihrer Mittelpunkte (Pythagoras) kleiner als die Summe der beiden Radien ist. Um den "Klebepunkt" zu finden kannst du den beweglichen Kreis wieder zurückschieben, bis der Kreismittelpunktabstand genau der Summe der Radien entspricht. Wie man das im Detail macht und optimiert hängt etwas vom gewünschten Verhalten und den Möglichkeiten ab, aber das sollte zumindest ein Anfang sein.
    Multigrad - 360°-Produktfotografie für den Mac
  • So ganz klar ist mir Deine Frage nicht. Wenn Du zwei Kreise hast, dann hat der eine eine feste und der andere eine Variable Position. Die Position eines Kreises (mit festem Radius r) lässt sich eindeutig über seinen Mittepunkt definieren. Können alle Punkte (x, y) mit x = (r + R)cos(a) und y = (r + R)sin(a) für a in [0, 2π] Mittelpunkte des variablen Kreises sein, wenn (X, Y) der Mittelpunkt und R der Radius des festen Kreises sind.
    „Meine Komplikation hatte eine Komplikation.“
  • Wow, das ging ja schnell!

    @mattik

    Vielen Dank, ja, das ist auf jeden Fall schon mal ein Ansatz.

    @macmoonshine

    Danke für deine Antwort; warum Cosinus und Sinus? Ich muss zugeben, ich blick bei deinem Gedankengang nicht ganz durch! ?(
    Eigentlich ganz einfach(oder?): fester Kreis, beweglicher Kreis. Beweglicher Kreis, dock automatisch an. Position soll unter anderem über den Abstand der Mittelpunkte ermittelt werden (wie genau?), bloß, wenn noch ein beweglicher Kreis kommt, wie weiß ich dann dessen Position?
  • Ah! Ich kapier´s schon mehr! Ich werde mal drüber nachdenken.

    Jetzt konkret: Angenommen, ich habe den großen Kreis und den kleinen. Dieses mal sind aber beide fest, d.h. die Bewegung spielt jetzt keine Rolle. Jetzt habe ich von beiden den Mittelpunkt und möchte den kleinen dahin positionieren, wo er den großen berührt und wo es am nähesten von der Urposition ist. Wie bestimme ich jetzt die Position?
  • Ins Trockene getippt:

    Gegeben:
    (x1/y1) : Mittelpunkt K1 (großer Kreis)
    r1: Radius K1
    (x2/y2) : Mittelpunkt K2 (kleiner Kreis)
    r2: Radius K2

    Gesucht:
    (x/y) : Mittelpunkt von K2, bei dem sich die beiden Kreise berühren (bei Bewegung von K2 in Richtung Mitte K1)

    So:

    Richtungsvektor von K1 nach K2
    dx = x2 - x1
    dy = y2 - y1

    Aktueller Abstand
    d = sqrt(dx*dx + dy * dy)

    Neuer Abstand
    dd = r1 + r2

    Gewünschte Skalierung des Richtungsvektors (soll / ist)
    s = dd / d

    Neue Position (K1 plus skalierter Richtungsvektor)
    x = x1 + s * dx
    y = y1 + s * dy
    Multigrad - 360°-Produktfotografie für den Mac
  • Jetzt müsste man malen können ;)

    Die Formeln oben beschreiben einen Kreis um den Mittelpunkt (X, Y). Der bewegliche Kreis befindet sich am Punkt (px, py). Stell Dir die Verbindungslinie dieser beiden Punkte vor. Dann ist der Mittelpunkt (x, y) der Schnittpunkt dieser Linie mit der Kreislinie. Die Linie ist die Hypothenuse h eines rechtwinkligen Dreiecks. Über die Strahlensätze kannst Du (x, y) berechnen:
    h = sqrt((px - X)^2 + (py - Y)^2)
    f = h / (r + R)
    x = X + f * (px - X)
    y = Y + f * (py - Y)


    (Alle Angaben ohne Gewähr) ;)
    „Meine Komplikation hatte eine Komplikation.“