作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始图形编程,并尝试使用实现Delaunay算法的opencv的Subdiv2D
类对凹面进行三角剖分。
我的代码进一步在下面产生以下输出,其中红线标记生成的三角形。到现在为止还挺好。然而,该算法还为多边形的凹面部分计算了一个三角形。
我在这里做错什么,如何防止这种行为?我没有找到可以传递给Subdiv2D
函数的任何形式的约束。
我可以想到的一种方法是计算每个三角形的质心,然后测试其是否在多边形内。但是...这真的是该算法的方法吗?
# -*- coding: utf-8 -*-
import numpy as np
import cv2
width = 800
height = 600
img = np.zeros((height,width,3), np.uint8)
pts = np.array([[100,50],[200,300],[700,200],[500,100],[400,150]], np.int32)
rect = (0, 0, width, height)
def rect_contains(rect, point) :
if point[0] <rect[0] :
return False
elif point[1] < rect[1] :
return False
elif point[0] > rect[2] :
return False
elif point[1] > rect[3] :
return False
return True
def draw_triangeles(rect, points, img) :
subdiv = cv2.Subdiv2D()
subdiv.initDelaunay(rect)
for p in points:
subdiv.insert((p[0], p[1]))
triangles = subdiv.getTriangleList()
for t in triangles:
pt1 = (t[0], t[1])
pt2 = (t[2], t[3])
pt3 = (t[4], t[5])
if rect_contains(rect, pt1) and rect_contains(rect, pt2) and rect_contains(rect, pt3) :
cv2.line(img, pt1, pt2, (0,0,255), 2)
cv2.line(img, pt2, pt3, (0,0,255), 2)
cv2.line(img, pt3, pt1, (0,0,255), 2)
def draw_points(points, img):
for p in points:
cv2.circle(img, (p[0], p[1]), 2, (255,255,255), 2)
# Draw polygon
cv2.fillPoly(img, [pts], (0, 255, 0))
# Draw result of triangulation
draw_triangeles(rect, pts, img)
# Draw vertices on top
draw_points(pts, img)
#hull = cv2.convexHull(pts)
#cv2.polylines(img, [hull], True, (0, 255, 0))
cv2.imshow("image", img)
cv2.waitKey()
cv2.destroyAllWindows()
最佳答案
第27行的triangles = subdiv.getTriangleList()
将生成4个三角形,其中包括不需要的三角形。
尽管不理想,但将第32行上的for t in triangles:
更改为for t in triangles[:3]:
将绘制除最后一个(不需要的)三角形之外的所有三角形。
完整代码:
# -*- coding: utf-8 -*-
import numpy as np
import cv2
width = 800
height = 600
img = np.zeros((height,width,3), np.uint8)
pts = np.array([[100,50],[200,300],[700,200],[500,100],[400,150]], np.int32)
rect = (0, 0, width, height)
def rect_contains(rect, point) :
if point[0] <rect[0] :
return False
elif point[1] < rect[1] :
return False
elif point[0] > rect[2] :
return False
elif point[1] > rect[3] :
return False
return True
def draw_triangeles(rect, points, img) :
subdiv = cv2.Subdiv2D()
subdiv.initDelaunay(rect)
for p in points:
subdiv.insert((p[0], p[1]))
triangles = subdiv.getTriangleList()
for t in triangles[:3]:
pt1 = (t[0], t[1])
pt2 = (t[2], t[3])
pt3 = (t[4], t[5])
if rect_contains(rect, pt1) and rect_contains(rect, pt2) and rect_contains(rect, pt3) :
cv2.line(img, pt1, pt2, (0,0,255), 2)
cv2.line(img, pt2, pt3, (0,0,255), 2)
cv2.line(img, pt3, pt1, (0,0,255), 2)
def draw_points(points, img):
for p in points:
cv2.circle(img, (p[0], p[1]), 2, (255,255,255), 2)
# Draw polygon
cv2.fillPoly(img, [pts], (0, 255, 0))
# Draw result of triangulation
draw_triangeles(rect, pts, img)
# Draw vertices on top
draw_points(pts, img)
#hull = cv2.convexHull(pts)
#cv2.polylines(img, [hull], True, (0, 255, 0))
cv2.imshow("image", img)
cv2.waitKey()
cv2.destroyAllWindows()
关于python - 如何对凹面多边形进行三角剖分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59570029/
当我尝试在 OpenGL 中使用 GL_POLYGON 时遇到问题。我不知道如何解释这一点,但我的所有顶点都与第一个顶点相连。当我尝试为对象着色时出现问题。我想画一个简单的物体。 void TOP (
我是一名优秀的程序员,十分优秀!