- /**
- * Test one lineA intersect lineB
- */
- static bool TestLineLine(Array(float)* lineA, Array(float)* lineB)
- {
- int flag[2] = {0, 0};
- float vertexX1 = AArray_Get(lineB, 0, float);
- float vertexX2 = AArray_Get(lineB, 2, float);
- float vertexY1 = AArray_Get(lineB, 1, float);
- float vertexY2 = AArray_Get(lineB, 3, float);
- for (int i = 0; i <4; i += 2)
- {
- float x = AArray_Get(lineA, i, float);
- float y = AArray_Get(lineA, i + 1, float);
- if ((vertexY1 < y && vertexY2>= y) || (vertexY2 <y && vertexY1>= y))
- {
- // cross product between vector (x - vertexX1, y - vertexY1) and (vertexX2 - vertexX1, vertexY2 - vertexY1)
- // result is (x - vertexX1) * (vertexY2 - vertexY1) - (y - vertexY1) * (vertexX2 - vertexX1)
- if (vertexX1 + (y - vertexY1) / (vertexY2 - vertexY1) * (vertexX2 - vertexX1) <= x)
- {
- flag[i>> 1] = 1;
- }
- else
- {
- flag[i>> 1] = 2;
- }
- }
- }
- // test lineA two points both sides of lineB
- if (flag[0] + flag[1] == 3)
- {
- return true;
- }
- flag[0] = 0;
- flag[1] = 0;
- vertexX1 = AArray_Get(lineA, 0, float);
- vertexX2 = AArray_Get(lineA, 2, float);
- vertexY1 = AArray_Get(lineA, 1, float);
- vertexY2 = AArray_Get(lineA, 3, float);
- for (int i = 0; i <4; i += 2)
- {
- float x = AArray_Get(lineB, i, float);
- float y = AArray_Get(lineB, i + 1, float);
- if ((vertexY1 < y && vertexY2>= y) || (vertexY2 <y && vertexY1>= y))
- {
- // cross product between vector (x - vertexX1, y - vertexY1) and (vertexX2 - vertexX1, vertexY2 - vertexY1)
- // result is (x - vertexX1) * (vertexY2 - vertexY1) - (y - vertexY1) * (vertexX2 - vertexX1)
- if (vertexX1 + (y - vertexY1) / (vertexY2 - vertexY1) * (vertexX2 - vertexX1) <= x)
- {
- flag[i>> 1] = 1;
- }
- else
- {
- flag[i>> 1] = 2;
- }
- }
- }
- // test lineB two points both sides of lineA
- return flag[0] + flag[1] == 3;
- }
来源: http://www.jianshu.com/p/8cb9388c6566