9
votes

Remplir complètement les géométries personnalisées

J'essaie de comprendre comment remplir complètement une géométrie personnalisée. Il semble que cela devrait être une question commune, mais je n'ai pas vraiment été en mesure de trouver des solutions.

J'ai l'exemple suivant Géométrie: P>

        <Path Fill="White" Stretch="Fill" Stroke="Black" StrokeThickness="2">
        <Path.Data>
            <PathGeometry
            Figures="M104,160C104,160 72,160 72,136
                M104,128C104,128 72,128 72,152
                M152,232L152,232 152,216 120,216 120,160 128,160
                M152,232L152,232 72,232 104,216 104,160 96,160
                M104,128L104,128 168,128
                M128,160L128,160 168,160
                M165,160L168,160 200,128
                M200,160L200,160 200,128
                M200,160L200,160 168,128 152,128"/>
        </Path.Data>
    </Path>


0 commentaires

3 Réponses :


5
votes

Votre exemple de géométrie est une combinaison de trois formes adjacentes qui ne se chevauchent pas. La course est dessinée sur les bords extérieurs simplement parce que les formes ne sont pas fermées et que les lignes de course internes n'existent pas. Bien qu'il puisse sembler que les formes sont fusionnées et que le trait est appliqué à la géométrie dans son ensemble, ce n'est pas ce qui se passe.

La fermeture du trou devient un problème plus complexe de détecter par programme le trou et de la fermer avec la forme appropriée ou en créant une nouvelle forme combinée qui n'a pas le trou (éventuellement en détectant et en traçant les points extérieurs). Je ne suis au courant d'aucune fonctionnalité dans WPF qui peut vous aider avec cette tâche. Il existe une classe de combinéométrie qui peut produire une union de deux formes qui se chevauchent. Les formes dans cet exemple ne se chevauchent pas.

Sans contexte, il est difficile de recommander une solution. S'il s'agit d'un programme de dessin de formulaire libre, l'utilisateur doit peut-être simplement dessiner une autre forme au milieu pour fermer la géométrie.


2 commentaires

Merci pour votre réponse. En "fermant le trou", voulez-vous dire le trou dans le remplissage ou le petit écart entre les géométries adjacentes? Si vous voulez dire l'écart entre les géométries, je posterai une édition sous peu avec un exemple de combinantométrie brut qui semble avoir le même problème lorsque les traits des géométries adjacentes se chevauchent et sont combinés à une union. Merci encore!


Heureux d'aider. Je faisais référence à la grande zone que vous essayez de remplir, pas le petit espace entre les géométries adjacentes. Comme votre expérience éditée démontre, l'union combinée de formes multiples n'élimine pas le trou. Je ne pouvais trouver aucune fonctionnalité dans WPF qui identifierait et éliminerait des trous enfermés dans les géométries touchantes ou qui se chevauchent. Votre approche consistant à combiner la géométrie et à éliminer les figures qui sont entièrement fermées comme un bon départ.



2
votes

Traitez-le comme un problème de "Connecter les points" :)

Vous avez 5 points: p>

  • 96 296 - Point supérieur gauche (coin) Li>
  • 112.296 - Top - Début de la courbe de Bezier Li>
  • 136,320 - extrême droite - fin de la première courbe de Bézier, début de la seconde li>
  • 112,344 - Bottom - Fin du second Bézier Li>
  • 96 344 - Point de gauche inférieur (coin) Li> ul>

    Et maintenant, nous les communiquerons. p> xxx pré>

    Vous pouvez également utiliser pour remplir votre chemin personnalisé à partir du 1er post. La valeur par défaut est FLIDRULE = "SOFODDD", qui produit un remplissage comme le vôtre. * P>

    Voir la syntaxe de marquage du chemin ( http://msdn.microsoft.com/en-us/library/ms752293.commexe ) Pour plus d'informations sur le chemin du chemin Mini-langage. P>

    • changé à li> ul>

      EDIT 1: strong> p>

      i Réorganisez votre chemin un peu: P>

      <Path Fill="White" Stretch="Fill" Stroke="Black" StrokeThickness="2">
          <Path.Data>
              <PathGeometry Figures="M72,152 C72,152 72,128 104,128 L168,128 200,160 200,128 168,160 120,160 120,216 152,216 152,232 72,232 104,216 104,160 C104,160 72,160 72,136"/>
          </Path.Data>
      </Path>
      


4 commentaires

Merci pour la réponse. J'ai essayé les chiffres dans le sens des aiguilles d'une montre, j'ai essayé et trouvé de travailler pour des formes simples, mais la même approche ne fonctionnera pas pour des formes plus complexes (auto-intersection, concave, etc.). De plus, le chemin n'a pas de propriété "FLIDRULE" (au moins pas dans .NET 3.5), mais j'ai essayé de placer les géométries dans un groupe de géométryes qui rempli était non nul, mais j'ai fini avec les mêmes résultats. Je vais poster une géométrie plus complexe sous peu et j'espère que vous pourrez me prouver :).


Joli. Alors, comment proposeriez-vous que je commande la géométrie par programme? Mon outil permet à l'utilisateur de construire ces formes de toute combinaison de géométries, donc je me retrouve avec quelque chose comme je posté ci-dessus, où les géométries sont commandées de la manière dont l'utilisateur les a ajoutés à la toile. Je devrai réorganiser ces géométries par programme afin qu'ils soient remplis correctement. J'ai essayé d'utiliser Combiniculométrie, mais que les syndicats non seulement l'accident vasculaire cérébral, mais aussi le remplissage, de sorte que vous vous retrouvez avec quelque chose de similaire à ce que vous avez commencé.


Lors de la création de la géométrie, vous pouvez essayer d'ajouter une forme suivante ("primitive") sans démarrer une nouvelle figure (MXXX, XXX) - en cas d'IE. Bezier Curves Premier point de contrôle doit être automatiquement définie (mêmes coordonnées comme le dernier point). Vous pouvez essayer quelque chose comme ceci (x, y sont des coordonnées personnalisées): pathgeométrie geom = nouvelle pathgeométrie (); PATHFIGURE PATH = NOUVEAU PATHFIGURE (); path.starpoint = nouveau point (x, y); geom.figures.add (chemin); Ligne de lingese = nouveau linestegment (); ligne.point = nouveau point (x, y); path.segments.add (ligne); et ainsi de suite .... Vous devriez également affecter Geom à xamlpathObject .data


Malheureusement, je ne suis pas sûr de pouvoir placer ce type de contrainte sur les utilisateurs de ma demande. J'aurais besoin d'un moyen d'arriver à la géométrie cible, étant donné l'entrée folle. Je me demande si je devais tesseler la géométrie d'entrée et dessiner les triangles résultants sans un coup comme le remplissage Hmm.



1
votes

J'ai trouvé un intéressant Article sur la création de formes avec WPF à l'aide d'un fichier SVG créé avec un outil graphique comme l'encart. Cela pourrait vous donner une idée.


0 commentaires