8 points in a circle around target point
Hi! (beginner)
In my code below, the pxx and the pyy arrays provide circular reference points around my test XY point for an early "warning zone" .... sounding off a beeper.
This code works, but being hard coded ..... makes it hard to change. Is there a better way to create this "circle of points"?
ie: lets say I want a 3ft circle of points around my test point, I just enter a "3" and the code calculates the 8 circle point coordinates into the array for me.
Thanks!
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char** argv) {
int bi = 8; //Set Boundry loop indexing variable (Number of Points in polygon)
int ci = 9; // Set loop indexing for 8 circle points plus the test point
float x[bi];
float y[bi];
float pxx[ci];
float pyy[ci];
float px=16;// Real Test X location point
float py=13.77; // Real Test Y location point
/* The coordinates of the test point */
pxx[0]=px;// Real Test X location point
pyy[0]=py; //Real Test Y location point
/*8 X,Y points circled around the real XY location for a circular WARNING ZONE)*/
pxx[1] = px;
pyy[1] =(py+1);
pxx[2] = px;
pyy[2] =(py-1);
pxx[3] =(px+1);
pyy[3] = py;
pxx[4] =(px-1);
pyy[4] = py;
pxx[5] =(px+.75);
pyy[5] =(py+.75);
pxx[6] =(px+.75);
pyy[6] =(py-.75);
pxx[7] =(px-.75);
pyy[7] =(py+.75);
pxx[8] =(px-.75);
pyy[8] =(py-.75);
float x1;
float x2;
float k;
/* The points creating the polygon (INVISIBLE FENCE YARD BOUNDRY) */
x[0] = 7; y[0] = 22;
x[1] = 10; y[1] = 10;
x[2] = 7; y[2] = 2;
x[3] = 15; y[3] = 7;
x[4] = 21; y[4] = 6;
x[5] = 30; y[5] = 14;
x[6] = 22; y[6] = 18;
x[7] = 20; y[7] = 26;
int armedflag = 0;
int cnt = 0;
int status_a = 0;
int status_b = 0;
int status_c = 0;
for ( int v = 0; v < 30; v++ ){ // Simulated interrupt from GPS (once every second)
for ( int c = 0; c < ci; c++ ){
int crossings = 0;
/* Iterate through each line */
for ( int i = 0; i < bi; i++ ){
/* This is done to ensure that we get the same result when
the line goes from left to right and right to left */
if ( x[i] < x[ (i+1)%bi ] ){
x1 = x[i];
x2 = x[(i+1)%bi];
} else {
x1 = x[(i+1)%bi];
x2 = x[i];
}
/* First check if the ray is possible to cross the line */
if ( pxx[c] > x1 && pxx[c] <= x2 && ( pyy[c] < y[i] || pyy[c] <= y[(i+1)%bi] ) ) {
static const float eps = 0.000001;
/* Calculate the equation of the line */
float dx = x[(i+1)%bi] - x[i];
float dy = y[(i+1)%bi] - y[i];
float k;
if ( fabs (dx) < eps ){
k = INFINITY; //REM: <include math.h> !!!!
} else {
k = dy/dx;
}
float m = y[i] - k * x[i];
/* Find if the ray crosses the line */
float y2 = k * pxx[c] + m;
if ( pyy[c] <= y2 ){
crossings++;
}
}
}
if (( crossings % 2 == 1)&& (c == 0))
{
printf("The dog is OK INSIDE the yard\n");
status_a = 1;
armedflag = 1;
}
if (( crossings % 2 != 1)&& (c > 0)&& (armedflag == 1))
{
printf("BEEP!! BEEP!! BEEP!! The dog is IN THE WARNING ZONE\n");
status_b = 1;
}
if (( crossings % 2 == 1)&& (c > 0) && (status_a == 0))
{
armedflag = 0;
}
if (( crossings % 2 != 1)&& (c == 0 )&& (armedflag == 1))
{
printf("ZAP!! ZAP!! ZAP!! The dog is OUTSIDE the yard\n");
status_c = 1;
armedflag = 0;
}
}
printf("Armed Flag: %d\n",armedflag);
printf("Status_a: %d\n",status_a);
printf("Status_b: %d\n",status_b);
printf("Status_c: %d\n",status_c);
}
}