2017-04-10 1 views
0

J'ai besoin de dessiner de petites flèches courbées. Je peux travailler sur l'angle de la pointe de flèche OK, et j'allais utiliser Béziers pour définir les segments de chemin. Cependant, ce que je voudrais vraiment faire est de calculer un chemin incurvé invisible entre le début et la fin, et seulement le chemin à partir d'une petite distance après le début et juste avant la fin.Comment puis-je dessiner une section d'une courbe de Bézier dans WPF?

Ceci laisserait un espace approprié entre tous les objets au début et à la fin. Aucune suggestion?

+1

Que diriez-vous d'un dégradé avec une couleur transparente entre? – DrRiisTab

+0

@DrRiisTab Cela pourrait rendre le positionnement de la tête de flèche difficile. –

+0

@DrRiisTab: merci pour la suggestion. C'est possible, parce qu'il y a une méthode que vous pourriez appeler qui calcule la tangente et x, y, les coordonnées d'un point x% le long de la ligne. Je pense juste qu'il serait très fastidieux d'adapter le stylo pour caresser la partie jusqu'à ce point. – deadlyvices

Répondre

0

Je pense que je peux avoir trouvé une solution possible, après beaucoup de grattage de la tête. Disons que vous avez une courbe de Bézier A-B-C-D, où B & C sont les points de contrôle et A & D les points de début et de fin. Et vous voulez commencer et mettre fin à une distance de sécurité X de A et D:

  1. Générer l'initiale Bézier

  2. Appel GetFlattenedPathGeometry pour le convertir en une série de petits segments

  3. Somme pour obtenir la longueur du Bézier et diviser en X pour obtenir la longueur de la fraction F à partir du début et de la fin

  4. Appelez PathGeometry.GetPointAtFractionLength sur l'original Bézier, en passant par F et 1-F. Cela donnera un point de départ/fin et un vecteur de tangente pour chaque extrémité de la Bézier

  5. raccourci Ajouter début/point final au vecteur de tangente pour obtenir le point de contrôle correspondant

  6. Générer une nouvelle Bézier en utilisant ces points, qui devraient se tenir à l'écart des points de début et de fin d'origine par X

Vous voyez un problème avec cette approche?

+0

Intéressant. Vous avez un code implanté et/ou une image pour le montrer? –

+0

Oui, désolé pour la réponse tardive.Je n'ai pas encore de code mais j'en posterai quand je m'en occuperai. – deadlyvices

1

Les flèches n'ont généralement pas de courbes folles, elles ont des courbes assez lisses, avec les valeurs t près des extrémités se comportant comme des cubes purs (puisque la fonction de Bézier est dominée par (1-t) ³ au début et par T³ à la fin de coordonnées), si près des points d'extrémité, vous pouvez « guestimate » la valeur « t » vous devez brancher pour obtenir une coordonnée à proximité du besoin en utilisant la racine cubique:

// let's say we want "10% away from the end" 
desiredDistance = 0.9; 

// then the guestimate for the "t" value is simply the cube root of 0.9 
probablyT = Math.pow(desiredDistance, 1/3); 

// and the point we want to cut at is at that "t" value 
cutPoint = get(probablyT, pts); 

// and we can split up the curve into two segments at that "t" value 
curves = split(probablyT, pts); 

// and then keep the segment we need for the arrow 
arrowcurve = curves[0]; 

Voir http://jsbin.com/dovodibaze/edit?js,output pour savoir comment cela se rapproche des distances proches du point final (et comment cela ne fonctionne clairement que près du point final que vous devinez =)

Avec cette valeur probablyT vous pouvez diviser votre courbe d'origine, dessinez la "première" courbe que vous obtenez de cette division (couvrant l'original t = 0 à t = près du segment de fin), puis dessinez votre tête de flèche au point de fin original.

+0

Vous avez une version en C# pas JavaScript? J'utilise WPF. – deadlyvices

+1

Je ne sais pas, mais je m'attends à ce que vous puissiez lire du code aussi simple =) (cela ne devrait pas être trop de travail pour WPF-i-fy si vous êtes familier avec les API WPF, le seul les appels spéciaux dans jsbin sont sur le canevas pour dessiner une courbe et certains cercles, ce qui ne devrait pas être trop déroutant) –

+1

J'ai mis à jour le jsbin avec quelques points pour agir comme des ancres "true interval", donc vous pouvez jouer avec le calcul de 'probablementT' et trouver quelque chose qui correspond le mieux à votre besoin. J'ai effectivement expliqué ce problème parce que c'est un peu plus de travail qu'une racine cubique pure, alors nous programmons, pas mathématiquement, donc "si vous utilisez 90%, utilisez la racine cubique 80%" fait l'affaire en ce qui concerne la programmation, même sans fondement mathématique qui explique pourquoi> _>; –