Alright, we ll try this again...
考虑建立两个联盟,由每个垂直点(黑色)到EFGH(红红)划定的区组成:
The hard part here is coming up with all of the shapes defined by these lines (both the gray lines and the original lines coming from the ABCD and EFGH rectangles.)
一旦发现这些形状,就在交叉点内形成一个相关联的清单,并假设其中每一种形状。
<>Step 1. Translate & 2007,e all so that ABCD has one vertex on 0,0 and its Line are similar/perpendicular to the x and y axes.
<>Step 1A>。 在ABCD中找到了最低的、价值最低的垂直,然后从现场所有其他的外vert中分离。 为了证明这一疏忽是C的,请作假设。 通过从现场的每个垂直点击C,我们将有效地将原产地(0,0)移至C,使C周围的轮换变得容易。
for all shapes in linked list {
for all vertices in shape {
vertex -= C;
}
}
<>Step 1B> 1. 以与C->、B 病媒和x-轴之间的gle角相等的视角,将一切有关原产地,从而使B 土地在轴上:
// see http://en.wikipedia.org/wiki/Atan2
float rotRadians = atan2(B.x, B.y); // assuming ABCD vertices are labelled clockwise
for all shapes in linked list {
for all vertices in shape {
rot(thisVert, rotRadians);
}
}
// ...
// function declaration
void rot(theVertex, theta) {
tempX = theVertex.x;
tempY = theVertex.y;
theVertex.x = cos(theta) * tempX + sin(theta) * tempY;
theVertex.y = cos(theta) * tempY - sin(theta) * tempX;
}
如果ABCD的vert被贴上锁定的标签,ABCD的vert就应当照此办理:
A = ABCDx , ABCDy
B = ABCDx , 0
C = 0 , 0
D = 0 , ABCDy
(如果它们没有被贴上锁定标签,那么第2步中的“底板”检查就赢得了笔工作,从而确保了<代码>atan2(......)中的阴道,即从最低垂直点起,即为垂直反锁。)
<>Step 2. 现在,我们可以很容易地分析一种形状是否存在于ABCD的试金星体内,例如if(该代码Vert.x >=0 &这一Vert.y >=0 &&这一Vert.x <= ABCDx &&这一Vert.y <= ABCDy)
。 跟踪相关的形状清单,并进行检查,以确保每一形状的垂直。 如果一种形状的垂直点不在于ABCD,那么这种形状不属于ABCD/EFGH交汇点。 标记不作为交汇点的一部分,ski到下层。
<>Step 3. 打破从第1B步的轮换,从第1A步中删除译文。
Repeat steps 1-3 with EFGH than ABCD, and You will have contributed cross set.
如果两套之间唯一的交叉点是线,那么上述两套将不再作为交叉点。 如果交叉点=NUL,则检查交叉线路。
如果交叉点仍为NUL,则检查交叉点。