我需要通过替换其中一个点来改变三角形。但是,我需要检测这样做是否会导致三角形翻转。检测改变点时三角形是否翻转
例如,由点限定的三角形:
[(1.0,1.0), (2.0,3.0), (3.0,1.0)]
看起来像这样:
如果我改变从(3.0,1.0)
第三点到(1.0,2.0)
,它翻转,如如下所示:
我已经写,可检测的三角形是通过计算对于所述固定点的方程和检测在所述y截距的标志差翻转的函数:
def would_flip(stationary, orig_third_point, candidate_third_point):
#m = (y2-y1)/(x2-x1)
slope = (stationary[1][3] - stationary[0][4])/(stationary[1][0] - stationary[0][0])
#y = mx + b
#b = y-mx
yint = stationary[0][5] - slope * stationary[0][0]
orig_atline = slope * orig_third_point[0] + yint
candidate_atline = slope * candidate_third_point[0] + yint
if orig_atline > orig_third_point[1] and not(candidate_atline > candidate_third_point[1]) or \
orig_atline < orig_third_point[1] and not(candidate_atline < candidate_third_point[1]):
return True
return False
这很好地工作在大多数情况下:
>>> would_flip([(1.0,1.0), (2.0,3.0)], (3.0,1.0), (1.0,2.0))
True
>>> would_flip([(1.0,1.0), (2.0,3.0)], (3.0,1.0), (4.0,2.0))
False
我的问题是,如果固定点是垂直的,斜率是无穷的:
>>> would_flip([(1.0,1.0), (1.0,3.0)], (3.0,1.0), (4.0,2.0))
ZeroDivisionError: float division by zero
是否有更好/更快的方法来检测对于垂直线是固定点的鲁棒性?它用python编写的事实并不重要。我会接受一个只是一个公式或描述得很好的技术的答案。
编辑:上意味着什么三角“翻转”
考虑下面的四个三角形的更多信息:
左上角的是原来的三角形。红线(全部相同)是两个固定点。三个三角形的其余部分取代了第三点。右上角和左下角的三角形不翻转,而右下角的三角形翻转。实质上,如果第三点结束于由两个固定点形成的虚线的相反侧,则该三角形被“翻转”。
UPDATE2:使用跨产品工作职能:
我不认为你已经清楚地说明了你的意思是“翻转”:看起来你有一些规则使得一个点在每个三角形特别,但你没有明确说明这个规则是什么 –
啊,我现在明白了,我再看看:三重点中每个点的位置定义了该点的身份。定义“翻转”,使得由这些点定义的(“有弹性的”!)物理三角形必须围绕包含三角形的2D平面中的轴在3D空间中旋转,以便从第一个三角形到第二。也许没有比你原来的解释更清楚! –
我更新了一些关于翻转三角形意味着什么的更多信息。这是否更清楚? – jterrace