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
14097
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 janvier 2020
- 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
14097
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 janvier 2020
330
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
14097
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 janvier 2020
330
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,

Une formule oui, mais en VB6, ;)

Problème : calculer la longueur d'un rayon partant d'un point, par exemple, 50,100 avec une direction de 38° jusqu'à l'un des bords d'un rectangle de 800x400.
En fait ce que je veux c'est, à partir d'un point situé n'importe où dans une surface,
tracer pixel par pixel un rayon qui commence par une couleur sombre et qui finit par du blanc à la fin du rayon qui touche un des bords de la surface suivant un angle donné. Il me faut donc connaitre la longueur du rayon afin de faire varier les composantes rvb de la couleur de départ. La surface peut être un carré, un rectangle, un cercle, une ellipse ou bien un polygone voire une étoile à n branches.
Pour l'instant je créé une région de la surface et fais un rayon progressif dans une boucle pour chaque degré (0...359). Si le point x,y calculé sort de la région ( If PtInRegion(region, x, y) = 0) j j'obtiens la longueur du rayon +1. Je mets dans un tableau la longueur du rayon -1 pour l'angle en cours et quitte la boucle du rayon pour continuer la boucle des degrés. C'est pour éviter ce pré-calcul que je souhaite obtenir une formule du moins pour un carré ou un rectangle. Je sais qu'il en existe une mais mes notions de trigonométrie datent de plus de 60 ans !
Pour un cercle c'est facile, je calcule la distance du point excentré x,y avec celle du point x,y donnée par le rayon maximal à partir du centre. Pour lune ellipse j'utilise un rayon x et un rayon y.
Pour un polygone ou une étoile je ne vois pas d'autres solution que de passer par un pré-calcul.
Au final cela donne un point sombre avec des rayons sur 360° qui vont en s'éclaircissant sur les bords de la surface (ou inversement). J'ai aussi essayé de passer d'une couleur sombre à une autre plus claire et il en résulte aussi un joli effet de divers dégradés.
J'espère, cette fois ci, m'être mieux fait comprendre et merci de m'avoir lu jusqu'au bout !

Bonne semaine.
Whismeril
Messages postés
14097
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 janvier 2020
330 -
Bonjour

trois petites précisions,
  • tu parles de taille en pixels, donc x varie bien de gauche à droite et y de haut en bas?
  • le point de départ est toujours à l'intérieur?
  • où est l'origine et quel le sens de rotation de tes angles?
Astro49
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
-
Bonjour,

1) oui en pixels, mais x et y sont aléatoires ou choisis par un clic de souris à l'intérieur de la surface, ils n'ont donc pas de logique de déplacement.
C'est à partir de ce point que sont tracés les rayons (du point vers un des bords selon l'angle) avec un dégradé de couleur. Il y a donc 360 rayons de base ou plus selon la densité choisie.

2) oui le point de départ est toujours à l'intérieur de la surface.

3) l'origine est le point aléatoire (ou défini par un clic) et la rotation se fait dans le sens horaire.

Bonne soirée.
JeuDuTaquin
Messages postés
143
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
8 janvier 2020
2 > Astro49
Messages postés
12
Date d'inscription
mardi 21 novembre 2017
Statut
Membre
Dernière intervention
24 juin 2019
-
Salut Astro49,

Peux-tu associer une image du rendu voulu (rapidement dessinée sur ton joliciel préféré), car ta demande semble très simple, mais tu semble vouloir introduire des calcules qui n'ont pas lieu d'être dans un repère orthonormé… (cf réponse de Whismeril ! )…
Il n'y a pas d'arcs de cercles à tracer, car le "workspace" des "frames" et des "PictureBox" est ouvert, mais non affiché… un cercle à cheval avec un bord ne te donnera pas d'erreurs… la partie hors affichage ne sera pas vue, c'est tout !
Allez, une petite photo … ?
Whismeril
Messages postés
14097
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 janvier 2020
330 -
Non, l'origine des angles n'est pas un point, c'est une direction, est ce que 0° c'est vers le haut, en diagonale, vers la gauche etc....
Commenter la réponse de Whismeril
Messages postés
143
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
8 janvier 2020
2
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
1742
Date d'inscription
vendredi 9 mai 2008
Statut
Modérateur
Dernière intervention
10 janvier 2020
52
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
48
Date d'inscription
jeudi 28 février 2013
Statut
Membre
Dernière intervention
12 janvier 2020
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
14097
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 janvier 2020
330 -
Bonjour, c'est déjà ce qu'il fait.
Commenter la réponse de DandypunkII
Messages postés
14097
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 janvier 2020
330
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
143
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
8 janvier 2020
2 -
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
14097
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 janvier 2020
330 -
De rien
Commenter la réponse de Whismeril