14 472 commentaires
Boris Beaulant
( Modifié )

Merci ourea !

J'avoue qu'à la lecture le raisonnement semble se tenir. Mais j'ai aucune idée comment le coder et je suis pas certain d'en avoir vu les subtilités.

Je dirai pas non à un petit croquis 😉 ?


On calcule la courbure le long de l'arc d'ellipse

et

En chaque point, on calcule le cercle de courbure

C'est pas la même chose ? = rayon du cercle oscultateur ?

Boris Beaulant
( Modifié )

Ta proposition se rapproche de ceci, non ?

Boris Beaulant
( Modifié )

Merci !
Voici déjà un premier résultat sans interpolation avec 36 points sur une ellipse complète et un échantilon de 1000 valeurs calculées 😉
Je regarderai à faire mieux plus tard.

Boris Beaulant

Mais dans cette façon de faire, il va y avoir un nombre fixe de points quelque soit la longueur de l'arc. Et il n'y a pas forcément de point sur les extremums.
Il faudrait presque toujours faire les calcul sur l'ellipse complète et extraire les points contenus sur l'arc... 🤔

Boris Beaulant
( Modifié )

Je voulais dire qu'il n'y a pas forcément de point "clé" sur les 4 "pointes" de l'ellipse (sur les rayons).

Pour la répartition des points une chose qui me semble importante par rapport à l'usage ici est que quelque soit la taille de la portion d'arc à traiter les points choisis se trouvent aux mêmes endroits pour une ellipse donnée.

Ceci afin de ne pas avoir deux formes complémentaires dans le dessin qui ne donneraient pas la même approximation parce qu'elles n'ont pas la même longueur d'arc.

C'est comme dans la vraie vie de l'atelier. Couper une pièce de bois à la côte précise n'a pas toujours d'intérêt, mais tout couper à la même taille, oui.

Exemple dans le cas suivant :

Boris Beaulant

Sais-tu "détecter" les formes complémentaires ?

Oui et non.
Il y a juste que dans l'exemple donné, ma détection donnera naturellement la même ellipse pour les deux arcs.

Boris Beaulant
( Modifié )

C'est vrai que le résultat est étrangement décalé.
Voici le code à coller dans la console SketchUp pour afficher ces points :

a = 5.0
b = 3.0

def point_at_t(a, b, t)
 Geom::Point3d.new(a * Math.cos(t), b * Math.sin(t))
end

def curvature_at_t(a, b, t)
 (a * b) / Math.sqrt((a**2 * Math.sin(t)**2 + b**2 * Math.cos(t)**2)**3)
end

def point_at_dk(a, b, ts, dks, dk)
 i = dks.find_index { |v| v >= dk }
 point_at_t(a, b, ts[i])
end

ts = []
ks = []

# Compute curvatures
key_count = 1000
(0...key_count).each do |i|
 t = 2 * Math::PI * i / key_count
 ts << t
 ks << curvature_at_t(a, b, t)
end

# Integrate
dks = ks.dup
(1...dks.length).each do |i|
 dks[i] += dks[i - 1]
end
max = dks.max
dks.map! { |dk| dk / max }

# Draw points
point_count = 36
(0...point_count).each do |v|
 kn = v / pint_count.to_f
 Sketchup.active_model.entities.add_cpoint(point_at_dk(a, b, ts, dks, kn))
end
Boris Beaulant

La meilleure façon d'avoir les extremums et une répartition homogène est surement d'appliquer ta proposition seulement sur 1/4 d'ellipse et de dupliquer les positions trouvées sur les 3 autres.

Boris Beaulant
( Modifié )

Voici un bout de code qui peut être copier coller dans la console de SketchUp.

Il permet de dessiner les points répartis suivant la courbure sur un quart d'ellipse en fonction des paramètres qu'on lui donne au début.

Je pense qu'ensuite on pourrait utiliser la méthode des 3 points proposée par Kentaro pour former les arc en calculant un point milieu à chaque arc.

def point_at_t(xradius, yradius, t)
 Geom::Point3d.new(xradius * Math.cos(t), yradius * Math.sin(t))
end

def point_at_dk(xradius, yradius, ts, dks, dk)
 point_at_t(xradius, yradius, ts[dks.find_index { |v| v >= dk }])
end

def curvature_at_t(xradius, yradius, t)
 (xradius * yradius) / Math.sqrt((xradius**2 * Math.sin(t)**2 + yradius**2 * Math.cos(t)**2)**3)
end

xradius = 5.0
yradius = 3.0
key_count = 100
arc_count = 8

prompts = [ "xradius", "yradius", "key_count", "arc_count" ]
defaults = [ xradius, yradius, key_count, arc_count ]
xradius, yradius, key_count, arc_count = UI.inputbox(prompts, defaults, "Settings")

ts = []
ks = []
ps = []

# Compute curvature at key points
(0..key_count).each do |i|
 t = Math::PI / 2 * i / key_count
 ts << t
 ks << curvature_at_t(xradius, yradius, t)
end

# Integrate
dks = ks.dup
(1...dks.length).each { |i| dks[i] += dks[i - 1] }
max = dks.max
dks.map! { |dk| dk / max }

# Clear model
Sketchup.active_model.entities.clear!

# Draw points
(0..arc_count).each do |v|
 p = point_at_dk(xradius, yradius, ts, dks, v / arc_count.to_f)
 ps << p
 Sketchup.active_model.entities.add_cpoint(p)
end

SKETCHUP_CONSOLE.clear
puts "-----"
puts "xradius = #{xradius}"
puts "yradius = #{yradius}"
puts "key_count = #{key_count}"
puts "arc_count = #{arc_count}"
puts "-----"
i = 1
ps.each_cons(2) do |p1, p2|
 puts "arc #{i} => start = (#{p1.x.to_f.round(1)}, #{p1.y.to_f.round(1)}) end = (#{p2.x.to_f.round(1)}, #{p2.y.to_f.round(1)})"
 i += 1
end
Boris Beaulant
( Modifié )

David Marmilloud j'ai peut-être mal compris la base du raisonnement, mais comment ces deux premiers rayons peuvent-ils être égaux si les deux extrémités de l'arc sont sur l'ellipse ?

Boris Beaulant

David Marmilloud mais la il est question d’export 2D. Si des surfacés doivent être exploitées il y au ra l’export 3D.

Boris Beaulant
( Modifié )

J'ai poussé l'essai commencé ici pour que ça recherche les arc de cercles avec le point central de la portion et la méthode à 3 points.

Il en sort ceci. On voit que lorsque l'ellipse s'aplatit, on s'éloigne de plus en plus du fait que les portions d'arc de cercle soient tangentes les unes aux autres.

Et des NaN apparaissent dans la recherche des centres d'arc parce que les 3 points sont quasiment alignés ...

Boris Beaulant
( Modifié )

Je ne comprends pas tout à la représentation graphique

Ce qui se dessine c'est les points début et fin de chaque arc et un trait pointillé qui les relie au centre de chaque arc.

J'ai voulu reproduire ce que David Marmilloud montre dans son dessin avec les rayons coïncidents.

d'où les NaN

Les NaN sont surtout au début (t = 0) où les arcs sont très courts et donc les points début, milieu et fin des arcs trop proche pour ne pas être vu comme alignés dans la précision possible.

Oui dans ce cas nul autre choix que de remplacer par un segment ou de retirer le point étape.

le centre du cercle approchant part à l'infini

Oui, il y aura aussi ce cas à l'autre bout.

Boris Beaulant

Je sais même pas si c'est vraiment une question de simplicité, mais plus d'objectif.
En effet, j'ai l'impression que si toutes les portions d'arc de cercle sont tangentes 2 à deux, on s'éloigne plus de la forme de l'ellipse que si on ne l'est pas.

Le choix est donc : forme ou continuité. Et en même temps avec plus de points, ça répond forcément mieux aux critères ... mais s'éloigne d'une "simplicité" pour l'exploitation du résultat.

Et je rejoins Kentaro que de base SketchUp est merdique sur cette notion de continuité. C'est donc de toutes façons pas pire que la donnée source.

Boris Beaulant

Jean-Claude Di Fazio les arcs de cercles, même s'ils ne sont pas parfaitement tangents les uns aux autres offrent une bien meilleure continuité que la suite de segments. Même imparfait, c'est forcément une courbe plus douce et c'est ça qui est désiré.

Si on veut des segments, il n'y a rien à calculer, parce que ici c'est la donnée source qui est comme ça dans SketchUp.

Boris Beaulant

Jean-Claude Di Fazio Ce type de construction ne peut donner qu’un cercle ou une spirale.

Je suis pas d'accord avec ça. L'approximation en 3 cercles montre le contraire.
Il est certain que ce n'est forcément pas un ellipse, puisque c'est une approximation 😉

Boris Beaulant

Merci mais sans tous les chouettes contributeur-ice—s, ce site ne serait pas ce qu’il est 😉

Boris Beaulant

Merci o314.

Il semble y avoir des choses à creuser, mais c'est le genre de lecture que j'ai du mal à comprendre :(.

pas reussi a indenter les listes. dsl

Il faut changer de puce -, puis +

Boris Beaulant

Ca risque fort de ne pas nous amener à des arcs de cercle tout ça.

Boris Beaulant
( Modifié )

Merci Kentaro pour les pistes.

Pour le moment, je cherche le cercle oscultateur tous les Pi/32 (entre a1 et a2) pour en extraire sa "courbure" et c'est pas trop mal. Mais ça fait trop de points, je trouve.

Boris Beaulant
( Modifié )

Faut que je creuse les trios de points pris sur l'ellipse pour y faire passer un cercle.

A toi de définir la distance entre les points donnant l'approximation que tu considères comme la plus acceptable entre l'arc d'ellipse et l'arc de cercle.

Oui, mais c'est dans un sens la sous-question de la question posée ici aussi.
On sait que ça sera toujours de l'approximation. Donc l'envie est de trouver le "meilleur" compromis entre nombre de points et écart avec l'ellipse d'origine.

Sinon, regarde les techniques de lissage ou comment trouver l'équation d'une courbe passant par x points (polynomiale)

Barf le problème est un peu à l'envers ici. On a déjà le truc lisse : c'est l'ellipse. Et on veut en faire des points reliés par des arcs de cercle.

Boris Beaulant

ça, c'est simple [...]

Barf, reste à trouver une stratégie efficiente pour choisir les trios de points.

Boris Beaulant
( Modifié )

✔ Testé

J'ai testé avec la recherche de cercle par 3 points et la stratégie suivante :

  • découper l'arc d'ellipse avec un point de test tous les de 1°
  • prendre 3 points consécutifs en extraire le cercle correspondant
  • boucler sur les points suivant jusqu'à ce que le point ne soit plus sur le cercle avec un delta donné.
  • créer l'arc et recommencer à l'étape 1 jusqu'à la fin du tableau de points.

Le résultat donne l'image jointe. Testé avec 2 tailles. et delta = 0.1mm

Problèmes :

  • Le delta n'a pas la même influence suivant la taille de la forme
  • Les points clé ne sont pas forcément à des endroits stratégiques (extremum). Leur position dépend du départ
Boris Beaulant
( Modifié )

il est possible de répartir les points selon ce profil de valeurs.

Wep, je comprends bien le principe, mais je vois pas comment ça peut se faire concrètement.

Sinon, tu demandes à ChatGPT

Il sort un truc différent à chaque fois et c'est pas toujours fonctionnel.

Bon, tout ça me montre que j'aurai du mieux écouter au lycée ... je tutoie mes limites rien à essayer comprendre ce que tu écris :)

Boris Beaulant
( Modifié )

Eric78 c'est certain que la formule de la courbure donne une chose intéressante. cf la vague de l'image jointe.
Mais en l'état, je vois pas trop comment l'utiliser.

Boris Beaulant
( Modifié )

ourea le courbure en fonction de t. a et b étant les rayons de l'ellipse.

$$\kappa(t) = \frac{ab}{(a^2\sin^2(t) + b^2\cos^2(t))^{3/2}}$$

def curvature(a, b, t)
 (a * b) / Math.sqrt((a**2 * Math.sin(t)**2 + b**2 * Math.cos(t)**2)**3)
end
Boris Beaulant

Merci Iskandar, mais ça va donner une liste de points tout ça, non ?

Boris Beaulant
( Modifié )

J'ai déjà transformé une liste de points en un "chemin continu" = un liste de segments et/ou arcs de cercles/ellipse. Tous les points sont sur le chemin. A ce niveau aucun approximation.

Ce chemin peut être utilisé tel quel dans un fichier SVG. Mais le DXF ne supporte pas les arcs d'ellipse. Je cherche donc à convertir un arc d'ellipse en une série d'arcs de cercle.

Boris Beaulant
( Modifié )

Eric78 oui, avec cette entité, on peut dessiner des ellipses et arcs d'ellipse. Mais c'est une entité flottante qui n'est connecté à rien à part que ses extrémités peuvent être plus ou moins au même endroit qu'une autres entités.

Le hic, c'est que ce qu'on donne pour définir cet arc c'est un centre, un rapport de rayons et deux angles. Il n'est jamais donné de point de départ ou arrivé. Et au fil des arrondis nécessaires parce que rien n'est précis à 1e-8 dans SketchUp, on en arrive à ça quand on zoom :

Boris Beaulant

Merci benjams.

Par contre, j'ai du mal à voir comment ça rendra les portions d'arc plus lisses les unes par rapport aux autres 🤔

Boris Beaulant
Je ne suis pas d'accord

Merci pour cette contribution. Mais une fiche sur Le Bon Roulement existe déjà :

Boris Beaulant

Merci etiennedm.

Oui et la publication est même plus fournie ici.

Reste qu'il ne travail que sur des quart d'ellipse et donc d'extrémum à extremum. La solution n'est pas clé en main pour l'adaptée à un arc. Mais ça reste en effet une autre stratégie intéressante. Même si la dernière page ne montre pas un résultat si parfait, même à 8 points :)

Boris Beaulant
( Modifié )

Merci francoisB30,

J'ai aussi regardé du côté de QCAD Pro qui offre le découpage suivant.
Mais cette fonction n'est pas dans la version Open Source.

Boris Beaulant

Publication déplacée dans la rubrique Questions. Merci de veiller à respecter les type de contenu de chaque rubrique Saintjean 😉

Boris Beaulant

Ces dimensions sont indiquées depuis le bord du panneau.
Dans l’icône le trait c’est la coupe et la flèche est la direction depuis le bord.

par Le Bois d'Yv il y a 1 an
Boris Beaulant

Barf, rien n'est prévu question badge pour le moment :)

Boris Beaulant

Oui, un petit soucis avec la base de données qui cherche encore un peu sa réponse.

Boris Beaulant

😉

Boris Beaulant

Tu pourras trouver des réponses par ici 😉

Boris Beaulant

Jean-Claude Di Fazio c'est le rose du bouton "Financement" qui fait peur :) ?

Boris Beaulant

☺

Boris Beaulant

Hmm, oui. C'est un bug qui arrive quand tu veux partager le lien d'un site qui ne propose pas de miniature.
Dans ce cas, j'avais fait un système qui va capturer la page d'accueil en image. Mais depuis la mise à jour mon système n'est plus compatible.
Il faudrait mettre à jour une dépendance et j'ai peur que ça fasse pire que mieux. Pour le moment je procrastine sur la question.

Boris Beaulant

Oui, mais avec quelques "manques" aussi. Il n'exporte que qu'en regardant ce qui est dans le plan horizontal et ne sais pas convertir les cercles en vrais cercles.