python 条件是两个角之间的夹角

41zrol4v  于 2022-12-25  发布在  Python
关注(0)|答案(2)|浏览(132)

我有一个从某个点出发的向量,它的Angular ,也有由两个点描述的直线,我需要找到向量和直线的交点,我通过直线方程计算了交点,但是在这个例子中,我找到了与向量方向相反的直线的交点,所以我决定检查直线是否在向量的方向上,但我想不出合适的条件。屏幕截图显示了一个例子,说明当一个Angular 在两个其他Angular 之间时,它意味着什么。目前Angular 是从-180到180,但我会非常感谢Angular 从0到360的解决方案。x1c 0d1x
一系列要检查的动作,无论是数学上的还是代码形式的,都会对我有所帮助。

toe95027

toe950271#

首先把端点的顺序排好,用数字排序;如果差值〈180 °,则完成该步骤,否则将360 °加到较小的一个上并将它们颠倒。
然后看光线是否福尔斯在它们之间,如果它大于第一个点但小于第二个点,那么就有交点;否则将360加到射线上并进行第二次测试。

示例1:线从80到280,射线在350。端点之间的差值为200,大于180,因此更改较小的端点:这条线是从280到440。350处的射线在这两个端点之间,因此射线与这条线相交。
示例2:线从50到140,射线在260。端点之间的差值为90,小于180;不需要调整,光线不在它们之间;将360添加到射线,使其变为620。射线仍然不在端点之间,因此射线不与直线相交。

此解决方案适用于从0到360测量的Angular 。如果给定的Angular 是从-180到180,只需先将180加到所有值上。

e7arh2l6

e7arh2l62#

这里有一个解决方案,如果你有有限的线。它没有从头开始的算法,因为它使用shapely,但它的工作。另外,因为它的python,应该更快地使用库无论如何。

import math
import shapely.geometry.linestring
from matplotlib import pyplot as plt
from math import pi, cos, sin
from random import random

#make 2 random points inside unit circle

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return str((self.x, self.y))

class Circle:
    def __init__(self, origin, radius):
        self.origin = origin
        self.radius = radius

origin = Point(0, 0)
radius = 1
circle = Circle(origin, radius)

vector_points=[]
for i in range(2):
    p = random() * 2 * math.pi
    r = circle.radius * math.sqrt(random())
    vector_points.append((math.cos(p) * r,math.sin(p) * r))

#make random points on edge of unit circle

def point(h, k, r):
    theta = random() * 2 * pi
    return h + cos(theta) * r, k + sin(theta) * r

#math functions

def line_intersection(line1, line2):
    xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])
    ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1])

    def det(a, b):
        return a[0] * b[1] - a[1] * b[0]

    div = det(xdiff, ydiff)
    if div == 0:
       raise Exception('lines do not intersect')

    d = (det(*line1), det(*line2))
    x = det(d, xdiff) / div
    y = det(d, ydiff) / div
    return x, y

if __name__ == '__main__':
    #vizualize unit circle
    xy = [point(0,0,1) for _ in range(3000)]
    #two points on edge of unit circle, display with line
    line=[point(0,0,1) for _ in range(2)]
    #make vector inside unit circle, display with line
    vector=vector_points
    #display everything
    plt.axes().set_aspect('equal')
    plt.scatter(*zip(*xy), color='b')
    plt.plot(*zip(*line), color='r')
    plt.plot(*zip(*vector_points),color='g')
    plt.show()

    #check intersection of finite lines
    check=shapely.geometry.linestring.LineString
    line1=check(vector)
    line2=check(line)
    if line1.intersects(line2):
        print(line_intersection(vector,line))
    else:
        print('lines do not intersect')

相关问题