剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年09月28日 15:47:30, 银河系厄尔斯星球中华帝国江南行省。
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年09月28日 15:47:30, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[计算几何]]。
# 点和边的位置关系
<span style="font-size:18px;">#
>>>
点在线段[[2.4, 5.4], [6, 9]]的Nevermind边
扫描线与线段交点: []
点在线段[[0.8, 3.8], [2.4, 5.4]]的Right边
扫描线与线段交点: [1.47, 4.47]
点在线段[[1.33, 3], [0.8, 3.8]]的Nevermind边
扫描线与线段交点: []
点在线段[[1.33, 3], [2, 3]]的Nevermind边
扫描线与线段交点: []
点在线段[[2, 3], [6, 3]]的Nevermind边
扫描线与线段交点: []
点在线段[[6, 3], [6, 3.86]]的Nevermind边
扫描线与线段交点: []
点在线段[[6, 3.86], [3.33, 5]]的Left边
扫描线与线段交点: [4.57, 4.47]
点在线段[[3.33, 5], [6, 9]]的Nevermind边
扫描线与线段交点: []
>>>
点在线段[[2.4, 5.4], [6, 9]]的Left边
扫描线与线段交点: [2.49, 5.49]
点在线段[[2.4, 5.4], [-6, 9]]的Left边
扫描线与线段交点: [2.19, 5.49]
点在线段[[-0.37, 2.56], [-6, 9]]的Right边
扫描线与线段交点: [-2.93, 5.49]
点在线段[[-0.37, 2.56], [0, 3]]的Nevermind边
扫描线与线段交点: []
点在线段[[0, 3], [1.33, 3]]的Nevermind边
扫描线与线段交点: []
点在线段[[1.33, 3], [2, 3]]的Nevermind边
扫描线与线段交点: []
点在线段[[2, 3], [3.33, 5]]的Nevermind边
扫描线与线段交点: []
点在线段[[3.33, 5], [6, 9]]的Left边
扫描线与线段交点: [3.66, 5.49]
#三个点的叉积
def crossProduct(P1, P2, P3):
x1, y1, x2, y2, x3, y3 = P1[0], P1[1], P2[0], P2[1], P3[0], P3[1];
#
# 1 1 1
# x_1 x_2 x_3
# y_1 y_2 y_3
#
#逆时针结果为正,顺时针为负
return round((x1*y2-x2*y1)-(x1*y3-x3*y1)+(x2*y3-x3*y2), 3);
#判断点在边的左边还是右边
def judgePointAgainstEdgePosition(seg, point):
#传入SegLine类型和Point类型,这样方便比较
#SegLine是以y优先x其次由小大大排序的,终端点按排序规则大于起始端点
pValue = point.value();
sValue = seg.value();
x0, y0, x1, y1, x2, y2 = pValue[0], pValue[1], sValue[0][0], sValue[0][1],\
sValue[1][0], sValue[1][1];
#点的y值要在线段两个端点的y值中间,可以等于
if (y0 >= y1 and y0 <= y2):
cross = crossProduct(pValue, sValue[0], sValue[1]);
if (cross > 0):
#点在线段的左边
if (y1 < y0):
return 'Left';
elif (cross < 0):
#点在线段的右边
if (y2 > y0):
return 'Right';
return 'Nevermind';
#获取扫描线与线段的交点
#y方向的扫描线为平行于x轴且y值为某一定值的直线
def calcScanLineCrosspoint(seg, point):
#传入SegLine类型和Point类型,这样方便比较
#SegLine是以y优先x其次由小大大排序的,终端点按排序规则大于起始端点
pValue = point.value();
sVal