Question de trigonométrrie [Résolu]

cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 3 mai 2014 à 19:07 - Dernière réponse : cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention
- 6 mai 2014 à 22:22
Bonjour,

J'aimerai connaitre la formule qui permet de connaitre le "point d'arrivée" en x, y d'un rayon.
Je m'explique, je pose au hasard un point sur l'écran et à partir de là je trace des rayons tous les 10° (de 0 à 350) et ce jusqu'au bord d'un cadre.
Pour l'instant, ne connaissant pas cette formule, j'incrémente la longueur de chaque rayon tant que celui-ci ne sort pas des dimensions du cadre.
Mais il y a sûrement une méthode qui permette d'éviter ce bidouillage par un savant calcul en tenant compte, je suppose, du centre (qui est le point posé au hasard) et des dimensions du cadre.
Je peux aussi imposer un rayon maximum et faire un clipping de la région du cadre, mais je souhaite quand même savoir si il a une possibilité de calcul.

Merci d'avance,

Cheyenne

--
Afficher la suite 

Votre réponse

26 réponses

cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - Modifié par cs_ShayW le 3/05/2014 à 21:35
0
Merci
Bonjour
Pourquoi ne pas tracer des segments à partir du cadre vers le point
    
-----------------------------
\
\
\.
Commenter la réponse de cs_ShayW
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 4 mai 2014 à 01:58
0
Merci
Bonjour ShayW,

Un plaisir de te retrouver !
Oui, je comprend bien ton idée, mais justement comment déterminer où se situe le point x,y du cadre pour revenir vers le centre en tenant compte de l'angle ?
En fait ce qu'il me faudrait est le calcul de la longueur du rayon en fonction du centre et de l'angle afin de toujours atteindre un des bords du cadre ou bien déterminer directement le "point d'arrivée".

Cheyenne

--
Commenter la réponse de cs_cheyenne
0
Merci
Bonjour cs_cheyenne,

Perso j'irais plutôt sur une analyse par équation de droite

chaque droite possède une équation
a x + b = y (droite du rayon)
c x + d = y (droite du segment correspondant au coté)

Tu peux résoudre pour l'intersection de 2 droites:
y = (ad -bc) / (c -a)
si a <> 0 et c <> a
et en déduire de même x = (d -b)/(a-c).

(Si c <> a les droites sont parallèles donc à moins d'être confondu il n'y a pas de solution.)

Ca c'est une solution pour des droites, comme tu travailles sur des segments si ta paire de résultat (x;y) n'appartient pas au segment, il n'y a pas d'intersections.


Déjà je simplifie les calculs en faisant apparaître le pt (0,0) dans toutes mes équations.
Sur l'ensemble de ton graphique je fais une translation pour déterminer le centre des rayons en (0,0)
Par conséquent je déplace les 4 segments qui représentent les bords de la même manière.
Si je trouve une intersection je ferais la translation inverse sur ce point.

Chaque angle possède un sin et cos
ils représentent donc un point avec l'origine des rayons
(donc on a 2 points ce qui permet d'obtenir une équation de droite)

Si tu connais :
a x + b = y (Equation du rayon ou ici b sera toujours =0)

on a donc l' Angle en Radian de -PI a PI
a = sin angle / cos angle
b = 0 ( a verifier )
=> ax = y

2 cotés sont horizontaux (résoudre l 'intersection par les y)
c x + d = y => soit y = d (on connais d)
a x = d soit x= (d/a)

2 cotés sont verticaux (résoudre l 'intersection par les x)
a x + b = y => soit x = c (on connais c)
a c + b = y

Ne pas oublier de faire une translation inverse sur les points trouvés et ensuite vérifier que le résultat appartient au segment des cotés (un rectangle.contains peut faire l'affaire)
( en m'excusant d'avance si j ai fais une erreur )

Bonne prog
CGSI3
Commenter la réponse de cgsi3
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - Modifié par CGSI3 le 4/05/2014 à 11:41
0
Merci
J'ai essayé rapidement de créer une class a ce sujet
Elle permet de tester l'intersection de 2 équations de droites et par conséquence avec un segment
C'est peut être un peu conséquent comme code mais ça donne une idée ^


  Public Class segment
        Private _P1 As PointF
        Private _P2 As PointF
        Public c As Double 'y = cx+d
        Public d As Double 'd = y - cx
        Private _Translation As SizeF

        Public Sub New(ByVal P1 As PointF, ByVal P2 As PointF, ByVal Translation As SizeF)
            _Translation = Translation
            _P1 = P1 + Translation
            _P2 = P2 + Translation
            If (_P2.X - _P1.X) = 0 Then
                c = 0
            Else
                c = (_P2.Y - _P1.Y) / (_P2.X - _P1.X)
            End If
            d = _P1.Y - (_P1.X * c)
        End Sub

      
        Public Function Intersection(ByVal a As Double, ByVal b As Double) As PointF
            Dim retour As New PointF
            If c = 0 Then ' 2 cotés sont horizontaux (résoudre l 'intersection par les y) 
                retour.X = CSng(_P1.X)
                retour.Y = CSng(_P1.X / a)
            ElseIf d = 0 Then '  2 cotés sont verticaux (résoudre l 'intersection par les x) 
                retour.Y = CSng(_P1.Y)
                retour.X = CSng((_P1.Y - b) / a)
            Else 'quelconque
                If c <> a And a <> 0 Then
                    retour.X = CSng((d - b) / (a - c)) 'x = (d -b)/(a-c)
                    retour.Y = CSng(a * retour.X + b)
                Else : retour = Nothing
                End If
            End If

            ' Ne pas oublier de faire une translation inverse sur les points trouvés et ensuite vérifier que le résultat appartient 
            ' au segment des cotés (un rectangle.contains peut faire l'affaire) 
            Dim ok As Boolean = False
            If Not (retour.X >= _P1.X Xor retour.X <= _P2.X) Then
                If Not (retour.Y >= _P1.Y Xor retour.Y <= _P2.Y) Then ok = True
            End If
            If Not IsNothing(retour) And ok Then
                Return retour - _Translation
            Else : Return Nothing
            End If
        End Function
    End Class


Qu'on utiliserai comme ceci:

Dim a As New segment(New PointF(7, 0), New PointF(7, 7), New SizeF(-4, -3)) 
' point d'un coté + origine des rayons

'Pour angle de -Pi a +Pi

Dim Ang as double=b = sin (angle) / cos (angle) 
Dim R As PointF = a.Intersection(ang, 0) 
' Equation d'un rayon    




Attention a la translation de L'équation transmise en dehors du sujet
Ce code peut être largement simplifié puisque dans Ax+b=y ; B=0 dans ce cas
On peut donc supprimer toutes référence a la variable b dans la Function Intersection pour optimiser

en espérant la aussi ne pas avoir fais d'erreur
--
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 4 mai 2014 à 12:13
Bonjour CGSI3,

Merci pour toutes ces explications ainsi que pour le code.
Celui-ci me semble être du VB.Net que je vais tenter d'adapter au VB6 avec lequel je travaille, ce que je n'avais pas précisé.

Pour simplifier j'ai écrit que je traçais une droite du point x,y à l'un des bords selon l'angle. En fait je dessine une spline qui s'appuie, pour l'instant, sur un seul point intermédiaire. Je vais optimiser en rajoutant des points en fonction de la longueur du rayon.

Cheyenne
Whismeril 11968 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 17 août 2018 Dernière intervention - 4 mai 2014 à 13:31
Bonjour, il faut faire attention aux sous catégories, tu as posté ton message dans Visual Basic, et non dans Visual Basic/VB6.
Je dépalce
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 4 mai 2014 à 13:58
Je te prie de bien vouloir m'excuser pour cette erreur.

Amicalement de Cheyenne
Commenter la réponse de CGSI3
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - Modifié par cs_ShayW le 4/05/2014 à 12:09
0
Merci
Une autre approche
Je partage en 4 parties le cadre autours du point comme le cercle
trigonométrique
le premier segment celui qui correspond à l'angle 0 a une longueur
W1

   
______w1______________
|
|
0 .__R_____________ |
\x |
R1---> \ |
\ |
\ | H1
\ |
\ |
\ |
\ |
Tx et Ty

le premier segment R = W1
x= 10 (l'angle entre R et R1)
tx = R
ty/R = tang(x)
ty = R*tang(x)
ty = W1/2 * tang(x)
au fur et à mesure x incrimente ty augmente

dessine les segments dans le quart du bas à droite

donc il faudrait dans une boucle
x = x-10
tant que W1/2 * tang(x+10) < = H1
c'est encore à annalyser
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 6 mai 2014 à 12:20
Bonjour ShayW,

Je reviens vers toi,
Ton idée est intéressante mais ce que je souhaite est justement d'éviter de passer par une boucle, ce que je fais déjà.
C'est une méthode empirique qui consiste à prendre un rayon supérieure à la diagonale du rectangle et à le diminuer jusqu'à ce que le point x,y(défini par le cosinus et le sinus de l'angle) soit contenu dans le rectangle. Ou bien faire l'inverse, partir d'un petit rayon et l'augmenter jusqu'à la limite autorisée. Cela marche très bien mais oblige à faire une boucle pour chaque rayon.

J'ai aussi essayé de tracer avec un très grand rayon et de clipper la zone utile. Juste pour le dessin c'est bien, mais travaillant en fait avec un Bitmap en mémoire je ne dois pas renseigner un x ou y dépassant les limites du tableau.

Bonne journée.

Cheyenne
Commenter la réponse de cs_ShayW
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - 4 mai 2014 à 13:32
0
Merci
Je viens de tester le code que j'ai proposé.
Il fonctionne, cependant j'ai une erreur sur les segments horizontaux. Sur tout autre type de droite cela fonctionne bien
Je chercherais l'erreur ce soir.
Bonne journée


--
Commenter la réponse de CGSI3
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - Modifié par CGSI3 le 4/05/2014 à 20:28
0
Merci
Je viens d'optimiser la class pour un rectangle
Elle fonctionne bien sur mon appli
Je peux même poser le centre des rayons en dehors du rectangle ce qui n'est pas trop le but mais ca donne un tracé assez intéressant.
Je vous laisse transposer en vb6


    Public Class segment2
        Public R1 As PointF ' les 2 coins du rectangle  
        Public R2 As PointF ' les 2 coins du rectangle  
        Public T As SizeF ' le centre des rayons
        Public Segm As New List(Of PointF) ' Le retour des points calculés

        ' Initialisation de la class
        Public Sub New(ByVal C1 As PointF, ByVal C2 As PointF, ByVal Translation As SizeF, ByVal Portions As Double)
            T = Translation : R1 = C1 - T : R2 = C2 - T
            For Angle As Double = -Math.PI To Math.PI Step Math.PI / Portions
                Dim a As Double = Math.Tan(Angle) 
                Calcul(a, R1.X, False) ' Calcul selon les 4 cotés et leurs inclinaisons
                Calcul(a, R1.Y, True)
                Calcul(a, R2.X, False)
                Calcul(a, R2.Y, True)
            Next
        End Sub

        Public Sub Calcul(ByRef a As Double, ByRef Alpha As Single, ByRef Horizontal As Boolean)
            Dim ok As Boolean = False, Pt As PointF
            If Horizontal Then
                Pt = New PointF(CSng(Alpha / a), Alpha)
                If Not (Pt.X >= R1.X Xor Pt.X <= R2.X) Then ok = True
            Else
                Pt = New PointF(Alpha, CSng(Alpha * a))
                If Not (Pt.Y >= R1.Y Xor Pt.Y <= R2.Y) Then ok = True
            End If
            If ok Then Segm.Add(Pt + T)
        End Sub
    End Class


J'initialise la class et je récupère les données sur la variable Segm

Dim a As New segment2(New PointF(200, 200), New PointF(400, 400), New SizeF(350, 350), 16)
' les 2 coins du rectangle , le centre des rayons, le nombre de rayons

For Each Seg As PointF In a.Segm
       ' Trace le segment de (350, 350) au Point Seg

Next 


Je chercherais ensuite sur un polygone quelconque comment corriger ma première class Segment et trouver l'erreur

Bonne prog cgsi3
--
Bonsoir cheyenne

La translation est ici très importante car elle me permet de supprimer de nombreux calcul
En plaçant par translation le centre des rayons en (0,0) je supprime bcp de chose.
ensuite j'applique aux résultats trouvés la translation inverse.

Pris telle quelle, sans translation, ma fonction est erroné.
Voici comment je corrigerai ça, dis moi si ca fonctionne.

Bonne nuit
CGSI3

Option Explicit

Private Type COORD
x As Single
y As Single
End Type

Dim p1 As COORD
Dim p2 As COORD
Dim pp1 As COORD
Dim pp2 As COORD
Dim xc As Integer
Dim yc As Integer

Const PI As Double = 3.14159265358979
Const PId16 As Double = PI / 16

Private Sub Form_Activate()
p1.x = 20: p1.y = 20
p2.x = 500: p2.y = 500
xc = 200: yc = 200

Me.Line (p1.x, p1.y)-(p2.x, p2.y), vbRed, B
Call CERCLE
End Sub

Private Sub CERCLE()
Dim a As Single
Dim angle As Single
pp1.x=p1.x-xc
pp1.y=p1.y-yc
pp2.x=p2.x-xc
pp2.y=p2.y-yc
For angle = -PI To PI Step PId16
a = Tan(angle)
Call CALCUL(a, pp1.x, False)
Call CALCUL(a, pp1.y, True)
Call CALCUL(a, pp2.x, False)
Call CALCUL(a, pp2.y, True)
Next angle
End Sub

Private Sub CALCUL(a As Single, alpha As Single, droit As Boolean)
Dim pt As COORD
Dim ok As Boolean

If droit Then
pt.x = alpha / a
pt.y = alpha
If Not (pt.x >= pp1.x Xor pt.x <= pp2.x) Then ok = True
Else
pt.x = alpha
pt.y = alpha * a
If Not (pt.y >= pp1.y Xor pt.y <= pp2.y) Then ok = True
End If

If ok Then Me.Line (xc, yc)-(pt.x + xc, pt.y + xy)
End Sub
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 6 mai 2014 à 14:07
Bonjour CGSI3,

Ben tu vois, quand tu veux... non je plaisante !!!

Après plusieurs essais, en assignant le centre à partir d'un clic sur la Form, force est de constater que ton code fonctionne à merveille.
Juste un détail, dans la ligne du tracé pour y2 tu as codé xy au leu yc)
J'ai bien compris qu'avec pp1 et pp2 tu ramènes le centre à "zéro" d'où mon erreur de vouloir se passer de la translation qui je croyais servait à faire un offset des coordonnées du rectangle.

Je te remercie pour ton aide précieuse qui va m'être également utile pour d'autres projets.

En ce qui me concerne, je pourrais clore le sujet, mais tu avais dit vouloir te pencher sur le même problème mais avec un polygone. Donc,dis-moi si je peux clore ou non.

Bonne journée et encore merci.

Cheyenne
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 6 mai 2014 à 19:11
Re,

Cela est confirmé, c'est nickel ! Juste un petit problème avec une divison par 0 que j'ai contourné ainsi :
a = Tan(angle): If a = 0 Then a = 1E-16, plûtot que de coder On Local Error Resume Next dans la Sub CALCUL, ai-je bien fait ?

Pour terminer avec le sujet, j'aimerais connaitre comment calculer la longueur de chaque rayon.
Voici pourquoi : je vais tracer chaque rayon non pas avec Line mais dans un Bitmap en mémoire et la luminosité de chaque pixel constituant le rayon sera en fonction de la longueur de celui-ci. Lumineux vers le centre et beaucoup moins à l'extrêmité. J'ai déja fait cela avec un cercle, dont tous les rayons sont forcément égaux, cela produit un effet pas initéressant.

Merci pour ton aide

Pour ucfoutu : oui, je sais, ce n'est pas de la progrmmation, mais comme notre ami me semble très fort sur le sujet, j'en profite !

Cheyenne
Bonsoir cheyenne

Me voila rassuré

Désolé pour la petite erreur , sans vb6 pour vérifier, et a cette heure la, je ne suis plus très affuté.

Pour calculer la longueur d'un rayon ou plutôt un segment en 2D:

Tu as donc 2 points ; P1 et P2

Dim Longueur as double = Math.Sqrt ( (P2.x-P1.x)^2 + (P2.y-P1.y)^2 )
(racine carré de la longueur des segments projetés sur les axes X et Y

(j ai écrit le signe ^2 pour facilité la compréhension, mais il est souvent a proscrire si tu veut prendre en compte la rapidité d'exécution et a remplacer par la multiplication a^2 = a*a)

Pour l'affichage du même tracé dans un polygone, je me suis un peu avancé.
Plusieurs difficultés sont a étudier , notamment la notion de Polygone convexe ou concave, ce qui implique parfois une discontinuité des rayons. ( a partir du quadrilatère et +)
Donc si une demande est faite en ce sens, j'approfondirais ma réflexion mais dans le cas présent, je m'arrête la.

En étant satisfait d'avoir pu t'aider, tu peux clore la discussion.

Bonne prog
CGSI3
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 6 mai 2014 à 22:22
Bonsoir CGSI3,

Pour le rayon je me demande encore comment ai-je pu te poser une question aussi basique !
Oui, oui l'élévation à la puissance 2 est vraiment plus lente que la multiplication.J'avais fait une batterie de test afin d'optimiser le code, en ce qui concerne la différence entre a^2 et a*a cette dernière formulation s'effectue 227 fois plus vite que a^2 en compilé et 9.8 dans l'IDE. Moyenne de 10 tests effectués chacun 1 million de fois. Temps relevés avec la fonctionQueryPerformanceCounter.

Donc, ok, je clos le sujet et te remercie une nouvelle fois.

Cheyenne
Commenter la réponse de CGSI3
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - 4 mai 2014 à 21:49
0
Merci
Et la correction de la première class

  Public Class segment
        Private _P1 As PointF
        Private _P2 As PointF
        Public c As Double 'y = cx+d
        Public d As Double 'd = y - cx
        Private _Translation As SizeF

        Public Sub New(ByVal P1 As PointF, ByVal P2 As PointF, ByVal Translation As SizeF)
            _Translation = Translation : _P1 = P1 - Translation : _P2 = P2 - Translation
            If (_P2.X - _P1.X) = 0 Then
                c = Double.MaxValue : d = _P1.Y
            Else
                c = (_P2.Y - _P1.Y) / (_P2.X - _P1.X)
                d = _P1.Y - (_P1.X * c)
            End If
        End Sub

        Public Function Intersection(ByVal a As Double, ByVal b As Double) As PointF
            Dim retour As New PointF
            If a = 0 And c = 0 Then retour = Nothing
            If a = Double.MaxValue And c = Double.MaxValue Then retour = Nothing
            If c = 0 Then ' 2 cotés sont horizontaux (résoudre l 'intersection par les y) 
                retour.Y = CSng(_P1.Y)
                retour.X = CSng((_P1.Y - b) / a)
            ElseIf c = Double.MaxValue Then '  2 cotés sont verticaux (résoudre l 'intersection par les x) 
                retour.X = CSng(_P1.X)
                retour.Y = CSng(_P1.X * a + b)
            Else 'quelconque
                If c <> a And a <> 0 Then
                    retour.X = CSng((d - b) / (a - c))
                    retour.Y = CSng(a * retour.X + b)
                Else : retour = Nothing
                End If
            End If
            ' Ne pas oublier de faire une translation inverse sur les points trouvés et ensuite vérifier que le résultat appartient 
            ' au segment des cotés (un rectangle.contains peut faire l'affaire) 
            Dim ok As Boolean = False
            If Not (retour.X >= _P1.X Xor retour.X <= _P2.X) Then
                If Not (retour.Y >= _P1.Y Xor retour.Y <= _P2.Y) Then ok = True
            End If
            If Not IsNothing(retour) And ok Then
                Return retour + _Translation
            Else : Return Nothing
            End If
        End Function
    End Class


Bonne prog cgsi3

--
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 5 mai 2014 à 12:53
Re,

J'ai donc remplacé les 4 appels à la Sub Calcul par l'appel à la fonction Intersection. Même remarque que précédemment, à savoir que tous les rayons ne sont pas tracés.

Merci pour ta collaboration.
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 5 mai 2014 à 21:49
Et c'est maintenant qu'on voit l'importance d' "ergoter" (sic) à propos de ce "cadre"...
Qu'est-ce donc ? : un rectangle déssiné sur un Form ? Un contrôle Shape ? Un Frame ? Une Picturebox ?
Car ... hé oui ... le traitement ne saurait être le même , pardi, en ce qui concerne le "tracé" du "rayon" !

Et le "rayon" lui-même ? Par quoi et comment est-il matérialisé ?
- par un contrôle Line ?
- par dessin ? et sur quoi ?
C'est également "ergoter", que de poser ces questions, sans doute ?
Ces "petits détails" ont une extrême importance.
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 5 mai 2014 à 23:54
Bonjour ucfoutu,

Qu'est-ce que le cadre ? Il s'agit ici d'une PictureBox.
Mais je ne vois pas en quoi le traitement peut-être différent selon qu'il s'agisse d'un Form, d'un Shape d'un PictureBox ou bien d'un rectangle virtuel matérialisé ou non par un cadre dessiné avec des Line. De toutes façons il faut tenir compte des 4 coins de ce rectangle quel qu'il soit.
Le rayon,lui, est dessiné par des Line(x1,y1)-(x2,y2) sur le PictureBox. La couleur des rayons changent avec l'angle, mais c'est ici un détail.

Bon rétablissement,

Cheyenne
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 6 mai 2014 à 06:40
Le rayon,lui, est dessiné par des Line(x1,y1)-(x2,y2) sur le PictureBox.

Il est normal que tu ne voies pas tous les rayons lorsque leur centre n'est pas sur la picturebox.
Puisque la méthode Line s'applique à un objet doté d'un hdc (donc soit le Form, soit la picturebox, mais pas les deux "en même temlps"). Ainsi : un rayon partant d'un centre situé hors de la picturebox et intersectant la droite d'un côté en dehors du segment du dit côté sera totalement invisible à l'écran. Et si tu dessines le rayon sur le Form, toute la partie de ce rayon partagée avec la picturebox sera occultée par la picturebox.
PS : il faut par ailleurs que la propriété Autoredraw soit à True.
Commenter la réponse de CGSI3
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 5/05/2014 à 07:44
0
Merci
Bonjour,
Désolé. Pas en état de développer dans l'immédiat.
Je vais donc me contenter d'indiquer la marche à suivre pour résoudre simplement ce problème mathématique et non de développement :
- si on relie un point situé à l'intérieur d'un rectangle (car c'est un rectangle, et non un "cadre") à chacun des angles du rectangle, on obtient 4 angles. Les trois premiers se calculent trigonométriquement. Le 4ème par soustraction de 360 - la somme des 3 1ers.
- un simple select case sur la valeur de l'angle du rayon suffit donc pour savoir quel côté du rectangle sera intersecté par le rayon.
- le reste : comme l'a dit cgsi3 dès son premier message : solution d'un système simple d'équations linéaires (y = ax + b) à 2 inconnues (équation de la droite du rayon et équation du côté retenu en select case)
Nota : les cas particuliers (point sur un côté, point d'intersection "partagé", etc ...) se règlent simplement dans le select case (à coups de <, <=, > et >=)
Une autre fois : ce n'est pas là un problème de développement, mais d'analytique.
Je vous laisse maintenant faire et retourne à mon repos.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 5 mai 2014 à 12:40
Bonjour ucfoutu,

N'ergotons point, tu as parfaitement compris que le cadre en question était bien un rectangle. Rectangle matérialisé justement par un cadre.Tu es d'ailleurs bien le seul qui m'ait fait cette remarque.
Certes, ce n'est pas un problème de développement mais je te te fais aimablement remarquer que le titre du sujet est "Question de trigonométrie" et non pas une demande d'aide pour un code..
Certes le forum est dédié au développement, mais je sais que certains sont très forts en trigo d'où ma question qui permet en plus d'écrire du code pour y répondre.

Allez, repose-toi bien...

Cheyenne
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.