2017-10-16 10 views
0

Je suis en train d'écrire un algorithme génétique avec une courbure comme l'un des paramètres d'optimisation. Je veux calculer la courbure basée sur les points de contrôle d'une courbe de Bézier. J'ai un rayon de courbure minimal que je veux optimiser. J'ai référencé cet article: https://arxiv.org/pdf/1503.01524.pdfCalcul du rayon de courbure d'une courbe de Bézier Compte tenu de Points de contrôle

Dans l'article il y a une fonction qui prend les longueurs latérales d'un triangle pour obtenir le rayon de courbure implicite que j'ai implémenté. Voici mon code actuel:

// Computes the curvature implied by 3 control points of a bezier curve 
float curvature(float4 p0, float4 p1, float4 p2) { 

    // Get the triangle side lengths 
    float a = distance(p0, p1); 
    float b = distance(p1, p2); 
    float c = distance(p2, p0); 

    // Do the curvature calculation 
    float num = a * b * c; 
    float denom = (a + b + c) * (b + c - a) * (a - b + c) * (a + b - c); 

    return num/sqrt(denom); 

} 

Les résultats de cette fonction semblent incorrects. J'exécute cette fonction pour chaque point du chemin, enregistrez les deux derniers et obtenez le rayon minimum de chacun d'eux. Quand je trace le chemin, il semble y avoir un écart important entre le calcul de cette fonction et ce que je peux voir visuellement. Quelle est la bonne méthode pour le faire?

EDIT: Je cherchais à calculer le rayon de courbure entre trois points de contrôle, pas à un point donné dans la courbe, des excuses si cela n'était pas clair.

+1

La fonction que vous avez mis en place ne semble pas correspondre à la fonction réelle pour le rayon de courbure pour les courbes planes paramétriques. –

+0

@ Mike'Pomax'Kamermans ouais c'est ce que je pensais, le papier que je travaillais à partir de cette fonction. – BlueSpud

Répondre

1

Le rayon de courbure R (t) est égale à 1/κ (t), où κ (t) est la courbure de la courbe au point t, pour a parametric planar curve est:

  x'y" - y'x" 
κ(t) = -------------------- 
     (x'² + y'²)^(3/2) 

(lorsque le ^(3/2) est vraiment 3/2, mais vous ne pouvez pas utiliser HTML pour la mise en forme dans des blocs de superscript code, et où le (t) une partie a été laissée hors des fonctions pour x et y, car qui rend les choses inutilement difficile à lire)

Ainsi, pour une courbe de Bézier quadratique avec des commandes P₁, P₂, P₃ et, the first and second derivatives use the following control points:

B(t)': P₁' = 2(P₁ - P₂), and P₂' = 2(P₂ - P₃) 
B(t)": P₁" = (P'₁ - P'₂) 

pour l'évaluation de ces x et y sont littéralement juste "en utilisant les coordonnées x ou y", donc:

x' = Px₁'(t-1) + Px₂'(t) 
y' = Py₁'(t-1) + Py₂'(t) 
x" = Px₁" 
y" = Py₁" 

Notant que x "et y" ne sont que des constantes. Nous branchons ces valeurs dans la fonction pour κ (t), à condition que le dénominateur est non nul, bien sûr (ce qui indique un segment de ligne, qui n'a pas de rayon de courbure) et nous savons ce que R (t) est parce que ce juste la valeur inverse. Enfin, si ce que vous voulez réellement est juste d'approximer des sections de courbe avec des arcs de cercle, alors https://pomax.github.io/bezierinfo/#arcapproximation devrait couvrir le "comment" pour ce cas d'utilisation particulier.

+0

Je n'étais pas très clair sur ce que je cherchais dans la question, et je m'en excuse. Je cherchais plus un moyen d'obtenir le rayon de courbure donné 3 points dans la courbe, plutôt que d'évaluer la courbure à un point donné de la courbe. – BlueSpud

+1

Vous ne pouvez pas, vous ne pouvez calculer le rayon de l'arc pour les courbes de Bézier « à un point », et non « sur un intervalle », il ressemble à ce que vous voulez * * en fait est un moyen de rapprocher les sections d'une courbe à la circulaire arcs. Dans ce cas, https://pomax.github.io/bezierinfo/#arcapproximation couvre cela. –