Okay I really do need help!
HI all, Still having problems getting an output from my line program.
As an overview:
I have an array of objects called LineArray. Each of these objects has an arrary called m_XYCoOrds[][]. This is a ten by two array. The ten is the number of points that make up a line, the two is the x y co-ords where [0] is x and [1] is y. e.g. the second point x co-ordinate is given by
m_XYCoOrds[1][0]
and its y by
m_XYCoOrds[1][1]
I have a function called ncrosses that will get the number of illegal zones that a line passes through. This function is called ncrosses.
Code:
int ncrosses(int m_XYCoOrds[][2])
{
poly4toline4();
int NumLines = 0;
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
for(int t=0;t<9;t++)
{
x1 = m_XYCoOrds[t][0];//get first point x
y1 = m_XYCoOrds[t][1];//get first point y
x2 = m_XYCoOrds[t+1][0];//get second point x
y2 = m_XYCoOrds[t+1][1];//get second point y
struct lineSeg *l1;
int i,j,count=0;
l1=coords2lineSeg(x1,y1,x2,y2);
for(i=0;i<MSIZE;i++)//msize is the number of illegal zone
{ for(j=0;j<NSIDES;j++)//nsides are the number of sides to an illegal zone
if(crosses(l1,lmap[i].ln[j]))
{
count++;
/*printf("hit %d ",i); */ /* only need to know about one line
crossed to know zone crossed or partially
crossed, could modify to get more info.*/
break;
}
}
free(l1);
NumLines = NumLines + count;//add the total number of zones crossed by this section to the whole line coune
}
return NumLines;//return the total line count
}
It takes a start point and the next one and passes these on to the function crosses. Which returns a 0 if no lines are crossed or a 1 if they do.
Code:
int crosses(struct lineSeg *l1, struct lineSeg *l2)
{
poly4toline4();
int A,B,k,x1diff,y1diff,x2diff,y2diff;
x1diff = (l1->r2.i - l1->r1.i);
y1diff = (l1->r2.j - l1->r1.j);
x2diff = (l2->r2.i - l2->r1.i); /* x2diff and y2diff cannot be zero at
same time*/
y2diff = (l2->r2.j - l2->r1.j);
/* boundary cases ****************************************************/
if((x1diff ==0 && x2diff==0 && l1->r1.i != l2->r1.i )
|| (y1diff==0 && y2diff==0 && l1->r1.j != l2->r1.j))
return 0; /*parallel */
if(x1diff ==0 && x2diff==0 && l1->r1.i == l2->r1.i)
{if((between(l1->r1.j,l2->r1.j,l2->r2.j) ||
between(l1->r2.j,l2->r1.j,l2->r2.j)))
return 1; /*parallel but touching */
else return 0;
}
if(y1diff==0 && y2diff==0 && l1->r1.j == l2->r1.j)
{if((between(l1->r1.i,l2->r1.i,l2->r2.i) ||
between(l1->r2.i,l2->r1.i,l2->r2.i)))
{return 1;} /*parallel but touching*/
else return 0;
}
if(x1diff==0 && y1diff==0) /* actually a point */
{A=(l1->r1.i - l2->r1.i)/x2diff;
if(0<=A && A<=1 && A== ((l1->r1.j - l2->r1.j)/y2diff))
{return 1;}
else return 0;
}
if(x1diff==0)
{ B=(l1->r1.i - l2->r1.i)/x2diff;
if(0<=B && B<=1)
{A=(l2->r1.j + B*(y2diff) - l1->r1.j)/y1diff;
if(0<=A && A<=1)
{
return 1;
}
else return 0;
}
else return 0;
}
if(x2diff==0)
{A=(l2->r1.i - l1->r1.i)/x1diff;
if(0<=A && A<=1)
{B=(l1->r1.j + (A*y1diff) - l2->r1.j)/y2diff;
if(0.0 <= B && B <= 1.0)
{
return 1;
}
else return 0;
}
else return 0;
}
if(y1diff==0)
{B=(l1->r1.j - l2->r1.j)/y2diff;
if(0<=B && B<=1)
{A=(l2->r1.i + B*x2diff - l1->r1.i)/x1diff;
if(0<=A && A<=1)
{
return 1;
}
else return 0;
}
else return 0;
}
if(y2diff==0)
{A=(l2->r1.j - l1->r1.j)/y1diff;
if(0<=A && A<=1)
{B=(l1->r1.i + A*x1diff - l2->r1.i)/x2diff;
if(0<=B && B<=1)
{
return 1;
}
else return 0;
}
else return 0;
}
/* standard cases ********************************************/
/* else see if values between 0 and 1 for A and B for vector eqn.
r1 + A(r2-r1) = R1 + B(R2-R1), wher r1,r2 and R1,R2 are vectors of end pnts of
line segments */
if(y1diff != 0 && y2diff != 0)
{k=((x2diff*y1diff/x1diff) - y2diff);
if(k==0) /* parallel, singularity */
{A=(l1->r1.i - l2->r1.i)/x2diff;
if(0<=A && A<=1 && A== ((l1->r1.j - l2->r1.j)/y2diff))
{ return 1;} /*2 lines coincident*/
else
{A=(l1->r2.i - l2->r1.i)/x2diff;
if(0<=A && A<=1 && A== ((l1->r2.j - l2->r1.j)/y2diff))
{ return 1;} /*2 lines coincident*/
else return 0; /* parallel */
}
}
else
{B=((l2->r1.j) + ((l1->r1.i)*y1diff/x1diff) - (l1->r1.j + ((l2->r1.i)*y1diff/x1diff)))/k;
if(0<=B && B<=1)
{A = ((l2->r1.i/x1diff) + B*(x2diff/x1diff)-((l1->r1.i)/x1diff));
if(0<=A && A<=1)
{ return 1;}
else return 0;
}
else return 0;
}
}
return 0;
}
the function poly4toline4() converts map
into a format more suitable for cross checking via vector equations.
when i ran this program from a command line everything went very well. The problem here is that the ncrosses function ALWAYS returns a zero. I don't understand what i've done wrong when implementing this program into MFC.
below is the calling section for the ncrosses funciton
Code:
for(int i=0; i<10;i++)
{
LineArray[i].RandomCoOrd();//generate all the random coords
LineArray[i].m_Length = LineArray[i].SectionLength(LineArray[i].m_XYCoOrds);//get length of line
temp = ncrosses(LineArray[i].m_XYCoOrds);//get the number of lines crossed
if(temp ==0)
temp =50;
total = total + temp;
LineArray[i].m_LineCrosses = total;
//LineArray[i].m_Penalty = LineArray[i].m_LineCrosses*10;//get the penalty value
//LineArray[i].m_Cost = LineArray[i].m_Length + LineArray[i].m_Penalty;
OnOffArray[i] = 0;//set all lines to off
}
I did not write the crosses function but know that it works. I can't see any reason why this won't work now its in MFC. I'm tearing my hair out over this one so any help whatsoever would be greatly appreciated.
Many thanks
Dylan
if you could repost that would be great
Hi Adrian,
here is the coords2lineSeg defn.
Code:
struct lineSeg *coords2lineSeg(int x1,int y1,int x2,int y2)
{
struct lineSeg *p;
/* set up memory, fill it, return pointer to it */
p= (struct lineSeg *) malloc(sizeof(struct lineSeg));
p->r1.i=x1;
p->r1.j=y1;
p->r2.i=x2;
p->r2.j=y2;
return(p);
}
If you could re-post the message on the other forums i would appreciate it, or if this new bit of code is any use another answer would be even better. Thanks for taking the time to read through it.
Cheers
Dylan