Longueur d'un rayon

Signaler
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
-
Messages postés
14922
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
-
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

6 réponses

Messages postés
14922
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
447
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.
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.
Messages postés
14922
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
447
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


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.
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.
Messages postés
191
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 octobre 2020
5 >
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.
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
>
Messages postés
191
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 octobre 2020

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.
Messages postés
14922
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
447
0° trigo et sens horaire, c’est pas très cohérent mais soit.
Ma démonstration reste valable, à priori.
Messages postés
191
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 octobre 2020
5
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.
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.
Messages postés
1768
Date d'inscription
vendredi 9 mai 2008
Statut
Modérateur
Dernière intervention
23 octobre 2020
105
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
Messages postés
61
Date d'inscription
jeudi 28 février 2013
Statut
Membre
Dernière intervention
21 octobre 2020

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é.


Messages postés
14922
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
447
Bonjour, c'est déjà ce qu'il fait.
Messages postés
14922
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
447
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
Messages postés
191
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 octobre 2020
5
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.
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.
Messages postés
14922
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
447
De rien