Geometric Correction

From Dynomotion

Jump to: navigation, search

Example KFLOP PC Program to prompt Operator for a Rotation Angle and then create a 4 point Geocorrection Table to apply this rotation

#include "KMotionDef.h"
#define TMP 10 // which spare persist to use to transfer data
#include "KflopToKMotionCNCFunctions.c"

// Create KMotionCNC GeoCorrection File based on simple Transformation

double offsetx = 0.0;  // Transform values
double offsety = 0.0;
double theta = 0.0;
double scale = 1.0;

void WriteGrid(int row, int col, FILE *f);
double TransformX(double x, double y);
double TransformY(double x, double y);

main()
{
    float value;
    
    // Ask Operator desired rotation angle
    if (!InputBox("Enter Angle in degrees",&value))  
    {
        theta = value * PI/180.0;  // convert to radians
        
        // Create Simple 4 point Geo File
        FILE *f=fopen("C:\\Temp\\MapFile.txt","wt");
        fprintf(f,"2,2\n");        // rows, cols
        fprintf(f,"1,1\n");        // gridx gridy
        fprintf(f,"-0.5,-0.5\n");  // centerX centerY

        WriteGrid(0, 0, f);  // write the 4 transformed points
        WriteGrid(0, 1, f);
        WriteGrid(1, 0, f);
        WriteGrid(1, 1, f);
        fclose(f);
        DoPC(PC_COMM_RELOAD_GEOCORRECTION);  // tell KMotionCNC to reload the file
    }
}

// write a transformed point to Geo File
void WriteGrid(int row, int col, FILE *f)
{
    double Centerx = 0.5;
    double Centery = 0.5;
    double x = col - Centerx;
    double y = row - Centery;
    fprintf(f,"%d,%d,%.11f,%.11f,0\n", row, col, TransformX(x, y), TransformY(x, y));
}

// Desired X Transformaion
double TransformX(double x, double y)
{
    return (scale * (x * cos(theta) - y * sin(theta))) + offsetx;
}

// Desired Y Transformaion
double TransformY(double x, double y)
{
    return (scale * (x * sin(theta) + y * cos(theta))) + offsety;
}