Skip to Main Content
Centro de soporte de Cognex
Logo

Script to Get Angle of Data Matrix or QR code

Script to get angle of Data Matrix or QR code.

11/02/2026

Details

Step 1: Enable Script-Based Formatting

Script to get angle of Data Matrix or QR code_image-1

Step 2: Paste below code to editor

Script to get angle of Data Matrix or QR code_image-2

var Perspective = 1;

// attach orientation to DataMatrix codes calculated through solid finder corner points
function onResult (decodeResults, readerProperties, output)
{
   if (decodeResults[0].decoded)
   {
//        output.content = decodeResults[0].content;
//debug
output.content = "";
       
       if(decodeResults[0].symbology.name == "Data Matrix" || decodeResults[0].symbology.name == "QR") // is a DataMatrix or QR code?
       {
           var ang1;
           if(Perspective){
               var m1x = (decodeResults[0].symbology.corners[1].x + decodeResults[0].symbology.corners[2].x)/2;
               var m1y = (decodeResults[0].symbology.corners[1].y + decodeResults[0].symbology.corners[2].y)/2;
               var m2x = (decodeResults[0].symbology.corners[0].x + decodeResults[0].symbology.corners[3].x)/2;
               var m2y = (decodeResults[0].symbology.corners[0].y + decodeResults[0].symbology.corners[3].y)/2;
               // right leg in 'L' orientation
               var x1 = m1x - m2x;
               var y1 = m1y - m2y;
               ang1 = Math.atan2(y1, x1) * (180 / Math.PI);
           }else{
               // right leg in 'L' orientation
               var x1 = decodeResults[0].symbology.corners[1].x - decodeResults[0].symbology.corners[0].x;
               var y1 = decodeResults[0].symbology.corners[1].y - decodeResults[0].symbology.corners[0].y;
               ang1 = Math.atan2(y1, x1) * (180 / Math.PI);
           }
//debug    
//ang1 = 0;
           if(ang1 < 0)
               ang1 += 360;
           
           var ang2;
           if(Perspective){
               var m3x = (decodeResults[0].symbology.corners[2].x + decodeResults[0].symbology.corners[3].x)/2;
               var m3y = (decodeResults[0].symbology.corners[2].y + decodeResults[0].symbology.corners[3].y)/2;
               var m4x = (decodeResults[0].symbology.corners[0].x + decodeResults[0].symbology.corners[1].x)/2;
               var m4y = (decodeResults[0].symbology.corners[0].y + decodeResults[0].symbology.corners[1].y)/2;
               // top leg in 'L' orientation
               var x2 = m3x - m4x;
               var y2 = m3y - m4y;
               ang2 = Math.atan2(y2, x2) * (180 / Math.PI);
           }else{            
               // top leg in 'L' orientation
               var x2 = decodeResults[0].symbology.corners[3].x - decodeResults[0].symbology.corners[0].x;
               var y2 = decodeResults[0].symbology.corners[3].y - decodeResults[0].symbology.corners[0].y;
               ang2 = Math.atan2(y2, x2) * (180 / Math.PI);
           }

//debug
//ang2 = 90;
           if(ang2 < 0)
               ang2 += 360;
           


           if(decodeResults[0].symbology.name == "Data Matrix"){
               // calculate angles, turn top leg towards right leg by +90°, and ensure positive angles
               ang2 += 90;
           }else if(decodeResults[0].symbology.name == "QR"){
               // calculate angles, turn top leg towards right leg by +270°, and ensure positive angles
               ang2 += 270;
           }

           if(ang2 >= 360)
               ang2 -= 360;        

//debug
//output.content += x1 + "    " + y1  + "    " ;
//output.content += x2 + "    " + y2  + "    " ;        
//output.content += "ang1: " + ang1 + "    " + "ang2: " + ang2;
       
           // average both angles and truncate decimal places
           var angle; 
           if(ang1 == 0 && ang2 < 360 && ang2 > 270){
               angle = ((360 + ang2) / 2);
           }else if(ang2 == 0 && ang1 < 360 && ang1 > 270){
               angle = ((ang1 + 360) / 2);
           }else if(ang1 > 0 && ang1 < 45 && ang2 < 360 && ang2 > 270){
               angle = ((ang1 + 360) + ang2) / 2;
           }else if(ang2 > 0 && ang2 < 45 && ang1 < 360 && ang1 > 270){
               angle = (ang1 + (ang2 + 360)) / 2;
           }else{
               angle = ((ang1 + ang2) / 2);
           }
           
           if(angle >= 360)
               angle -= 360;
           angle = Number(angle).toFixed(2);
            
//debug
//output.content += "     " + "OrgAngle: " + decodeResults[0].symbology.angle + "     " + "CalAngle: " + angle;
           
           output.content += " " + angle;
       }
   }
}

Recursos relacionados