Longueur d'un rayon

Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
- - Dernière réponse : Whismeril
Messages postés
13854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 octobre 2019
- 24 juin 2019 à 21:40
Bonjour à Tous,

Je souhaiterais connaitre la formule afin d'obtenir la longueur maximale d'un rayon.
Je m'explique, un point aléatoire est mis dans une surface (rectangle, carré ou cercle). A partir de ce point je voudrais connaitre (en fonction de l'angle de 0° à 359°) la longueur maximale du rayon afin que celui-ci touche un des bords ou le bord pour un cercle.
Sinon obtenir le point maxi x,y de la fin du rayon touchant un bord et à partir de là j'obtiendrais la longueur en calculant l'hypoténuse du point aléatoire au bord.
Objet du calcul : je pars d'un point avec une faible luminosité aléatoire et celle-ci doit arriver a son maximum à la fin du rayon. Cela je sais le faire, ce qui me manque c'est la formule afin d'éviter de faire un pré-calcul avec un rayon progressif.
J'espère avoir été assez explicite.

Merci d'avance
Afficher la suite 

6 réponses

Messages postés
13854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 octobre 2019
312
0
Merci
Bonjour
C’est pas de la programmation, c’est des maths, je déplace donc ton sujet.

Par contre, peux tu poster un schéma qui illustrerait ton besoin.
Astro49
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
-
Bonjour Whismeril,

C'est effectivement un problème de maths ou plus exactement de trigonométrie, il n'en reste pas moins qu'il s'agit bien de programmation !
Je n'ai pas de schéma à te proposer car il s'agit d'un programme qui est en cours d'élaboration, il ne me manque plus que la formule pour le terminer.
Cela rentre dans le cadre d'une démonstration d'effets graphiques dédiés au traitement de la couleur en VB6 avec les fonctions de l'API.

Dans quelle rubrique as-tu déplacé, à tort me semble t-il, mon post ?

Merci et bon week-end.
Commenter la réponse de Whismeril
Messages postés
13854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 octobre 2019
312
0
Merci
Bonsoir

j'ai déplacé dans "Autres Méthodes" et pas à tord puisque tu cherches une formule et pas un code VB6, à moins que tu aies mal formulé ton texte.

Je n'ai pas de schéma à te proposer car il s'agit d'un programme qui est en cours d'élaboration

Alors il faut que tu décrives mieux, car là, j'ai pas compris ce que tu veux, et personne d'autre n'a répondu entre temps


Astro49
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
-
Bonjour,

Ce n'est pas ce que j'ai voulu exprimer. En disant origine , pour moi, cela signifie que le point x, y (situé n'importe où dans un rectangle) est le départ des 360 rayons, chacun touchant un des 4 bords.
Le 0° est le 0° trigonométrique du cercle, donc à droite du centre (pour un cercle).
Chaque rayon est tracé pixel par pixel dont la couleur varie en continu du "centre x,y" jusqu'au bord correspondant à l'angle.
Astro49
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
-


Suite à la demande voici donc un exemple imagé fait en VB6 avec un pré-calcul de la fin du rayon , Il faut imaginer cela en couleur avec les dégradés.
C'est pour éviter ce pré-calcul avec un rayon progressif que je souhaite connaitre la formule (avec Atn(), je suppose) qui permet d'obtenir directement le point d'intersection de la fin d'un rayon avec l'un des bords, de là il est facile de connaitre la longueur du rayon ce qui permet de calculer les valeurs rvb du dégradé de chaque rayon.
Le point de départ des rayons peut être situé n'importe où à l'intérieur du rectangle.
JeuDuTaquin
Messages postés
125
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
18 octobre 2019
1 > Astro49
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
-
Oui, enfin… non.

Tu parts du point pour faire une projection sur le cadre, mais c'est le contraire qu'il faut faire.

Car, si tu mets un "step" sous forme d'angle, tu auras une distance plus grande sur les bords les plus loin, et donc des zones non coloriées.
Donc, il te faudra trouver un pas d'angle très fin pour colorier chaque pixel de la fenêtre.

Je te propose d'oublier ton point comme origine, et de faire un pas directement sur les bords en Xmin>Xmax puis Ymin>Ymax et tu tournes autour de l'écran en Xmax>Xmin et tu reviens Ymax>Ymin.

Cela va t'assurer de remplir chaque pixel au pourtour de l'écran.

Le calcul de l'hypoténuse étant simple et rapide, tu aura la distance entre tous les points au pourtour de la fenêtre et le centre de ton cercle.
Tu pourras donc calculer chaque dégradé de couleur, proportionnel à la distance entre les deux points.

Sinon, comme je le disais précédemment, si tu traces une ligne constituée de points en dégradés, les point de projection sur les bords auront des écartements non égaux les uns aux autres.

Pour le tracé les lignes de points, tu as une fonction linéaire Y=X*a+b que tu pourras fractionner par portions de dégradés.
Astro49
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
> JeuDuTaquin
Messages postés
125
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
18 octobre 2019
-
Bonjour,
Ah oui, c'est une bonne idée de partir de chaque point des bords, effectivement j'aurais ainsi, par le calcul de l'hypoténuse, la longueur du rayon du point d'un bord au point d'origine et faire le dégradé en fonction de cette distance. Je retiens donc ta solution.
L'image montre des rayons espacés de 1° mais le pas est variable suivant l'espacement désiré.
Reste le problème avec les autres figures, polygones et rectangles ou carrées avec des coins arrondis. J'envisage de tracer la silhouette de la figure et vérifier pixel par pixel si un pixel est allumé ou pas.
Je fais un tableau de boolean qui met à True si un pixel est allumé. Ce tableau en pré-calcul sera valable tant que la figure ne change pas.
Ensuite dans une double boucle (x et y) je teste et si le point x,y est à True, si oui je trace de ce point vers mon point d'origine.
Merci encore et bonne continuation.
Whismeril
Messages postés
13854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 octobre 2019
312 -
0° trigo et sens horaire, c’est pas très cohérent mais soit.
Ma démonstration reste valable, à priori.
Commenter la réponse de Whismeril
Messages postés
125
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
18 octobre 2019
1
0
Merci
Salut,

C'est plutôt simple!
Tu testes la distance x,y entre les bords haut, bas, droite et gauche.
Tu prends la distance la moins grande sur les 4 distances, …. c'est ton rayon!

Donc, pas trop mathématique. Enfin, si les +, les - et les ABS, c'est pour les matheux… mais bon…

;)

Bonne chance.
Astro49
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
-
Bonjour,

Non ta méthode ne va pas. En effet si on suppose une rectangle de 800x400 et un point à100,100 la plus petite distance ne peut en aucun cas être le rayon qui touche le bord droit ou le bord inférieur.
Merci quand même.
Commenter la réponse de JeuDuTaquin
Messages postés
1717
Date d'inscription
vendredi 9 mai 2008
Statut
Modérateur
Dernière intervention
15 octobre 2019
47
0
Merci
bonjour

en calculant la difference entre le centre du cercle et la partie haute puis la partie bas puis gauche et droit du rectangle tu obtient 4 valeur et de ces valeur tu récupère la plus petite correspondant au rayon
Commenter la réponse de @karamel
Messages postés
46
Date d'inscription
jeudi 28 février 2013
Statut
Membre
Dernière intervention
7 octobre 2019
0
Merci
Bonjour,
Pour la suite, il faudra passer en radian.
Tu as un point et un angle, tu peux donc facilement calculer le vecteur directeur de ta droite.
A partir de là, tu peux obtenir l'équation de ta droite sous la forme y=ax+b.

Il suffit maintenant de vérifier par itération si le point à tracer est dans ou hors du polygone concerné.


Whismeril
Messages postés
13854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 octobre 2019
312 -
Bonjour, c'est déjà ce qu'il fait.
Commenter la réponse de DandypunkII
Messages postés
13854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 octobre 2019
312
0
Merci
En supposant que la direction 0° soit vers le bas (pour être cohérent avec les pixels) et que le rectangle soit "horizontal".
Soit le rectangle ABCD de largeur l et hauteur h


Les coordonnées des points A, B, C et D sont
  • A(0,0)
  • B(l,0)
  • C(l,h)
  • D(0,h)


On calcule les équations des droites (AB), (BC), (CD), (DA)
Exemple pour (CD):
L'equation est du type y = ax + b.
La droite passe par C donc yC = axC + b
La droite passe par D donc yD = axD + b

Calcul de a,
a = ∆ Y / ∆ X = (yC - yD) / (xC - xD)

Calcul de b, sachant que l'on connait a, on prend l'équation au point C ou D
yC = axC + b
yC - axC = b

Idem pour les 4 droites


Soit la droite (d) passant par P et de direction θ,

on voit que cette droite intersecte les 4 droites du rectangle, on va donc calculer chaque point d'intersection.

Calcul de l'équation de la droite (d)
On sait que a = ∆ Y / ∆ X, et que dans un triangle rectangle, la tangente = coté opposé / coté adjacent.

On voir que pour ce triangle le coté opposé correspond à ∆ X et le coté adjacent à ∆ Y
donc
a = ∆ Y / ∆ X
tan θ = ∆ X / ∆ Y
donc
a = 1 / tan θ

Le point d'intersection entre 2 droites et le point dont le x et le y appartiennent aux 2 droites, on peut donc écrire
y = a1x + b1
y = a2x + b2
l'une étant l'équation de la droite (d) et l'autre d'un des cotés du rectangle

y = y donc
a1x + b1 = a2x + b2

a1x - a2x = b2 - b1
(a1 - a2)x = b2 - b 1
x = (b2 - b 1) / (a1 - a2)

maintenant que l'on connait x, on peut calculer y avec l'une ou l'autre de
y = a1x + b1
y = a2x + b2

Si par exemple, on a pris la droite (AB), on vérifie si l'intersection est entre A et B,
le x doit être entre xA et xB, idem pour y.
Si oui, on a intersecté un coté, on garde, si non, on garde pas.
On a vu sur le 3eme dessin, qu'une droite intersecte 2 coté, donc on continue jusqu'a trouver les 2

Une fois que l'on a nos 2 points d'intersection, la distance avec P se calcule avec Pythagore
D2 = ∆ X2 + ∆ Y2

D = racine ( (xP - x)2 + (yP -y)2)

Voila, de 1° à 89, on trouve 178 rayons, le rayon opposé correspondant à l'angle θ + 180

De 91° à 179°, on se sert de la tangente de (θ - 90)


Cas particuliers.
  • Pour 0, 90, 180 et 270, la distance est juste le ∆ X ou le ∆ Y avec le coté concerné.
  • Si le point d'intersection est exactement un angle du rectangle, il ne faut pas chercher l'intersection suivante avec le coté suivant (on l'a déjà), mais avec celui d'après.


Voilà, enfin si je ne me suis pas trompé.

PS un carré, c'est un rectangle dont la hauteur et la largeur ont la même valeur.



Quand j'étais petit, la mer Morte n'était que malade.
George Burns
JeuDuTaquin
Messages postés
125
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
18 octobre 2019
1 -
Salut,

Oui, le théorème de Pythagore est la solution.

L'hypoténuse est la taille du rayon à un point fixe localisé sur les pourtours d'une fenêtre d'affichage.

On connait X et Y, donc ça ne pose pas de problème.
Astro49
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
-
Bonjour,

Merci beaucoup d'avoir pris le temps de faire tous ces graphiques et de me fournir des explications détaillées.

Bonne semaine.
Whismeril
Messages postés
13854
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 octobre 2019
312 -
De rien
Commenter la réponse de Whismeril