Geometric Correction
From Dynomotion
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;
}