【附代码】判断线段是否相交算法(Python,C++)

news2024/9/24 13:25:33

【附代码】判断线段是否相交算法(Python,C++)

文章目录

  • 【附代码】判断线段是否相交算法(Python,C++)
    • 相关文献
    • 测试电脑配置
    • 基础
      • 向量旋转
      • 向量缩放
      • 向量投影
        • 推导
      • 点乘
        • 定义
        • 推导
        • 几何意义
      • 叉乘
        • 定义
        • 推导
        • 几何意义
      • 判断线段是否相交
      • 代码
        • C++
        • Python
    • 画图代码
      • 测试结果

作者:小猪快跑

基础数学&计算数学,从事优化领域5年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法

如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!——@小猪快跑

相关文献

测试电脑配置

博主三千元电脑的渣渣配置:

CPU model: AMD Ryzen 7 7840HS w/ Radeon 780M Graphics, instruction set [SSE2|AVX|AVX2|AVX512]
Thread count: 8 physical cores, 16 logical processors, using up to 16 threads

基础

在这里插入图片描述

这里假设:
O A → = a ⃗ = ( x a , y a ) O B → = b ⃗ = ( x b , y b ) O C → = p ⃗ = ( x c , y c ) C B → = w ⃗ ∠ A O B = α \overrightarrow{OA} = \vec{a} = (x_a,y_a) \\ \overrightarrow{OB} = \vec{b} = (x_b,y_b) \\ \overrightarrow{OC} = \vec{p} = (x_c,y_c) \\ \overrightarrow{CB} = \vec{w} \\ ∠AOB = \alpha OA =a =(xa,ya)OB =b =(xb,yb)OC =p =(xc,yc)CB =w AOB=α

向量旋转

任意向量都能表示成:
( r cos ⁡ α r sin ⁡ α ) \left ( \begin{matrix} r\cos{\alpha} \\ r\sin{\alpha} \\ \end{matrix} \right ) (rcosαrsinα)
假设向量逆时针旋转了 β \beta β,那么我们容易知道旋转后向量是:
( r cos ⁡ ( α + β ) r sin ⁡ ( α + β ) ) \left ( \begin{matrix} r\cos({\alpha + \beta}) \\ r\sin({\alpha + \beta}) \\ \end{matrix} \right ) (rcos(α+β)rsin(α+β))
那么容易得到:
( r cos ⁡ ( α + β ) r sin ⁡ ( α + β ) ) = ( cos ⁡ α − sin ⁡ α sin ⁡ α cos ⁡ α ) ( r cos ⁡ α r sin ⁡ α ) \left ( \begin{matrix} r\cos({\alpha + \beta}) \\ r\sin({\alpha + \beta}) \\ \end{matrix} \right )= \left ( \begin{array}{rr} \cos{\alpha} & -\sin{\alpha} \\ \sin{\alpha} & \cos{\alpha} \\ \end{array} \right ) \left ( \begin{matrix} r\cos{\alpha} \\ r\sin{\alpha} \\ \end{matrix} \right ) (rcos(α+β)rsin(α+β))=(cosαsinαsinαcosα)(rcosαrsinα)
于是旋转向量就是:
( cos ⁡ α − sin ⁡ α sin ⁡ α cos ⁡ α ) \left ( \begin{array}{rr} \cos{\alpha} & -\sin{\alpha} \\ \sin{\alpha} & \cos{\alpha} \\ \end{array} \right ) (cosαsinαsinαcosα)

向量缩放

( r 0 0 r ) \left ( \begin{array}{rr} r & 0 \\ 0 & r \\ \end{array} \right ) (r00r)

向量投影

推导

主要利用 O C → \overrightarrow{OC} OC C B → \overrightarrow{CB} CB 垂直,点积为0:
w ⃗ = b ⃗ − p ⃗ w ⃗ ⋅ p ⃗ = 0 } ⇒ ( b ⃗ − p ⃗ ) ⋅ p ⃗ = 0 p ⃗ = k a ⃗ } ⇒ ( b ⃗ − k a ⃗ ) ⋅ k a ⃗ = 0 p ⃗ = k a ⃗ } ⇒ p ⃗ = a ⃗ ⋅ b ⃗ a ⃗ ⋅ a ⃗ a ⃗ \left. \begin{array}{r} \left. \begin{array}{l} \vec{w}=\vec{b}-\vec{p} \\ \vec{w} \cdot \vec{p} = 0 \end{array} \right\} \Rightarrow (\vec{b}-\vec{p}) \cdot \vec{p} = 0\\ \vec{p} = k \vec{a} \end{array} \right\} \Rightarrow \left. \begin{array}{r} (\vec{b}-k \vec{a}) \cdot k \vec{a} = 0 \\ \vec{p} = k \vec{a} \end{array} \right\} \Rightarrow \vec{p} = \frac{\vec{a} \cdot \vec{b}}{\vec{a} \cdot \vec{a}} \vec{a} w =b p w p =0}(b p )p =0p =ka (b ka )ka =0p =ka }p =a a a b a
那么投影矩阵
P b ⃗ = p ⃗ = a ⃗ a ⃗ ⋅ b ⃗ a ⃗ ⋅ a ⃗ ⇒ P = a ⃗ a ⃗ T a ⃗ T a ⃗ \begin{array}{l} & P\vec{b} = \vec{p} = \vec{a} \frac{\vec{a} \cdot \vec{b}}{\vec{a} \cdot \vec{a}} \\ \Rightarrow & P = \frac{\vec{a}\vec{a}^T}{\vec{a}^T\vec{a}} \end{array} Pb =p =a a a a b P=a Ta a a T

点乘

点乘(Dot Product)的结果是点积,又称数量积标量积(Scalar Product)

定义

a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ∣ b ⃗ ∣ cos ⁡ α \vec{a} \cdot \vec{b} = |\vec{a}||\vec{b}|\cos{\alpha} a b =a ∣∣b cosα

推导

那么如何用解析几何来表示呢?

我们其实可以把 a ⃗ \vec{a} a 旋转 α \alpha α 再缩放 ∣ b ⃗ ∣ / ∣ a ⃗ ∣ |\vec{b}|/|\vec{a}| b ∣/∣a 倍,就是 b ⃗ \vec{b} b 了:
( ∣ b ⃗ ∣ ∣ a ⃗ ∣ 0 0 ∣ b ⃗ ∣ ∣ a ⃗ ∣ ) ( cos ⁡ α − sin ⁡ α sin ⁡ α cos ⁡ α ) ( x a y a ) = ( x b y b ) ⇒ ( ( x a cos ⁡ α − y a sin ⁡ α ) ∣ b ⃗ ∣ ( x a sin ⁡ α + y a cos ⁡ α ) ∣ b ⃗ ∣ ) = ( x b ∣ a ⃗ ∣ y b ∣ a ⃗ ∣ ) ⇒ ∣ a ⃗ ∣ ∣ b ⃗ ∣ cos ⁡ α = x a x b + y a y b \begin{array}{l} &\left ( \begin{matrix} \frac{|\vec{b}|}{|\vec{a}|} & 0 \\ 0 & \frac{|\vec{b}|}{|\vec{a}|} \\ \end{matrix} \right ) \left ( \begin{array}{rr} \cos{\alpha} & -\sin{\alpha} \\ \sin{\alpha} & \cos{\alpha} \\ \end{array} \right ) \left ( \begin{matrix} x_a \\ y_a \\ \end{matrix} \right )= \left ( \begin{matrix} x_b \\ y_b \\ \end{matrix} \right ) \\ \Rightarrow & \left ( \begin{matrix} (x_a\cos{\alpha} - y_a\sin{\alpha})|\vec{b}| \\ (x_a\sin{\alpha} + y_a\cos{\alpha})|\vec{b}| \\ \end{matrix} \right )= \left ( \begin{matrix} x_b|\vec{a}| \\ y_b|\vec{a}| \\ \end{matrix} \right ) \\ \Rightarrow & |\vec{a}||\vec{b}|\cos{\alpha} = x_a x_b + y_a y_b \end{array} a b 00a b (cosαsinαsinαcosα)(xaya)=(xbyb)((xacosαyasinα)b (xasinα+yacosα)b )=(xba yba )a ∣∣b cosα=xaxb+yayb

几何意义

点乘的结果表示 a ⃗ \vec{a} a b ⃗ \vec{b} b 方向上的投影 b ⃗ \vec{b} b 的乘积,反映了两个向量在方向上的相似度,结果越大越相似。基于结果可以判断这两个向量是否是同一方向,是否正交垂直,具体对应关系为:

  1. a ⃗ ⋅ b ⃗ > 0 \vec{a} \cdot \vec{b} > 0 a b >0 则方向基本相同,夹角在0°到90°之间
  2. a ⃗ ⋅ b ⃗ = 0 \vec{a} \cdot \vec{b} = 0 a b =0 则正交,相互垂直
  3. a ⃗ ⋅ b ⃗ < 0 \vec{a} \cdot \vec{b} < 0 a b <0 则方向基本相反,夹角在90°到180°之间

叉乘

叉乘(Cross Product)又称向量积(Vector Product)。

定义

a ⃗ × b ⃗ = ∣ a ⃗ ∣ ∣ b ⃗ ∣ sin ⁡ α \vec{a} \times \vec{b} = |\vec{a}||\vec{b}|\sin{\alpha} a ×b =a ∣∣b sinα

推导

那么如何用解析几何来表示呢?

我们其实可以把 a ⃗ \vec{a} a 旋转 α \alpha α 再缩放 ∣ b ⃗ ∣ / ∣ a ⃗ ∣ |\vec{b}|/|\vec{a}| b ∣/∣a 倍,就是 b ⃗ \vec{b} b 了:
( ∣ b ⃗ ∣ ∣ a ⃗ ∣ 0 0 ∣ b ⃗ ∣ ∣ a ⃗ ∣ ) ( cos ⁡ α − sin ⁡ α sin ⁡ α cos ⁡ α ) ( x a y a ) = ( x b y b ) ⇒ ( ( x a cos ⁡ α − y a sin ⁡ α ) ∣ b ⃗ ∣ ( x a sin ⁡ α + y a cos ⁡ α ) ∣ b ⃗ ∣ ) = ( x b ∣ a ⃗ ∣ y b ∣ a ⃗ ∣ ) ⇒ ∣ a ⃗ ∣ ∣ b ⃗ ∣ sin ⁡ α = x a y b − x b y a \begin{array}{l} & \left ( \begin{matrix} \frac{|\vec{b}|}{|\vec{a}|} & 0 \\ 0 & \frac{|\vec{b}|}{|\vec{a}|} \\ \end{matrix} \right ) \left ( \begin{array}{rr} \cos{\alpha} & -\sin{\alpha} \\ \sin{\alpha} & \cos{\alpha} \\ \end{array} \right ) \left ( \begin{matrix} x_a \\ y_a \\ \end{matrix} \right )= \left ( \begin{matrix} x_b \\ y_b \\ \end{matrix} \right ) \\ \Rightarrow & \left ( \begin{matrix} (x_a\cos{\alpha} - y_a\sin{\alpha})|\vec{b}| \\ (x_a\sin{\alpha} + y_a\cos{\alpha})|\vec{b}| \\ \end{matrix} \right )= \left ( \begin{matrix} x_b|\vec{a}| \\ y_b|\vec{a}| \\ \end{matrix} \right ) \\ \Rightarrow & |\vec{a}||\vec{b}|\sin{\alpha} = x_a y_b - x_b y_a \end{array} a b 00a b (cosαsinαsinαcosα)(xaya)=(xbyb)((xacosαyasinα)b (xasinα+yacosα)b )=(xba yba )a ∣∣b sinα=xaybxbya

几何意义

如果以向量 a ⃗ \vec{a} a b ⃗ \vec{b} b 为边构成一个平行四边形,那么这两个向量外积的模长与这个平行四边形的面积相等。

判断线段是否相交

在这里插入图片描述

我们有了上面的基础后,其实思路就一下打开了!

其实我们只要想着 A B → \overrightarrow{AB} AB 的两边是 C C C D D D ,那么也就是说 A B → × A D → \overrightarrow{AB} \times \overrightarrow{AD} AB ×AD A B → × A C → \overrightarrow{AB} \times \overrightarrow{AC} AB ×AC 有正有负,同时呢 C D → × C A → \overrightarrow{CD} \times \overrightarrow{CA} CD ×CA C D → × C B → \overrightarrow{CD} \times \overrightarrow{CB} CD ×CB 有正有负(这里要注意一下叉乘可能为0的情况,比如说 A A A C D → \overrightarrow{CD} CD 上)。这里我们有正有负采用直接判断而不是相乘小于零,这是因为相乘可能存在数值溢出等问题。而且一般的,和零的判断比乘法快很多。

我们直接上测试用例看看效果!!!
在这里插入图片描述

代码

C++
#include <iostream>
#include <chrono>

using namespace std;

int cross_product(int x1, int y1, int x2, int y2) {
    // 计算向量 (x1, y1) 和向量 (x2, y2) 的叉积
    return x1 * y2 - x2 * y1;
}

int dot_product(int x1, int y1, int x2, int y2) {
    // 计算向量 (x1, y1) 和向量 (x2, y2) 的点乘
    return x1 * x2 + y1 * y2;
}

bool is_intersected(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) {
    /*
    判断线段 (x1, y1)-(x2, y2) 和线段 (x3, y3)-(x4, y4) 是否相交
    AB×AC
    AB×AD
    CD×CA
    CD×CB
     */

    if ((max(x1, x2) < min(x3, x4)) or (max(x3, x4) < min(x1, x2)) or (max(y1, y2) < min(y3, y4)) or (
            max(y3, y4) < min(y1, y2))) {
        return false;
    }

    int abx = x2 - x1;
    int aby = y2 - y1;
    int acx = x3 - x1;
    int acy = y3 - y1;
    int adx = x4 - x1;
    int ady = y4 - y1;
    int bcx = x3 - x2;
    int bcy = y3 - y2;
    int cdx = x4 - x3;
    int cdy = y4 - y3;
    int cp1 = cross_product(abx, aby, acx, acy);
    int cp2 = cross_product(abx, aby, adx, ady);
    int cp3 = cross_product(cdx, cdy, -acx, -acy);
    int cp4 = cross_product(cdx, cdy, -bcx, -bcy);
    // 如果两个叉积的乘积小于0,则两个向量在向量 (x1, y1)-(x2, y2) 的两侧,即线段相交
    if (((cp1 > 0 and 0 > cp2) or (cp1 < 0 and 0 < cp2) or cp1 == 0 or cp2 == 0) and
        ((cp3 > 0 and 0 > cp4) or (cp3 < 0 and 0 < cp4) or cp3 == 0 or cp4 == 0)) {
        return true;
    }
    return false;
}

int test(int n) {
    int res = 0;
    for (auto x1 = 0; x1 < n; x1++) {
        for (auto y1 = 0; y1 < n; y1++) {
            for (auto x2 = 0; x2 < n; x2++) {
                for (auto y2 = 0; y2 < n; y2++) {
                    if (x1 == x2 and y1 == y2) {
                        continue;
                    }
                    for (auto x3 = 0; x3 < n; x3++) {
                        for (auto y3 = 0; y3 < n; y3++) {
                            for (auto x4 = 0; x4 < n; x4++) {
                                for (auto y4 = 0; y4 < n; y4++) {
                                    if (x3 == x4 and y3 == y4) {
                                        continue;
                                    }
                                    res += is_intersected(x1, y1, x2, y2, x3, y3, x4, y4);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return res;
}

int main() {
    auto start = std::chrono::high_resolution_clock::now();

    std::cout << test(7) << std::endl;

    auto finish = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = finish - start;
    std::cout << "Elapsed time: " << elapsed.count() << " s\n" << std::endl;

    return 0;
}
Python
from time import time
import math
from numba import njit


@njit
def cross_product(x1, y1, x2, y2):
    """
    计算向量 (x1, y1) 和向量 (x2, y2) 的叉积
    """
    return x1 * y2 - x2 * y1


@njit
def dot_product(x1, y1, x2, y2):
    """
    计算向量 (x1, y1) 和向量 (x2, y2) 的点乘
    """
    return x1 * x2 + y1 * y2


@njit
def is_intersected(x1, y1, x2, y2, x3, y3, x4, y4):
    """
    判断线段 (x1, y1)-(x2, y2) 和线段 (x3, y3)-(x4, y4) 是否相交
    AB×AC
    AB×AD
    CD×CA
    CD×CB
    """
    if (max(x1, x2) < min(x3, x4)) or (max(x3, x4) < min(x1, x2)) or (max(y1, y2) < min(y3, y4)) or (
            max(y3, y4) < min(y1, y2)):
        return False
    abx = x2 - x1
    aby = y2 - y1
    acx = x3 - x1
    acy = y3 - y1
    adx = x4 - x1
    ady = y4 - y1
    bcx = x3 - x2
    bcy = y3 - y2
    cdx = x4 - x3
    cdy = y4 - y3
    cp1 = cross_product(abx, aby, acx, acy)
    cp2 = cross_product(abx, aby, adx, ady)
    cp3 = cross_product(cdx, cdy, -acx, -acy)
    cp4 = cross_product(cdx, cdy, -bcx, -bcy)
    # 如果两个叉积的乘积小于0,则两个向量在向量 (x1, y1)-(x2, y2) 的两侧,即线段相交
    if ((cp1 > 0 > cp2) or (cp1 < 0 < cp2) or cp1 == 0 or cp2 == 0) and (
            (cp3 > 0 > cp4) or (cp3 < 0 < cp4) or cp3 == 0 or cp4 == 0):
        return True
    return False


def test(n):
    res = 0
    for x1 in range(n):
        for y1 in range(n):
            for x2 in range(n):
                for y2 in range(n):
                    if x1 == x2 and y1 == y2:
                        continue
                    for x3 in range(n):
                        for y3 in range(n):
                            for x4 in range(n):
                                for y4 in range(n):
                                    if x3 == x4 and y3 == y4:
                                        continue
                                    res += is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)
    return res


if __name__ == '__main__':
    s = time()
    print(test(7))
    print(time() - s)

画图代码

# main.py
import matplotlib.pyplot as plt
from shapely.geometry import Point, LineString, Polygon
from shapely.plotting import plot_polygon, plot_points, plot_line

from csdn_line_intersect import is_intersected
from figures import BLUE, GRAY, set_limits

fig = plt.figure(1, figsize=(9, 9), dpi=300)
fig.subplots_adjust(wspace=0.5, hspace=0.5)  # 调整边距和子图的间距

ax = fig.add_subplot(4, 4, 1)
x1, y1, x2, y2 = 1, 1, 3, 1
x3, y3, x4, y4 = 1, 3, 3, 2
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 2)
x1, y1, x2, y2 = 1, 1, 3, 1
x3, y3, x4, y4 = 1, 3, 3, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 3)
x1, y1, x2, y2 = 1, 1, 3, 1
x3, y3, x4, y4 = 1, 3, 2, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 4)
x1, y1, x2, y2 = 1, 1, 3, 1
x3, y3, x4, y4 = 1, 3, 1, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 5)
x1, y1, x2, y2 = 1, 1, 3, 1
x3, y3, x4, y4 = 1, 3, 1, 2
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 6)
x1, y1, x2, y2 = 2, 1, 3, 1
x3, y3, x4, y4 = 1, 3, 1, 2
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 7)
x1, y1, x2, y2 = 2, 1, 3, 1
x3, y3, x4, y4 = 1, 3, 1, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 8)
x1, y1, x2, y2 = 2, 2, 3, 1
x3, y3, x4, y4 = 1, 3, 1, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 9)
x1, y1, x2, y2 = 1, 2, 3, 1
x3, y3, x4, y4 = 1, 3, 1, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 10)
x1, y1, x2, y2 = 1, 2, 3, 2
x3, y3, x4, y4 = 1, 3, 1, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 11)
x1, y1, x2, y2 = 2, 2, 3, 2
x3, y3, x4, y4 = 1, 3, 1, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 12)
x1, y1, x2, y2 = 2, 2, 3, 2
x3, y3, x4, y4 = 2, 3, 1, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 13)
x1, y1, x2, y2 = 2, 2, 3, 2
x3, y3, x4, y4 = 3, 3, 1, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 14)
x1, y1, x2, y2 = 1, 2, 3, 2
x3, y3, x4, y4 = 3, 3, 1, 1
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 15)
x1, y1, x2, y2 = 2, 1, 3, 1
x3, y3, x4, y4 = 1, 3, 3, 3
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

ax = fig.add_subplot(4, 4, 16)
x1, y1, x2, y2 = 1, 1, 3, 1
x3, y3, x4, y4 = 1, 3, 3, 3
a = LineString([(x1, y1), (x2, y2)])
b = LineString([(x3, y3), (x4, y4)])
plot_line(a, ax=ax, color=GRAY)
plot_line(b, ax=ax, color=GRAY)
plot_points(a.intersection(b), ax=ax, color=BLUE)
ax.set_title(f'is_intersected:{is_intersected(x1, y1, x2, y2, x3, y3, x4, y4)}')
set_limits(ax, 0, 4, 0, 4)

plt.savefig('output.png')
plt.show()

测试结果

C++: 0.0157648 s
Python(numba): 1.3376786708831787 s
Python(no numba): 3.585803985595703 s
Python(shapely): 73.45080494880676 s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1244034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

批量将本地N个英文Html文档进行中文翻译-操作篇

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

MeterSphere | 接口测试请求体中,int类型的入参实现动态化变量

项目场景&#xff1a; 在接口自动化的时候&#xff0c;要把上一个接口的 Int 变量传入到 下一个接口中进行使用&#xff0c;但编译器会出现 红色的 X 符号 问题描述 如何实现 int 类型的入参实现动态化变量&#xff1f; 解决方案&#xff1a; 忽视掉这个红色 X 号&#xff0…

latex通过bib添加参考文献作者名字有特殊符号如字母上有两点乱码解决办法

一、背景 在使用latex写英文论文时&#xff0c;一般是通过bib的方式添加参考文献。但有的参考文献作者是法国人或其他国家的&#xff0c;名字会有特殊符号&#xff0c;如某个字母上有两个点&#xff0c;或者声调符号等等&#xff0c;如下图所示&#xff1a; 如果不进行特殊操作…

广告机/商业显示屏_基于MT8788安卓主板方案

安卓主板在广告机领域扮演着重要的角色。无论是在商场、车站、酒店、电梯、机场还是高铁站&#xff0c;LED广告机广泛应用&#xff0c;并通过不同方式进行播放和管理。 广告机/商业显示屏_基于MT8788安卓主板方案 基于MT8788安卓主板方案的广告机采用了联发科MT8788八核芯片方案…

车辆管控大数据可视化平台案例源码分析【可视化项目案例-10】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本专栏包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你是初学者还是资深开发者,这里都有适合你的内容。…

【LeetCode刷题-回溯】-- 47.全排列II

47.全排列II 主要需要解决全排列不重复的问题&#xff0c;设定一个规则&#xff0c;保证在填第i个数的时候重复数字只会被填入一次即可&#xff0c;而在本题中&#xff0c;我们选择对原数组排序&#xff0c;保证相同的数字都相邻&#xff0c;然后每次填入的数一定是这个数所在重…

[点云分割] Clustering of Pointclouds into Supervoxels

介绍 “Clustering of Pointclouds into Supervoxels” 是一种点云数据聚类的方法&#xff0c;用于将点云数据分割成具有相似特征的超体素&#xff08;supervoxel&#xff09;。 超体素是一种在点云数据中表示连续区域的方法&#xff0c;类似于像素在图像中表示连续区域。超体…

SPASS-信度分析

信度分析概述 效度 效度指的是量表是否真正反映了我们希望测量的东西。一般来说&#xff0c;有4种类型的效度&#xff1a;内容效度、标准效度、结构效度和区分效度。内容效度是一种基于概念的评价指标&#xff0c;其他三种效度是基于经验的评价指标。如果一个量表实际上是有效…

练习七-在Verilog中使用任务task

在Verilog中使用任务task 1&#xff0c;任务目的2&#xff0c;RTL代码&#xff0c;交换3&#xff0c;测试代码4&#xff0c;波形显示 1&#xff0c;任务目的 &#xff08;1&#xff09;掌握任务在verilog模块设计中的应用&#xff1b; &#xff08;2&#xff09;学会在电平敏感…

使用pt-query-digest分析慢查询日志

介绍 pt-query-digest 属于 Percona Toolkit 工具集中较为常用的工具&#xff0c;用于分析 slow log&#xff0c;可以分析 MySQL 数据库的 binary log 、 general log 日志&#xff0c;同时也可以使用 show processlist 或从 tcpdump 抓取的 MySQL 协议数据来进行分析。 安装…

人工智能教程(一):基础知识

目录 前言 什么是人工智能&#xff1f; 教学环境搭建 向量和矩阵 前言 如果你是关注计算机领域最新趋势的学生或从业者&#xff0c;你应该听说过人工智能、数据科学、机器学习、深度学习等术语。作为人工智能系列文章的第一篇&#xff0c;本文将解释这些术语&#xff0c;并搭…

Python实现交易策略评价指标-收益率

1.收益率的定义 收益率几乎是所有投资者都会关注的一个指标&#xff0c;收益率的高低决定了投资策略的赚钱能力&#xff0c;常见关于收益率的指标如下&#xff1a; 持有期收益率 持有期收益率 期末投资权益 − 期初投资权益 期初投资权益 持有期收益率 \frac {期末投资权益…

王道p149 9.设树B是一棵采用链式结构存储的二叉树,编写一个把树 B中所有结点的左、右子树进行交换的函数。(c语言代码实现)

本题代码如下 void swap(tree* t) {if (*t){treenode* temp (*t)->lchild;(*t)->lchild (*t)->rchild;(*t)->rchild temp;swap(&(*t)->lchild);swap(&(*t)->rchild);} } 完整测试代码 #include<stdio.h> #include<stdlib.h> typed…

C++每日选择题—Day1

第一题 以下C代码会输出什么? #include <iostream> using namespace std; class A { public:A() {}~A() {} private:static int a; }; int main() {cout << sizeof(A) << endl;return 0; } A&#xff1a;0 B&#xff1a;1 C&#xff1a;4 D&#xff1a;8 答…

视频网关简介

在数字化时代&#xff0c;视频通信已经成为了人们日常生活和工作中的重要部分。为了满足不同设备和平台之间的视频通信需求&#xff0c;各种视频协议应运而生。然而&#xff0c;这些协议之间的差异使得相互通信变得复杂。因此&#xff0c;视频网关作为一种重要的网络设备&#…

初识Java 18-3 泛型

目录 边界 通配符 编译器的能力范畴 逆变性 无界通配符 捕获转换 本笔记参考自&#xff1a; 《On Java 中文版》 边界 在泛型中&#xff0c;边界的作用是&#xff1a;在参数类型上增加限制。这么做可以强制执行应用泛型的类型规则&#xff0c;但还有一个更重要的潜在效果…

IntelliJ IDEA 16创建Web项目

首先要理解一个概念&#xff1a;在IntelliJ IDEA中“new Project”相当于eclipse中的工作空间&#xff08;Workspace&#xff09;&#xff0c;而“new Module”相当于eclipse中的工程&#xff08;Project&#xff09;。以下均采用Intellij的说法&#xff0c;请自行对照转换理解…

Python---把函数的返回值作为另外一个函数的参数

def test1():return 50def test2(num):print(num)# 1. 保存函数test1的返回值 result test1()# 2.将函数返回值所在变量作为参数传递到test2函数 test2(result) # 50

PLC-Recorder文件存储设置的一些注意事项和技巧

存储是PLC-Recorder高速采集软件的三大基本功能之一&#xff08;另外两个是“采集”和“使用”&#xff09;。与内存访问相比&#xff0c;磁盘访问是一个很慢的过程&#xff0c;频繁的读写操作或多或少地会对采集造成影响&#xff0c;因此&#xff0c;也有一些可遵循的规则。 …

JavaScript编程基础 – 布尔值(Booleans)

JavaScript编程基础 – 布尔值(Booleans) Javascript Programming Essentials – Booleans 一个JavaScript布尔值包含两个值中的一个&#xff0c;即 true 或者 false。 本文简要介绍JavaScript布尔值的具体应用&#xff0c;以及可能作为对象的布尔值等。 1. 布尔值(Booleans)…