[从头学数学] 第282节 [计算几何] 相邻边和相邻点

这篇博客由工程师阿伟和机器小伟共同探讨计算几何中点和边的位置关系,详细阐述了如何寻找点的左、右邻居边以及上、下相邻点。
摘要由CSDN通过智能技术生成
剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值