Ellipse et secteur

Résolu
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015 - 7 févr. 2010 à 13:01
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015 - 14 févr. 2010 à 13:43
Bonjour
Je suis une buse en trigonometrie et je n'arrive à régler le problème suivant:
Je suis en VB dotNet, mais en c# m^me topo
Je trace un secteur avec la fonction :
gr.FillPie(brush, p0.X, p0.Y, p1.X - p0.X, p1.Y - p0.Y, m_startAngle, m_sweepAngle)

dans mon exemple m_startAngle=45° et m_sweepAngle=90°

Maintenant j'essaie de tracé un carré au début et à la fin du secteur.
Qaund j'ai un cercle, pas de problème c'sst ok, mais dés que j'ai une ellipse, j'ai un écart que je n'arrive pas à calculé.
Pour calculer le point de départ je fait

'conversion en radian de l'ange de départ
aRad = startAngle * Math.PI / 180
'calcul des points x et y
' P0 est le point haut/gauche du rectangele qui contiant l'ellipse
'rx est le rayon horizontal
'ty est le rayon vertical
x = p0.X + ((rx - 1) * (1 + (Math.Cos(aRad))))
y = p0.Y + ((ry - 1) * (1 + (Math.Sin(aRad))))

'création du point puis dessin d'an carre a ce point
pStart = New Point(CInt(x), CInt(y))



Su l'image l'ange E est bien égal à 45° mais mon point se place sur la diagonale du rectangle rayonVertical x rayonHorizontal.
Le point dont je parle est le carré vert entouré d'un cercle rouge.
Les autres points rouges et jaunes ne sont que des repères. tous les 10°

J'imagine que c'est un truc du genre
aDeg = startAngle - ((1 - Math.Asin((ry / rx))) * 180 / Math.PI)
pour calculé l'angle différentiel mais c'est pas au point.

Quelqu'un aurait-il une piste pour corrige mon calcul.






JJDai

4 réponses

jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
7 févr. 2010 à 15:29
Bon finalement j'ai trouvé j'avais oublié mais le différentiel se calcul comme suit pou ceux que cela intéresse :
aDeg = startAngle - ((Math.Atan((ry / rx))) * 180 / Math.PI)

puis l'ajouter a l'angle de départ
aRad = (((startAngle + aDeg)) + h) * Math.PI / 180
x = p0.X + ((rx - 1) * (1 + (Math.Cos(aRad))))
y = p0.Y + ((ry - 1) * (1 + (Math.Sin(aRad))))

...etc

Et la c'est nickel

JJDai
3
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
7 févr. 2010 à 20:58
Bin non finalement c'est pas bon non plus j'étais dans un cas particulier m_startAngle=45°)
Je continue à chercher.

JJDai
3
Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
13 févr. 2010 à 15:08
salut,

2 solutions pour ton problème :
1) ta première équation est juste (paramétrisation de l'ellipse), mais l'angle que tu utilises n'est pas correct. En effet, le 45° dans l'ellipse ne correspond pas au 45° du dessin, car l'ellipse est "aplatie". Il faut donc trouver "l'angle" correspondant à 45°.
2) tu décides de travailler avec ton angle de 45°, mais du coup ton équation doit doit utiliser un seul "r", et non rx et ry.
Je te fais grâce des calculs, ce que tu cherches est:

x = p0.X + rx + r * Math.Cos(aRad)
y = p0.Y + ry + r * Math.Sin(aRad),

avec aRad = startAngle * Math.PI / 180 comme avant, mais plus important,

r = 1 / Sqrt((Cos(aRad)/rx)^2 + (Sin(aRad)/ry)^2)

(désolé, je ne connais pas les fonctions VB.Net, j'en suis resté à la vieille version...)

Je ne sais pas pourquoi tu as (rx-1) et (ry-1) dans tes équations, c'est peut-être une de tes conventions... Si mon point (x,y) n'est pas à la bonne position, change donc rx et ry de mon équation par (rx-1) et (ry-1)

Bonne prog

PS : rassure-toi, tu n'es pas une telle "buse" que ça, j'ai moi aussi du réfléchir un peu ;-)
3
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
14 févr. 2010 à 13:43
Bonjour
----------------
Merci pour ces infos, je vais tester ça de suite.
Pour l'adaptation avec les fonctions dotnet pas de problème.
Le -1 était à l'origine une correction de 1 pixel pour l'affichage, mais dans ce cas, ce n'ai as utile.
La il s'agit de positionner une poignée qui permettra de modifier la taille ou la position du secteur donc il faut que je puisse faire e tour du cercle sans qe la poignée se balade n'importe ou, mais bien au bout du rayon en suivant l'ellipse..

Pour info je développe une petite appli de gestion de dessin vectorielle pour les passionnés d'origami.
Les logiciel existant comme illustrator ou freehand sont super mais ne correspondent pas vraiment ce que je souhaite.


JJDai
3
Rejoignez-nous