Bon marché mode de calcul de bézier cubique longueur
Une solution analytique pour de bézier cubique longueur
semble ne pas exister, mais cela ne signifie pas que
le codage d'une solution bon marché n'existe pas. Par cheap je veux dire quelque chose comme dans la gamme de 50 à 100 ns (ou moins).
Ce que quelqu'un sait quelque chose comme ça? Peut-être en deux catégories:
1) moins d'erreur de 1%, mais plus lente code.
2), plus d'erreur de 20%, mais plus rapide?
J'ai scanné par le biais de google un peu, mais il n'a pas
trouver quelque chose qui ressemble à une belle solution. Seulement quelque chose comme ligne de partage sur les N segments de ligne
et la somme des N sqrt sont trop lents pour plus de précision,
et probablement trop imprécis pour 2 ou 3 segments.
Est-il rien de mieux?
- Voir stackoverflow.com/a/28764614/107090.
- beaucoup de dur pour obtenir la réponse s'y former (si il y a réponse à tout, 99% probablement pas) j'ai besoin de réponse directe, en c ou en pseudocode pas les mathématiques avancées, des papiers très difficile à lire
- Pourquoi pensez-vous qu'il y ait de code facilement disponibles? Combien de fois avez-vous pensez que quelqu'un a besoin de connaître la longueur exacte d'une courbe de Bézier? Si vous avez besoin de faire quelque chose qui n'a jamais été fait avant, attendez-vous à faire un peu de travail.
- beaucoup de gens ont besoin de ça.. (je n'ai pas besoin exact mais approximete) .. il est nécessaire lorsque vous dessinez des courbes de bézier de points dans la boucle for pour savoir combien de ces points vous avez besoin de dessiner.. j'ai donc l'état de ce questi0n, je mince ALORS, est un lieu pour de telles questions
- Sur ce site il est plus pertinent de poster le code qui ne fonctionne pas correctement, à se demander pourquoi. Si vous disposez d'un code qui fonctionne, mais vous voulez un algorithme plus efficace, vous pouvez essayer de Stack Exchange.
- Connaissant la longueur de la courbe ne va pas vous aider à savoir combien de points pour dessiner.
- aproximation pas la longueur exacte.. va.. est utilisable (et en plus pas cher recette peut être utilisable par de nombreux autres cas ) je l'utilise parfois pour des trajectoires etc, il est bon de connaître la longueur de la trajectoire donnée et j'en ai besoin, éventuellement, rapide
- comme l'auteur de pomax.github.com/bezierinfo: la question la plus importante ici est ce que vous pensez que vous avez besoin de ce rapprochement -plutôt que de corriger - arclength, parce que ce qui détermine les marges d'erreur sont acceptables, et qui rapprochement des raccourcis vous pouvez même prendre sans perdre les informations dont vous aviez besoin
- pour agir, peut-être que la réalité, la plupart d'illustration vectorielle logiciel a longueur d'un arc de calcul cuit. Tout ce qui doit rendre des points ou des courbes en pointillés, par exemple, auront une certaine forme de la longueur d'un arc de calcul mis en œuvre. Il est beaucoup plus commun que de votre question vous suggérons de croire qu'il est.
- Vous n'allez pas pour obtenir une solution simple pour cela. De bonnes estimations impliquent des méthodes numériques qui nécessitent une mathématique de la maturité pour le comprendre. Votre choix est d'accepter le défi et développer vos compétences, ou embaucher quelqu'un qui a ces compétences.
- comme je l'ai écrit j'ai besoin de quelque chose comme 1% à 2% d'erreur en plus précis et anout de 10 à 20 % dans l'autre - ce qui ne devrais pas être si sacrément dur, j'ai seulement besoin de quelque chose de mieux que la lame ajout de segments linéaires de longueur peut-être
- si vous ne connaissez pas la solution, vous n'avez vraiment aucune base pour réclamer "ce ne devrais pas être si sacrément dur" dans le moindre. L'obtention de la vraie longueur de l'arc pour un cube de la courbe n'est pas juste "dur", il n'y a littéralement aucun moyen de le calculer de façon générique. Il est impossible, et nous avons donc calculer à l'aide de techniques numériques. L'aplatissement sur l'autre main est super facile, de sorte que le fait que vous appelez la longueur de calcul utilisant une stagnation de la courbe dur est déjà bizarre: c'est rapide, c'est inexact, mais à l'arbitraire d'erreur (besoin de plus de précision? l'utilisation de plusieurs de ces segments), ce qui est trop dur?
Vous devez vous connecter pour publier un commentaire.
Une autre option est d'estimer la longueur de l'arc comme la moyenne entre la corde et le contrôle du net. Dans la pratique:
Vous pouvez ensuite récursivement diviser votre spline segment en deux segments et de calculer la longueur de l'arc jusqu'à la convergence. Je l'ai testé moi-même et en fait elle converge assez vite. J'ai eu l'idée de ce forum.
Plus simple algorithme: aplatir la courbe et le décompte de la distance euclidienne. Aussi longtemps que vous le souhaitez une évaluation approximative de la longueur d'arc, cette solution est rapide et bon marché. Compte tenu de votre courbe de coordonnées de LUT—vous parlez de la vitesse, donc je suis en supposant que vous utilisez ceux-ci, et ne sont pas toujours recalculer les coordonnées—c'est une simple boucle for avec un pointage. Dans le code générique, avec une
dist
fonction qui calcule la distance euclidienne entre deux points:Fait.
arclength
est maintenant le approximative de la longueur de l'arc basé sur le nombre maximum de segments vous pouvez la forme de la courbe en fonction de votre LUT. Besoin de choses plus vite avec un plus grand potentiel d'erreur? Contrôle le segment comte.C'est à peu près le plus simple possible algorithme qui génère toujours des valeurs qui viennent même proche de la véritable longueur de l'arc. Pour quelque chose de mieux, vous allez avoir à utiliser plus cher des techniques numériques (comme l'Legendre-Gauss quadrature technique).
Si vous souhaitez savoir pourquoi, frapper jusqu'à la longueur d'un arc de section de "couche d'Apprêt sur les Courbes de Bézier".
J'ai travaillé sur l'expression analytique de la longueur pour un 3 point de Bézier (ci-dessous). Je n'ai pas tenté de travailler sur une forme fermée pour 4+ points. Ce serait le plus susceptible d'être difficile ou compliqué de représenter et de manipuler. Cependant, une approximation numérique de la technique comme une intégration de Runge-Kutta d'algorithme (voir mes Q&A ici pour tous les détails) serait très bien fonctionner en intégrant à l'aide de la longueur d'un arc de formule.
Voici le code Java pour la longueur de l'arc de 3 points de Bézier, avec des points
a
,b
, etc
.dans mon cas, un rapide et approche valide est présent. (Réécrit en c# pour Unity3d)
d'abord vous devez d'abord Comprendre l'algorithme de l'utilisation de courbes de Bézier,
Quand j'étais à coder un programme en c# Qui était plein de matériel graphique, j'ai utilisé de béziers et beaucoup de temps, j'ai dû trouver un point cordinate de bézier , qui semble imposisble dans le premier regard. donc, la chose que j'ai à faire était d'écrire de bézier Cubique fonction dans mon costume de la classe math qui était en mon projet. je vais donc partager le code avec vous en premier.
comme vous le voyez ci-dessus, c'est la façon dont une courbe de bézier de la Fonction de travail et en tirer les mêmes courbes de Bézier comme Microsoft Bézier est la Fonction( je l'ai tester). vous pouvez la rendre encore plus précise par l'incrémentation de la taille de la matrice et de la grandeur du compteur ou de dessiner elipse au lieu de la ligne& ... . Tous d'entre eux dépendent de vous avez besoin et le niveau de précision dont vous avez besoin et ... .
De retour pour but principal ,la Question est de savoir comment calc de la longueur???
bien La réponse est que nous Avons des tonnes de point et chacun d'eux a un x coorinat et la coordonnée y de la qui se souviennent de nous une forme de triangle & surtout Un RightTriabgle Forme. donc, si nous avons point p1 & p2 , nous pouvons calculer la distance d'eux comme un RightTriangle Accord. comme nous le rappelez-vous de nos cours de maths à l'école, dans le Triangle ABC de type RightTriangle, corde de Longueur est -> Sqrt(Angle FrontCostalLenght ^ 2 + Angle de SideCostalLeghth ^ 2);
et il y a cette relation entre tous les points que nous calc la longueur entre le point courant et le dernier point avant le point courant(exmp p[i - 1] & p[i]) et de stocker la somme de toutes dans une variable. permet de montrer dans le code soufflet
si vous souhaitez accélérer le calcul de la juste besoin de réduire px & py tableau de longueur et loob comte.
Nous aussi peut réduire la mémoire nécessaire par la réduction de px et py à la matrice de longueur de 1 ou de faire une simple variable de type double, mais parce que de mise en situation dans les Parages qui Augmentent Notre Big O, je ne l'ai pas fait.
Espère que cela vous a aidé beaucoup. si vous avez une autre question, il suffit de demander.
Avec mes Meilleures salutations, Heydar - République Islamique d'Iran.