This is the sequel of the previous code implementation of spiral, that time I made a very simple archimedean spiral with the same step over. But sometime, we want more than a step over, a distance between each point of a spiral (tolerance).
Here is my code implementation in c.
/**********************************************************************
*
*
* @par Copyright(C)
* 2018 Tokyo University of Agriculture, Saville Lab.
* All rights reserved.
*
* @par History:
* - 2018/07/15 Saville Ramadhona
* - first code.
*
***********************************************************************/
/*
* Program to make spiral curve and put the point on spiral
* based on tollerance (point distance).
* Not based on parameter of spiral curve.
* eg. When tollerance is o.1, distance between adjacent points on spiral
* must not exceed the tollerance.
*
*/
#include<stdio.h>
#include<math.h>
#define M_PI 3.14159265358979323846
/**
* function to evaluate/compute point on spiral
*
* @param[in] param spiral parameter
* @param[in] theta angle in computed point (radians)
* @param[out] pt array coordinate of computed point on spiral (x,y)
* @return radius of center point of spiral to computed point
*/
double evalSpiralpt(double param, double theta, double pt[2])
{
double r = param*theta;
pt[0] = r * cos(theta);
pt[1] = r * sin(theta);
return r;
}
/**
* function to check distance square between adjacent points
* we do not use sqrt to make computation faster
*
* @param[in] point newly computed point on spiral
* @param[in] prevpoint previously computed point on spiral
* @return distance square obetween adjacent points
*/
double checkDistpt2(double point[2], double prevpoint[2])
{
return (point[0]-prevpoint[0])*(point[0]-prevpoint[0])
+ (point[1]-prevpoint[1])*(point[1]-prevpoint[1]);
}
//spiral definition r = a + bθ
void main()
{
//remove file if exist
int status;
status = remove("C:\\Users\\BA17655\\Documents\\spiral.csv");
//prepare csv file to see the computation result
FILE *fp;
fp = fopen("C:\\Users\\BA17655\\Documents\\spiral.csv", "a");
fprintf(fp, "rad, theta, r, x, y, d\n");
double pi_2 = 2* M_PI;
int numTurns = 5; //automatically determine by detecting outer edge, later!
double stepover = 0.1; //tool path stepover (USER INPUT)
double distanceBetweenTurns = stepover * (1 / (pi_2)); //b
double theta = 0.0; //starting angle
double offset = 0.0; //a (offset of starting point)
/*
double pointsPerTurn = 20; //to be modified
for(int i=0; i<(pointsPerTurn*numTurns+1); i++)
{
double r = offset + (distanceBetweenTurns*theta);
double point[2];
point[0] = r * cos(theta);
point[1] = r * sin(theta);
printf("%f %f %f %f \n", theta*(180.0/M_PI), r, point[0], point[1]);
theta += pi_2 / pointsPerTurn;
}
*/
double dist_thres2 = 0.01; //distance threshold(control point tollerance - USER INPUT)
int cnt = 0;
double point[2]; //x, y coordinate control point on spiral
double prevpoint[2];
double prevtheta;
double degree;
double sizelimit = numTurns * 360.0; //to sizelimit the size of spiral
do
{
//evaluate point in spiral
double r = evalSpiralpt(distanceBetweenTurns, theta, point);
if( cnt < 1 )
{
fprintf(fp, "%f, %f, %f, %f, %f\n", theta, theta*(180.0/M_PI), r, point[0], point[1]);
theta += pi_2 * dist_thres2;
}
if( cnt > 0 )
{
//check distance of control point
double dist2 = checkDistpt2(point, prevpoint);
//check if point distance exceed tolerance
if( dist2 > dist_thres2 )
{ //if exeec tollerance, compute new control point
do
{
//make the new point to be located in the middle of previous and current point
theta = (theta + prevtheta) * 0.5;
r = evalSpiralpt(distanceBetweenTurns, theta, point);
dist2 = checkDistpt2(point, prevpoint);
//when above is not enough, do it one more time!
if( dist2 > dist_thres2 )
{
theta = (theta + prevtheta) * 0.5;
r = evalSpiralpt(distanceBetweenTurns, theta, point);
dist2 = checkDistpt2(point, prevpoint);
}
}while( dist2 > dist_thres2 ); //when point distance lies under the tollerance, exit loop
}
fprintf(fp, "%f, %f, %f, %f, %f, %f\n", theta, theta*(180.0/M_PI), r, point[0], point[1], dist2);
prevtheta = theta;
theta += pi_2 * dist_thres2;
}
cnt++;
prevpoint[0] = point[0];
prevpoint[1] = point[1];
degree = theta*(180.0/M_PI);
}while( degree <= sizelimit );
}
After running the code, it will print out the angle (radian), angle (degree), r of each point(interpreted as 1/curvature), x, y coordinate of each point, and the distance of each point.
The plotted spiral from the code in excel is as shown below.
Pretty simple right!
spiral 2