目录
方法1,求两线段交点坐标
可视化结果:
参考:http://blog.csdn.net/abcjennifer/article/details/7584628
# -*- coding: utf-8 -*-
import cv2
import numpy as np
class Point(object):
x = 0
y = 0
# 定义构造方法
def __init__(self, x=0, y=0):
self.x = x
self.y = y
class Line(object):
# a=0
# b=0
# c=0
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2
def GetLinePara(line):
line.a = line.p1.y - line.p2.y;
line.b = line.p2.x - line.p1.x;
line.c = line.p1.x * line.p2.y - line.p2.x * line.p1.y;
def GetCrossPoint(l1, l2):
GetLinePara(l1);
GetLinePara(l2);
d = l1.a * l2.b - l2.a * l1.b
p = Point()
p.x = (l1.b * l2.c - l2.b * l1.c) * 1.0 / d
p.y = (l1.c * l2.a - l2.c * l1.a) * 1.0 / d
return p;
def cross_point(line1, line2): # 计算交点函数
x1 = line1[0] # 取四点坐标
y1 = line1[1]
x2 = line1[2]
y2 = line1[3]
x3 = line2[0]
y3 = line2[1]
x4 = line2[2]
y4 = line2[3]
k1 = (y2 - y1) * 1.0 / (x2 - x1) # 计算k1,由于点均为整数,需要进行浮点数转化
b1 = y1 * 1.0 - x1 * k1 * 1.0 # 整型转浮点型是关键
if (x4 - x3) == 0: # L2直线斜率不存在操作
k2 = None
b2 = 0
else:
k2 = (y4 - y3) * 1.0 / (x4 - x3) # 斜率存在操作
b2 = y3 * 1.0 - x3 * k2 * 1.0
if k2 == None:
x = x3
else:
x = (b2 - b1) * 1.0 / (k1 - k2)
y = k1 * x * 1.0 + b1 * 1.0
return [int(x), round(y)]
if __name__ == '__main__':
line1=[224,164,207,221]
line2=[270,210,196,171]
print(cross_point(line1, line2))
image = np.zeros((400,400), np.uint8)
image = cv2.line(image, (line1[0],line1[1]), (line1[2],line1[3]), (255,255,255), 2)
image = cv2.line(image, (line2[0],line2[1]), (line2[2],line2[3]), (255,255,255), 2)
cv2.imshow("asdf",image)
cv2.waitKey()
# point1[218, 183]
p1 = Point(1, 1)
p2 = Point(3, 3)
line1 = Line(p1, p2)
p3 = Point(2, 3.1)
p4 = Point(3.1, 2)
line2 = Line(p3, p4)
Pc = GetCrossPoint(line1, line2);
print("Cross point:", Pc.x, Pc.y);
方法2:求线段交点坐标
def cross_point(line1, line2): # 计算交点函数
x1 = line1[0] # 取四点坐标
y1 = line1[1]
x2 = line1[2]
y2 = line1[3]
x3 = line2[0]
y3 = line2[1]
x4 = line2[2]
y4 = line2[3]
k1 = (y2 - y1) * 1.0 / (x2 - x1) # 计算k1,由于点均为整数,需要进行浮点数转化
b1 = y1 * 1.0 - x1 * k1 * 1.0 # 整型转浮点型是关键
if (x4 - x3) == 0: # L2直线斜率不存在操作
k2 = None
b2 = 0
else:
k2 = (y4 - y3) * 1.0 / (x4 - x3) # 斜率存在操作
b2 = y3 * 1.0 - x3 * k2 * 1.0
if k2 == None:
x = x3
else:
x = (b2 - b1) * 1.0 / (k1 - k2)
y = k1 * x * 1.0 + b1 * 1.0
return [x, y]
if __name__ == '__main__':
line1=[100,10,10,10]
line2=[30,5,32,80]
print(cross_point(line1, line2))