Tracer un arc
Fermé
mimi_info
Messages postés
56
Date d'inscription
jeudi 24 avril 2008
Statut
Membre
Dernière intervention
20 août 2022
-
4 mars 2016 à 17:23
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 6 mars 2016 à 12:33
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 6 mars 2016 à 12:33
A voir également:
- Tracer un arc de cercle
- Tracer un mail - Guide
- Tracer un itinéraire sur une carte - Guide
- Comment tracer un ordinateur volé - Guide
- Que doit-il faire pour effacer les traces de sa navigation ? - Guide
- Tracer un telephone - Guide
3 réponses
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
Modifié par KX le 5/03/2016 à 17:04
Modifié par KX le 5/03/2016 à 17:04
Hummm...
Entre deux points tu peux tracer une droite, ou un segment.
Mais des cercles qui passent par ces points tu en as une infinité !
La méthode drawArc de Java prends 6 paramètres :
void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
Remarque :
x et y ne sont pas les coordonnées du centre
si width != height, ce n'est plus un arc de cercle
La confiance n'exclut pas le contrôle
Entre deux points tu peux tracer une droite, ou un segment.
Mais des cercles qui passent par ces points tu en as une infinité !
void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
Remarque :
x et y ne sont pas les coordonnées du centre
si width != height, ce n'est plus un arc de cercle
La confiance n'exclut pas le contrôle
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
6 mars 2016 à 12:33
6 mars 2016 à 12:33
Pour m'amuser j'ai fait le code chez moi, alors je te le donne.
Il y a des commentaires pour expliquer les calculs, je ne les détaillerais pas davantage (on n'est pas sur un forum de maths) mais pour comprendre voici un schéma qui fait apparaître les différentes variables intermédiaires que j'utilise dans le code.
Remarque : je ne gère pas certains cas particulier qui peuvent conduire à obtenir des valeurs NaN (à cause de divisions par 0 ou de l'arc-tangente)
Il y a des commentaires pour expliquer les calculs, je ne les détaillerais pas davantage (on n'est pas sur un forum de maths) mais pour comprendre voici un schéma qui fait apparaître les différentes variables intermédiaires que j'utilise dans le code.
/** * @return x, solution of (a+bx)²+(c+dx)²=e² */ private static double resolve(double a, double b, double c, double d, double e) { // http://www.wolframalpha.com/input/?t=crmtb01&i=(a%2Bb*x)%C2%B2%2B(c%2Bd*x)%C2%B2%3De%C2%B2 return (-Math.sqrt(2*a*b*c*d - a*a*d*d - b*b*c*c + b*b*e*e + d*d*e*e) - (a*b+c*d)) / (b*b+d*d); } public static void main(String[] args) { // Parameters //------------ double x1 = 300, y1 = 100; double x2 = 700, y2 = 300; double h = 100; // >0 and <=p // Computation //------------ double x3 = (x1+x2)/2, y3 = (y1+y2)/2; // (x3,y3) middle of (x1,y1) and (x2,y2) double p = Math.hypot(x3-x1,y3-y1); // distance between (x1,y1) and (x3,y3) solve (x3-x1)²+(y3-y1)²=p² double r = (p*p+h*h)/(2*h); // on right triangle, solve p²+(r-h)²=r² double a = (y1-y2) / (x1-x2), b = (x1*y2 - x2*y1) / (x1-x2); // y=ax+b for (x1,y1) and (x2,y2) double c = -1/a, d = y3-c*x3; // line y=cx+d is perpendicular with line y=ax+b // y0=c.x0+d so distance between (x0,y0) and (x3,y3) solve (x3-x0)²+(y3-(c.x0+d))² = (r-h)² double x0 = resolve(x3, -1, y3-d, -c, r-h), y0 = c*x0+d; double alpha1 = Math.atan2(y1-y0,x1-x0), alpha2 = Math.atan2(y2-y0,x2-x0); // Display //------------ int x = (int) Math.round(x0 - r), y = (int) Math.round(y0 - r), width = (int) Math.round(2*r), height = width; // angles are negative because Swing origin is on top-left corner with descending ordinates int startAngle = (int) -Math.round(Math.toDegrees(alpha1)), arcAngle = (int) -Math.round(Math.toDegrees(alpha2 - alpha1)); JFrame frame = new JFrame(); frame.setContentPane(new Container() { @Override public void paint(Graphics g) { super.paint(g); g.setColor(Color.GRAY); g.drawRect(x, y, width, height); g.setColor(Color.MAGENTA); g.drawArc(x, y, width, height, startAngle, arcAngle); g.setColor(Color.BLUE); g.drawLine((int) x1, (int) y1, (int) x2, (int) y2); g.drawLine((int) x0, (int) y0, (int) x3, (int) y3); } }); frame.setSize(817, 839); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
Remarque : je ne gère pas certains cas particulier qui peuvent conduire à obtenir des valeurs NaN (à cause de divisions par 0 ou de l'arc-tangente)
Chris 94
Messages postés
50978
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
17 février 2023
7 323
4 mars 2016 à 17:40
4 mars 2016 à 17:40
Bonjour,
Avec un compas... mais c'est hors sujet ici. C'est pour quand ?
Avec un compas... mais c'est hors sujet ici. C'est pour quand ?
mimi_info
Messages postés
56
Date d'inscription
jeudi 24 avril 2008
Statut
Membre
Dernière intervention
20 août 2022
4 mars 2016 à 18:03
4 mars 2016 à 18:03
Non , C'est pour dessiner un graphe en java ,
J'ai essayé avec drawarc mais il faut connaitre le centre du cercle , je veux chercher une méthodes plus simple pour tracer l'arc entre deux points quelconques !!
J'ai essayé avec drawarc mais il faut connaitre le centre du cercle , je veux chercher une méthodes plus simple pour tracer l'arc entre deux points quelconques !!
Chris 94
Messages postés
50978
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
17 février 2023
7 323
>
mimi_info
Messages postés
56
Date d'inscription
jeudi 24 avril 2008
Statut
Membre
Dernière intervention
20 août 2022
4 mars 2016 à 18:07
4 mars 2016 à 18:07
Si je me souviens bien de mes lointaines maths, avoir 2 points d'un cercle tu dois trouver le centre, non ? Je me trompe peut-être...
mimi_info
Messages postés
56
Date d'inscription
jeudi 24 avril 2008
Statut
Membre
Dernière intervention
20 août 2022
4 mars 2016 à 18:17
4 mars 2016 à 18:17
Oui justement , Pour utiliser la méthode drawarc il faut connaitre le centre du cercle , afin de trouver l'angle de départ !
Chris 94
Messages postés
50978
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
17 février 2023
7 323
>
mimi_info
Messages postés
56
Date d'inscription
jeudi 24 avril 2008
Statut
Membre
Dernière intervention
20 août 2022
Modifié par Chris 94 le 4/03/2016 à 18:19
Modifié par Chris 94 le 4/03/2016 à 18:19
Oui, justement... ;) Il me semble, disais-je, que si tu connais deux points, tu peux calculer la position du centre.
4 mars 2016 à 21:46
4 mars 2016 à 21:51
4 mars 2016 à 21:58
Et même avec des paramètres au hasard tu arriveras toujours à tracer un arc...
5 mars 2016 à 00:18
Merci pour votre réponse.
5 mars 2016 à 13:45
void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
Que ce soit un cercle (width = height) ou non, le centre est x+width/2, y+height/2
Puisque que x,y est le coin en haut à gauche du carré où s'inscrit le cercle.
Exemple :
Quant à ton problème de vouloir faire passer un arc par deux points, il faut revenir à ma première intervention, tu en as une infinité !
Il te faut un cinquième paramètre pour pouvoir déterminer un unique arc.
Par exemple tu peux considérer la distance de l'arc par rapport au milieu de tes deux points, que j'appelle h pour hauteur.
Mais convenons en, ce n'est plus un problème de programmation Java... mais uniquement un problème de mathématiques !