IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

le point est dans un rectangle ou non


Sujet :

Mathématiques

  1. #61
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut
    j'ai trouvé ce post :
    http://www.developpez.net/forums/sho...light=rotation

    Je sais donc recalculer les coordonnées X/Y des 4 points du rectangle.
    il reste un souci mais vous n'y pouvez pas grand chose, à force de petits schémas et beaucoup de patience je vais y arriver
    en effet pour déterminer si un point est dans le rectangle, j'utilise les points caractéristiques (Xmin,Ymin,Xmax,Ymax)

    Sauf cas particulier (angle de 0,90,180 ou 270) les 4 points ont une seule de ces caractéristiques à la fois.
    Je sais qu'il suffirait de recalculer les 4 points et grâce a des loops déterminer quels points ont telle caractéristique.
    Mais ce n'est pas la méthode la plus performante.
    selon l'angle final d'inclinaison et l'angle de départ les points changent de caractéristique ou non
    il ne me reste plus qu'à prévoir tous les cas

  2. #62
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut
    Aprés la découverte de c'est qu'est un float et de longues heures de débogage j'ai finalement fini mon système

    Pour les curieux voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    globals
        constant real PI_2 = 1.570795
        constant real PI = 3.14159
        constant real XMAX = 100000000 // assurez vous que le xMax de votre map soit plus petit que cette valeur
        constant real YMAX = 100000000 // idem
        constant real XMIN = -100000000 // assurez vous que le xMin de votre map soit plus grand que cette valeur
        constant real YMIN = -100000000 // idem
        constant real ER = 0.001 // étant donné que les réels sont des floats mais que les cordonnées n'ont que trois chiffres derrière la virgule
        rectangle R // je l'utilise pour un exemple
    endglobals
     
    struct rectangle // 8190 instances possibles
        real x0
        real y0 // je n'ai pas défini le statut private aux membres de la struct afin de ne pas être dans l'obligation de créer des methods (ou fonctions) pour récupérer les valeurs 
        real x1 // mais ce qui veut dire que vous pouvez modifier les valeurs des membres en dehors de la struct comme bon vous semble
        real y1 // ce que je vous déconseille fortement, à moins d'avoir parfaitement compris le fonctionnement
        real x2
        real y2
        real x3
        real y3
        boolean oriented 
        real angle
        real xA
        real yA
        real xB
        real yB
        real xC
        real yC
        real size
     
        static method create takes real xa,real ya,real xb,real yb,real size returns rectangle
            local rectangle r
            local real an
            local real ap
            local real sinP
            local real sinN
            local real cosP
            local real cosN
            local integer i=0
            local real xMin=XMAX
            local real yMin=YMAX
            local real xMax=XMIN
            local real yMax=YMIN
     
    // les lignes de code commencant par debug seront enlevées du script de la map si le debug mode n'est pas coché
    // (onglet jasshelper)
    // je vous conseille de le cocher pour des tests de votre map, puis ceux ci une fois fini
    // le décocher et resauvegarder votre map
        debug if size<0 then
        debug   call BJDebugMsg("une largeur négative o_O")
        debug   return 0
        debug endif
     
    // j'autorise la taille 0, ce qui correspond à un rectangle particulier : un segment
     
        debug if xb<=xa+ER and xb>=xa-ER and yb<=ya+ER and yb>=ya-ER then
        debug    call BJDebugMsg("les deux points ont les mêmes coordonnées, le rectangle n'est donc pas créé car il n'est pas nécessaire pour un pauvre point")
        debug    return 0
        debug endif
     
        set r=rectangle.allocate()
        set size=size/2
        set r.size=size
     
    // x0 = xMin ; x1 = xMax ; y2 = yMin ; y3 = yMax
    // dans le cas d'un rectangle non oriente :
    // y0 = yMin ; y1 = yMax ; x2 = xMax ; x3 = xMin
    // impossible de comprendre sans faire des schémas
            if xb<=xa+ER and xb>=xa-ER then
                set r.oriented=false
                set xb=xa
                set r.x0=xa-size
                set r.x1=xa+size
                set r.x2=r.x1
                set r.x3=r.x0
                    if ya<yb then
                        set r.angle=PI_2
                        set r.y0=ya
                        set r.y1=yb
                        set r.y2=ya
                        set r.y3=yb
                    else
                        set r.angle=3*PI_2
                        set r.y0=yb
                        set r.y1=ya
                        set r.y2=yb
                        set r.y3=ya
                    endif
            return r
     
            elseif yb<=ya+ER and yb>=ya-ER then
                set r.oriented=false
                set yb=ya
                set r.y0=ya-size
                set r.y1=ya+size
                set r.y2=r.y0
                set r.y3=r.y1
                    if xa<xb then
                        set r.angle=0
                        set r.x0=xa
                        set r.x1=xb
                        set r.x2=xb
                        set r.x3=xa
                    else
                        set r.angle=PI
                        set r.x0=xb
                        set r.x1=xa
                        set r.x2=xa
                        set r.x3=xb
                    endif
            set r.xC=(xa+xb)/2
            set r.yC=(ya+yb)/2
            set r.xA=xa
            set r.yA=ya
            set r.xB=xb
            set r.yB=yb
            return r
     
            else
                set r.oriented=true
                set r.angle=Atan2(yb-ya,xb-xa)
     
                if r.angle<0 then
                    set r.angle=r.angle+2*PI
                    set yMin=yb
                    set yMax=ya
                else
                    set yMin=ya
                    set yMax=yb
                endif
                if xa<xb then
                    set xMin=xa
                    set xMax=xb
                else
                    set xMin=xb
                    set xMax=xa
                endif
            endif
     
            set r.xC=(xa+xb)/2
            set r.yC=(ya+yb)/2
            set r.xA=xa
            set r.yA=ya
            set r.xB=xb
            set r.yB=yb
     
            set ap=r.angle+PI_2
            set an=r.angle-PI_2
            set cosP=size*Cos(ap)
            set cosN=size*Cos(an)
            set sinP=size*Sin(ap)
            set sinN=size*Sin(an)
            set r.x0=xMin+cosP
            set r.x1=xMax+cosN
                if (r.angle<PI_2 and r.angle>0) or (r.angle<2*PI and r.angle>3*PI_2) then
                    set r.x2=xMin+cosN
                    set r.x3=xMax+cosP
                    set r.y0=yMin+sinP
                    set r.y1=yMax+sinN
                    set r.y2=yMin+sinN
                    set r.y3=yMax+sinP
                else
                    set r.x2=xMax+cosP
                    set r.x3=xMin+cosN
                    set r.y0=yMax+sinP
                    set r.y1=yMin+sinN
                    set r.y2=yMin+sinP
                    set r.y3=yMax+sinN                
                endif
        return r
        endmethod
     
        method isWidgetInRect takes widget w returns boolean
            local real x=GetWidgetX(w)
            local real y=GetWidgetY(w)
     
            if this.oriented then
                if x<=this.x2 and y<=this.y0 then
                    if (y-this.y2)*(this.x2-this.x0) < (this.y0-this.y2)*(this.x2-x) then
                        return false
                    endif
                endif
                if x>=this.x2 and y<=this.y1 then
                    if  (y-this.y2)*(this.x1-this.x2) < (this.y1-this.y2)*(x-this.x2) then
                        return false
                    endif
                endif
                if x>=this.x3 and y>=this.y1 then
                    if  (this.y3-y)*(this.x1-this.x3) < (this.y3-this.y1)*(x-this.x3) then
                        return false
                    endif
                endif
                if x<=this.x3 and y>=this.y0 then
                    if  (this.y3-y)*(this.x3-this.x0) < (this.y3-this.y0)*(this.x3-x) then
                        return false
                    endif
                endif
                return true
            else
                if x<=this.x1 and x>=this.x0 then
                    return y<=this.y3 and y>=this.y2
                endif
                return false
            endif
        endmethod
     
        method rotate takes real deg returns nothing
    // angle > 0 : sens anti-horaire (trigonométrique)
    // angle < 0 : sens horaire
            local real r
            local integer i=0
            local real array x
            local real array y
            local real dx
            local real dy
            local real cosX
            local real sinX
            local real xMin=XMAX
            local real xMax=XMIN
            local real yMin=YMAX
            local real yMax=YMIN
            local integer xMinR
            local integer xMaxR
            local integer yMinR
            local integer yMaxR
     
            debug local integer i1=0
            debug local real r1=360
            debug local real r2=deg
            debug if deg>r1 then
            debug call BJDebugMsg("un angle de "+R2S(deg)+"! un tour complet c'est 360°")
            debug call BJDebugMsg("donc là tu rajoutes ")
            debug loop
            debug    set i1=i1+1
            debug    set r2=r2-r1
            debug exitwhen r2<r1
            debug endloop
            debug call BJDebugMsg(I2S(i1)+" fois trop au lieu de simplement ajouter un angle de"+R2S(r2)+" deg :p")
            debug endif
     
            set deg=deg*bj_DEGTORAD
            set r=this.angle+deg
            loop
            exitwhen r>=0
                set r=r+2*PI
            endloop
            loop
            exitwhen r<2*PI
                set r=r-2*PI
            endloop
     
            set cosX=Cos(deg)
            set sinX=Sin(deg)
            set dx=this.xA-this.xC
            set dy=this.yA-this.yC
            set this.xA=cosX*dx-sinX*dy+this.xC
            set this.yA=sinX*dx+cosX*dy+this.yC
            set dx=this.xB-this.xC
            set dy=this.yB-this.yC
            set this.xB=cosX*dx-sinX*dy+this.xC
            set this.yB=sinX*dx+cosX*dy+this.yC
     
            if this.xB<=this.xA+ER and this.xB>=this.xA-ER then
                set this.oriented=false
                set this.xB=this.xA
                    if this.yA<this.yB then
                        set this.x0=this.xA-this.size
                        set this.y0=this.yA
                        set this.x1=this.xA+this.size
                        set this.y1=this.yB
                        set this.x2=this.x1
                        set this.y2=this.y0
                        set this.x3=this.x0
                        set this.y3=this.y1
                    else
                        set this.x0=this.xA-this.size
                        set this.y0=this.yB
                        set this.x1=this.xA+this.size
                        set this.y1=this.yA
                        set this.x2=this.x1
                        set this.y2=this.y0
                        set this.x3=this.x0
                        set this.y3=this.y1
                    endif
            elseif this.yB<=this.yA+ER and this.yB>=this.yA-ER then
                set this.oriented=false
                set this.yB=this.yA
                    if this.xA<this.xB then
                        set this.x0=this.xA
                        set this.y0=this.yA-this.size
                        set this.x1=this.xB
                        set this.y1=this.yA+this.size
                        set this.x2=this.xB
                        set this.y2=this.y0
                        set this.x3=this.xA
                        set this.y3=this.y1
                    else
                        set this.x0=this.xB
                        set this.y0=this.yA-this.size
                        set this.x1=this.xA
                        set this.y1=this.yA+this.size
                        set this.x2=this.xA
                        set this.y2=this.y0
                        set this.x3=this.xB
                        set this.y3=this.y1               
                    endif
            else
                set this.oriented=true
                set dx=this.x0-this.xC
                set dy=this.y0-this.yC
                set x[0]=cosX*dx-sinX*dy+this.xC
                set y[0]=sinX*dx+cosX*dy+this.yC
                set dx=this.x1-this.xC
                set dy=this.y1-this.yC
                set x[1]=cosX*dx-sinX*dy+this.xC
                set y[1]=sinX*dx+cosX*dy+this.yC
                set dx=this.x2-this.xC
                set dy=this.y2-this.yC
                set x[2]=cosX*dx-sinX*dy+this.xC
                set y[2]=sinX*dx+cosX*dy+this.yC
                set dx=this.x3-this.xC
                set dy=this.y3-this.yC
                set x[3]=cosX*dx-sinX*dy+this.xC
                set y[3]=sinX*dx+cosX*dy+this.yC
                loop
                exitwhen i==4
                    if x[i]<xMin then
                        set xMin=x[i]
                        set xMinR=i
                    endif
                    if y[i]<yMin then
                        set yMin=y[i]
                        set yMinR=i
                    endif
                    if x[i]>xMax then
                        set xMax=x[i]
                        set xMaxR=i
                    endif
                    if y[i]>yMax then
                        set yMax=y[i]
                        set yMaxR=i
                    endif
                set i=i+1
                endloop
            set this.x0=xMin
            set this.x1=xMax
            set this.x2=x[yMinR]
            set this.x3=x[yMaxR]
            set this.y0=y[xMinR]
            set this.y1=y[xMaxR]
            set this.y2=yMin
            set this.y3=yMax           
            endif
        set this.angle=r
        endmethod
     
        method move takes real dx,real dy returns nothing
            set this.xA=this.xA+dx
            set this.xB=this.xB+dx
            set this.xC=this.xC+dx
            set this.x0=this.x0+dx
            set this.x1=this.x1+dx
            set this.x2=this.x2+dx
            set this.x3=this.x3+dx
            set this.yA=this.yA+dy
            set this.yB=this.yB+dy
            set this.yC=this.yC+dy
            set this.y0=this.y0+dy
            set this.y1=this.y1+dy
            set this.y2=this.y2+dy
            set this.y3=this.y3+dy
        endmethod
     
    endstruct
    Il a été réalisé en Vjass et nécessite par conséquent un hack de l'éditeur (le newgen worleditor), disponible sur htpp://www.wc3campaigns.net

    Le jass2 (langage de l'éditeur de warcraft3) n'est pas orienté objet.
    Le Vjass permet d'émuler partiellement certains aspects de la POO.
    Pour cela, le compilateur d'origine, qui soit en dit en passant est merdique (plantage fréquent de l'éditeur à cause d'erreurs de scripts et le cas échéant indiquation du type d'erreur complètement approximative, voire sans rapport) a été remplacé.
    l'editeur officiel n'a aussi aucune interface digne pour coder

    Le vJass en fait utilise des variables globales array.
    Auparavant on utilisait le game cache et le bug return mais cette méthode est buggée (si l'on tente de convertir un integer en handle, l'effet est aléatoire, même si cela arrive trés rarement, même pas 1%, l'effet lui peut être désastreux, pouvant aller de rien au plantage de war3 ) et beaucoup plus lente (principalement à cause de l'utilisation de la fonction I2S).

    Si vous voulez en savoir plus ou avoir la map de démo rendez vous sur http://worldedit.free.fr/forum/index.php.
    Mon pseudo : Troll-Brain

    Merci encore à tous, et tout particulièrement pseudocode

+ Répondre à la discussion
Cette discussion est résolue.
Page 4 sur 4 PremièrePremière 1234

Discussions similaires

  1. [3D] Comment savoir si un point est dans mon champ de vision
    Par patmaba dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 04/11/2018, 13h20
  2. Savoir si un point est dans un polygone.
    Par poly128 dans le forum Langage
    Réponses: 8
    Dernier message: 18/11/2008, 09h34
  3. Déterminer si un point est dans une ellipse
    Par Tenguryu dans le forum Mathématiques
    Réponses: 8
    Dernier message: 27/06/2007, 14h32
  4. Savoir si un point est dans la zone affiché
    Par nicoenz dans le forum OpenGL
    Réponses: 6
    Dernier message: 08/12/2006, 15h59
  5. Trouver si un point est dans un polygone
    Par Mucho dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 15/09/2006, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo