2010-01-19 5 views
0

Utilisation de Java 2D J'ai corrigé plusieurs courbes de Bézier (CubicCurve2D) pour créer un "blob". Le problème que je suis maintenant confronté est comment:Création d'une forme composite en Java 2D

  1. Remplissez efficacement le blob avec une couleur donnée.
  2. Déterminer efficacement si un point donné se trouve à l'intérieur du blob.

Je thst remarqué CubicCurve2D outils Shape qui fournit de nombreuses méthodes pour déterminer contains « intériorité » et que Graphics2D est en mesure de remplir un Shape via le fill(Shape) (que je crois utilise getPathIterator méthodes de Shape de le faire). Compte tenu de cela, j'espérais pouvoir créer un composite Shape, grâce auquel ma méthode getPathIterator(AffineTransform) relierait simplement les sous-jacents PathIterator ensemble. Cependant, cela produit un NoSuchElementException une fois que ma forme en contient plus d'un CubicCurve2D. Même si je parviens à y parvenir, je ne suis pas convaincu que cela fonctionnera comme prévu car un CubicCurve2D est toujours rempli sur le côté convexe, et mon "blob" est composé de courbes concaves et convexes. Le problème "contient" est encore plus difficile car un point peut légitimement se situer dans le blob mais pas dans l'une des courbes individuelles.

  • Suis-je aborder ce problème de manière correcte (en train de mettre en œuvre Shape?) Ou est-il un moyen idiomatiques de le faire que je ne suis pas au courant de? J'aurais pensé que le problème de la composition de formes géométriques serait assez commun.
  • Est-ce que quelqu'un a des suggestions sur la façon de résoudre ce problème?

Merci d'avance.

Répondre

3

Je ne suis pas certain de comprendre votre question mais formes composites peuvent être créées avec la classe java/awt/geom/Area.

+0

Cool - Merci Pierre! Je vérifierai. – Adamski

+0

Pierre - Merci beaucoup; Cela a fonctionné parfaitement. – Adamski

1

Regarder Shape pour trouver une solution est la bonne façon d'y parvenir. Si vous avez une collection de courbes que vous essayez d'assembler dans une forme, je suggère que vous utilisiez un GeneralPath. Ajoutez simplement vos courbes ou segments de droite, selon les besoins. Regardez l'interface pour voir les différentes méthodes d'ajout. Notez également que vous pouvez «compléter» la forme en joignant le dernier point au point de départ. Une fois le chemin fermé, il y a un certain nombre de versions différentes de contains() qui peuvent être utilisées, veuillez prendre le temps de lire chacune de leurs descriptions, car il y a des compromis en termes de vitesse et de précision, dépend de votre application.

De plus, il est facile d'obtenir une forme à partir du chemin, de la remplir, de la transformer, etc.