Link to home
Start Free TrialLog in
Avatar of MichaelMullin
MichaelMullin

asked on

Convert C code to C#

I need to convert this C code to C#

My conversion identifies my polygon as ccw. I know it is cw.
Did I make a mistake converting from C to C#?
I noted the assumption that the last point is not repeated and have tried my code with n-1, but still returns ccw.
Also, my polygon is in the Western Hemisphere, meaning that Longitude is expressed as a negative number.
I have tried all the solutions to deal with the negative number I can think of.
Thanks for any help,
Michael


C function by Paul Bourke 
 
/*
   Return the clockwise status of a curve, clockwise or counterclockwise
   n vertices making up curve p
   return 0 for incomputables eg: colinear points
          CLOCKWISE == 1
          COUNTERCLOCKWISE == -1
   It is assumed that
   - the polygon is closed
   - the last point is not repeated.
   - the polygon is simple (does not intersect itself or have holes)
*/
int ClockWise(XY *p,int n)
{
   int i,j,k;
   int count = 0;
   double z;
 
   if (n < 3)
      return(0);
 
   for (i=0;i<n;i++) {
      j = (i + 1) % n;
      k = (i + 2) % n;
      z  = (p[j].x - p[i].x) * (p[k].y - p[j].y);
      z -= (p[j].y - p[i].y) * (p[k].x - p[j].x);
      if (z < 0)
         count--;
      else if (z > 0)
         count++;
   }
   if (count > 0)
      return(COUNTERCLOCKWISE);
   else if (count < 0)
      return(CLOCKWISE);
   else
      return(0);
}
But I don't remember much C
I have tried to rewrite to C#:
private static int ClockWise(double[] y, double[]x, int n)
			
		{
			int i,j,k;
			int count = 0;
			double z;
 
			if (n < 3)//not a polygon
				return(0);
 
			for (i=0;i<n-1;i++) 
			{
				j = (i + 1) % n;
				k = (i + 2) % n;
				z  = (x[j] - x[i]) * (y[k] - y[j]);
				z -= (y[j] - y[i]) * (x[k] - x[j]);
				if (z < 0)
					count--;
				else if (z > 0)
					count++;
			}
			if (count > 0)//counterclockwise
				return(1);
			else if (count < 0)//clockwise
				return(-1);
			else
				return(0);
		}

Open in new window

Avatar of Anurag Thakur
Anurag Thakur
Flag of India image

try this one out
what i have tried here is creating a point class and using a generic list
i am assuming that you C program i taking the input of points array which is similar to the List<Point>
class Point
{
	public double x;
	public double y;
}
 
private int ClockWise (List<Point> p, int n)
{
	int i, j, k;
	int count = 0;
	double z;
 
	if (n < 3)
		return (0);
 
	for (i = 0; i < n; i++)
	{
		j = (i + 1) % n;
		k = (i + 2) % n;
		z = (p[j].x - p[i].x) * (p[k].y - p[j].y);
		z -= (p[j].y - p[i].y) * (p[k].x - p[j].x);
		if (z < 0)
			count--;
		else if (z > 0)
			count++;
	}
	if (count > 0)
		return (-1);
	else if (count < 0)
		return (1);
	else
		return (0);
}

Open in new window

Avatar of MichaelMullin
MichaelMullin

ASKER

Thank-you,
No, I do not use C. The question is: did I properly translate the C code to C#? My C# translation works for a simple 4-sided polygon but not for a 2500-sided polygon. Either the original C code is incorrect or my translation is incorrect. The simplest solution would be that my translation is incorrect. If you are able to assure me that my translation is either correct or incorrect, that would be the solution to this question.
ASKER CERTIFIED SOLUTION
Avatar of MichaelMullin
MichaelMullin

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
no problems you can close the question
Even though I have solved this problem, I would still like to know if my translation from C to C# is correct or not. I will award the points for a yes or no answer with explanation if incorrect.
Although it is irrelevant, but for those who too want to check if conversion is good or not, then with my knowledge it is good.