Maison  >  Questions et réponses  >  le corps du texte

javascript - Comment déterminer si la position du point est sur la ligne tracée lorsqu'on clique sur la page Canvas? Quelque chose déclenche un événement sur une ligne tracée ?

Ce qui suit sont trois paragraphes de code souligné. Lorsque j'entre en mode édition ; lorsque je clique sur le bouton gauche de la souris, la position correspondante du bouton gauche dans vcanvas a été enregistrée. Comment puis-je savoir si le point sur lequel j’ai cliqué se trouve sur le segment de ligne que j’ai dessiné ?

//Voici le code clé souligné

        ctx.beginPath();
        var x1=parseInt( (quxian[0].GLB-M_qishi)*(Wmax/M_glb));
        //速度第一个点的值
        var y1=parseInt(main_h-(main_h-space_h)/100*quxian[0].SPEED); 
        var x2,y2;        
        for(var i=1;i<quxian.length;i++){
                x2=parseInt( (quxian[i].GLB-M_qishi)*(Wmax/M_glb));  
                
            y2=parseInt(main_h-(main_h-space_h)/100*quxian[i].SPEED);   
            ctx.moveTo(x1,y1);
               ctx.lineTo(x2,y2);
               x1=x2;
               y1=y2;
        };
        //console.log("第一个点:"+x1+":::"+y1)
        ctx.strokeStyle="green";  //线条颜色
           ctx.stroke();
           ctx.closePath();
            
           
        ctx.beginPath();//管压------------------    
        x1=parseInt( (quxian[0].GLB-M_qishi)*(Wmax/M_glb));
        var yy1=parseInt(main_h-(main_h-space_h)/600*quxian[0].GY); 
        var xx2,yy2;                
        for(var j=1;j<quxian.length;j++){                     
            xx2=parseInt( (quxian[j].GLB-M_qishi)*(Wmax/M_glb));            
            yy2=parseInt(main_h- (main_h-space_h)/600*quxian[j].GY);   
            ctx.moveTo(x1,yy1);
               ctx.lineTo(xx2,yy2);
               x1=xx2;
               yy1=yy2;
        };            
           ctx.strokeStyle="#fff";  //线条颜色
           ctx.stroke();
           ctx.closePath();
           
           
        ctx.beginPath();//牵引力----------------
        x1=parseInt( (quxian[0].GLB-M_qishi)*(Wmax/M_glb));
        var yyy1=parseInt(main_h-(main_h-space_h)/1000*quxian[0].QYL);            
        var xxx2,yyy2;    
        for(var k=1;k<quxian.length;k++){
             
            xxx2=parseInt( (quxian[k].GLB-M_qishi)*(Wmax/M_glb));            
            yyy2=parseInt(main_h-(main_h-space_h)/1000*quxian[k].QYL); 
            //牵引力需要负数
            ctx.moveTo(x1,yyy1);
               ctx.lineTo(xxx2,yyy2);
               x1=xxx2;
               yyy1=yyy2;
        }            
           ctx.strokeStyle="blue";  //线条颜色
           ctx.stroke(); 
              ctx.closePath(); 

    //选线事件---------------------------------------------------------------
        $("#xuanxian").click(function(){
            
            var canvas = document.getElementById("ri");
            var context = canvas.getContext("2d");
            canvas.onclick = function(e) {
                var bbox = canvas.getBoundingClientRect();
                var x =  parseInt( e.clientX - bbox.left * (canvas.width/bbox.width));//鼠标点击canvas图像里面的X位置;
                var y =  parseInt( e.clientY - bbox.top * (canvas.height/bbox.height));
                //为什么不是直接e.clientY - bbox.top呢
                console.log("点击时鼠标的坐标:"+x+","+y) 
                //进行判断
                if(true){
                    //这里执行在线上的事件
                }else{
                    return false;
                    //这里执行未选中的事件
                }
                  //alert(context.isPointInPath(83365,708));
            };    
        }); 
世界只因有你世界只因有你2684 Il y a quelques jours1125

répondre à tous(1)je répondrai

  • 阿神

    阿神2017-06-13 09:26:19

    Généralement, comme ceci, vous devez d'abord définir une plage sélectionnable pour le segment de ligne (x, y des quatre sommets), tout comme si vous écriviez un jeu.
    Déterminez ensuite la plage de sélection de l'objet où se trouve la souris en obtenant les coordonnées de la souris dans le canevas. À ce stade, vous pouvez envisager d'utiliser le mode observateur pour implémenter la liaison d'événements.
    Quant à l'algorithme permettant de déterminer si les coordonnées sont dans la plage, il peut être déterminé par la méthode des rayons (en tenant compte du fait que le segment de ligne peut être pivoté et mis à l'échelle).

    Bien que je veuille vous aider, le code source que j'ai écrit a disparu après que j'ai cassé le disque dur de mon ordinateur il n'y a pas longtemps.
    Permettez-moi d'écrire les idées de base pour vous :
    1. Tout d'abord, définissez la plage en regardant l'exemple dans les commentaires. Une fois les quatre sommets définis, nous avons essentiellement une plage active. cela dépend de vos besoins personnels.

    2. Le "mode observateur" (mode éditeur-abonné) peut être recherché en ligne pour le code de base. Il est en fait très facile à comprendre.

    3. Quant à l'algorithme des coordonnées après rotation, cliquez ici (notez qu'il s'agit de la formule pour la rotation dans le sens inverse des aiguilles d'une montre) et appliquez-le simplement directement.

    4. Pour la méthode des rayons, vous devrez peut-être utiliser des vecteurs pour calculer, veuillez vous rappeler vos mathématiques du lycée.

    J'ai corrigé les liens pour vous, apprenez-les lentement d'abord. Cela semble ennuyeux, mais c'est en fait très simple une fois que vous l'avez compris.

    répondre
    0
  • Annulerrépondre