You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Vispy绘制多个矩形?坐标设置问题求解

如何在Vispy中绘制多个独立矩形

你尝试用单个Polygon对象添加两组矩形坐标来绘制两个矩形,但得到怪异形状的原因是:单个Polygon会将所有传入的坐标点按顺序连接成一个连续多边形,而非多个独立图形。

解决方法

方法1:创建多个Polygon实例

为每个矩形单独创建Polygon对象,传入各自的顶点坐标组:

from vispy import app
import sys
from vispy.scene import SceneCanvas
from vispy.scene.visuals import Polygon
from vispy.color import Color

white = Color("#ecf0f1")
gray = Color("#121212")
red = Color("#e74c3c")
blue = Color("#2980b9")

canvas = SceneCanvas(keys='interactive', title='Multiple Rectangles', show=True)
v = canvas.central_widget.add_view()
v.bgcolor = gray
v.camera = 'panzoom'

# 第一个矩形坐标
cx1, cy1 = (0.2, 0.2)
halfx, halfy = (0.1, 0.1)
rect1_coords = [(cx1 - halfx, cy1 - halfy),
                (cx1 + halfx, cy1 - halfy),
                (cx1 + halfx, cy1 + halfy),
                (cx1 - halfx, cy1 + halfy)]

# 第二个矩形坐标(偏移后)
cx2, cy2 = (0.6, 0.2)
rect2_coords = [(cx2 - halfx, cy2 - halfy),
                (cx2 + halfx, cy2 - halfy),
                (cx2 + halfx, cy2 + halfy),
                (cx2 - halfx, cy2 + halfy)]

# 分别创建独立的Polygon对象
poly1 = Polygon(rect1_coords, color=red, border_color=white, border_width=3, parent=v.scene)
poly2 = Polygon(rect2_coords, color=blue, border_color=white, border_width=3, parent=v.scene)

if __name__ == '__main__':
    if sys.flags.interactive != 1:
        app.run()

方法2:使用内置Rectangle组件(更简便)

Vispy提供了专门的Rectangle类,无需手动计算顶点,直接设置中心、宽高即可:

from vispy import app
import sys
from vispy.scene import SceneCanvas
from vispy.scene.visuals import Rectangle
from vispy.color import Color

white = Color("#ecf0f1")
gray = Color("#121212")
red = Color("#e74c3c")
blue = Color("#2980b9")

canvas = SceneCanvas(keys='interactive', title='Multiple Rectangles', show=True)
v = canvas.central_widget.add_view()
v.bgcolor = gray
v.camera = 'panzoom'

# 第一个矩形:中心(0.2,0.2),宽0.2,高0.2
rect1 = Rectangle(center=(0.2, 0.2), width=0.2, height=0.2, color=red, border_color=white, border_width=3, parent=v.scene)

# 第二个矩形:中心(0.6,0.2),尺寸与第一个一致
rect2 = Rectangle(center=(0.6, 0.2), width=0.2, height=0.2, color=blue, border_color=white, border_width=3, parent=v.scene)

if __name__ == '__main__':
    if sys.flags.interactive != 1:
        app.run()

错误原因说明

你之前的代码将两组矩形的8个顶点全部传入同一个Polygon,Vispy会按顺序连接所有点(从第一个点到最后一个点,再闭合回起点),最终形成的是一个连接两个矩形的不规则图形,而非独立的两个矩形。

内容的提问来源于stack exchange,提问作者maynull

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:54:56