Skip to Main Content
Centro Assistenza 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;
       }
   }
}

Risorse correlate