Sposób komunikacji między obiektami

0

Witam,
Czytam od jakiegoś czasu na temat Graphics View z frameworku Qt. Postanowiłem napisać aplikację korzystającą z biblioteki krzywych utworzonej na rzecz mojego wcześniejszego projektu. Dręczy mnie pewien problem natury, zdaje się, projektowania obiektowego.

Rzecz w uproszczeniu polega na tym: posiadam (w bibliotece) klasę Bezier, która zajmuje się obliczeniami związanymi z krzywą Beziera. Klasa ta posiada pole control_points, na podstawie którego obliczany jest kształt krzywej

class Bezier
{
// [...]
private:
   vector<QPointF> control_points;
// [...]
};

Chcę stworzyć klasę, która będzie reprezentować graficznie krzywą Beziera -- klasę BezierItem, dziedziczącą po QGraphicsItem. Klasa będzie wyświetlać krzywą oraz uchwyty (kółka), służące do zmiany położenia punktów kontrolnych.

Stworzyłem strukturę podobną do poniższej:

class BezierItem : public QGraphicsItem
{
// [...]
private:
   Bezier<QPointF> m_bezier;
   QVector<HandleItem> m_handles;
// [...]
};

Jednak nie wiem w jaki sposób powinienem zorganizować komunikację pomiędzy obiektami HandleItem, a obiektem krzywej, tak aby poruszenie punktem kontrolnym powodowało zmianę odpowiedniego punktu w m_bezier.

Czy możecie mi pomóc?

PS Klasa Bezier jest szablonowana klasą punktu oraz napisana wyłącznie przy użyciu STL.

0

Cóż,wg mnie obiekt HandleItem powinien być składową klasy Bezier,bo jeśli dobrze zrozumiałem Twoje wywody samodzielne jego istnienie nie ma sensu

0

Jednakże Bezier jest klasą ze stworzonej wcześniej biblioteki non-Qt, która służy tylko do obliczeń.
Oczywiście mógłbym ją zmodyfikować i zamiast wektora punktów kontrolnych (vector<Point>) w Bezier trzymać vector<HandleItem>, lecz byłoby to niepożądane ze względu na intensywność obliczeń wykonywanych na owym wektorze. Główny algorytm (deCasteljau) jest O(n^2) gdzie n = liczba punktów kontrolnych i używa się go bardzo często. Każdorazowe wyłuskiwanie punktu z obiektu HandleItem byłoby sporym marnotrawstwem...

Przepraszam jeśli bredzę... Późno już.

1

Standardem w programach graficznych jest Cubic Bezier.
Zakładam jednak, że ty potrzebujesz dowolną liczbę punktów kontrolnych.
Ja bym zrobił tak: klasa rysująca krzywą, zawiera klasę do obliczeń oraz graficzną reprezentację punktów kontrolnych.
Punkty kontrolne notyfikowałyby o swoich zmianach pozycji (same obserwują zmiany swojej pozycji za pomocą QGraphicsItem::ItemPositionChange).

1 użytkowników online, w tym zalogowanych: 0, gości: 1