64,642
社区成员
发帖
与我相关
我的任务
分享
/*
if (line1->y1 == line2->y1)
if (line1->x1 == line2->x1) return(ret);
if (line1->y1 == line2->y2)
if (line1->x1 == line2->x2) return(ret);
if (line1->y2 == line2->y1)
if (line1->x2 == line2->x1) return(ret);
if (line1->y2 == line2->y2)
if (line1->x2 == line2->x2) return(ret);
if((line1->y1 == line1->y2) || (line2->y1 == line2->y2)) {
/* y1 == y2 then horizontal */
return(ret);
}
*/
if (((line1->y1 == line2->y1) && (line1->x1 == line2->x1)) ||
((line1->y1 == line2->y2) && (line1->x1 == line2->x2)) ||
((line1->y2 == line2->y1) && (line1->x2 == line2->x1)) ||
((line1->y2 == line2->y2) && (line1->x2 == line2->x2)) ||
((line1->y1 == line1->y2) || (line2->y1 == line2->y2)))
return (ret);
typedef struct { /* Line Information */
long x1; /* start point */
long y1;
long x2; /* end point */
long y2;
double ki; /* slope */
double y0; /* y clip */
long sx; /* on sort line */
long rx;
long f; /* line course flag */
/* 0 : Even/Odd rule */
/* 1 : Non-Zero winding rule */
} LineInfo ;
/********************************************************************
Class : CALC
Method : calculateCrossing
Arg1 : 1st line information pointer
Arg2 : 2nd line information pointer
Arg3 : Y Coordinate on Crossing
Return : true:crossing/false:not crossing
********************************************************************/
bool
CALC::calculateCrossing(LineInfo *line1,LineInfo *line2,long *cross_y)
{
long y;
double f_ki,f_y,tmp_y;
int flag = 0;
bool ret = false; //modefied
//ret = false; /* not crossing */
if((line1->y1 == line1->y2) || (line2->y1 == line2->y2))
{
/* y1 == y2 then horizontal */
return(ret);
}
if (line1->y1 == line2->y1)
{
if (line1->x1 == line2->x1)
return(ret);
}else
if (line1->y1 == line2->y2)
{
if (line1->x1 == line2->x2)
return(ret);
}else
if (line1->y2 == line2->y1)
{
if (line1->x2 == line2->x1)
return(ret);
}else
if (line1->y2 == line2->y2)
{
if (line1->x2 == line2->x2)
return(ret);
}
f_ki = line2->ki - line1->ki;
if(f_ki)
{ /* == 0 then parallel */
if(!line1->ki)
{
f_y = line1->x1 * line2->ki + line2->y0;
}else
if(!line2->ki)
{
f_y = line2->x1 * line1->ki + line1->y0;
}else
{
tmp_y = (line2->ki * line1->y0) - (line1->ki * line2->y0);
f_y = tmp_y / f_ki;
if ((f_y * f_ki) != tmp_y)
flag = 1; /* float devision diff */
}
y = (long)f_y; /* y-axis down */
if ((double)y != f_y)
{
++y; /* y-axis up */
}else
if (flag)
{
++y;
}
if(((line1->y1 < y) && (y < line1->y2))
&& ((line2->y1 < y) && (y < line2->y2)))
{
/* in y-axis */
ret = true; /* crossing */
*cross_y = y;
}
}
return(ret);
}