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);
}
}