我必须让一个球体以无限符号的形状移动,以我的计算机图形课.

我想我已经成功地在下面的Python程序中重新创建了球体的精确运动,如任务图所示.

以下是结果:

The sphere following a path in the shape of the number eight

我的问题是

我的程序需要做一些事情来实现这一点:

  1. 我得画两个球体的模型.一个位于(-8,4,0),另一个位于(7,-3,0).我这样做是为了将球体放置在与原点不同的两个坐标周围.

  2. 我让第一个模型绕坐标(-8,4,0)旋转,直到它做了一个半循环.之后,我把它改为原点在(7,-3,0)的第二个模型,它一直旋转,直到它做了一个完整的循环.一旦它发生,我再次将其更改为第一个模型,并做一个完整的循环和半.它再次重复,从而遵循一个无限符号的轨迹.

这就是我在我的python程序中所做的

run = True
angle = 0
x_position = -8
y_position = 4
points_matrix = generate_sphere_points(x0=x_position, y0=y_position, z0=0)
points_matrix2 = generate_sphere_points(x0=-x_position-1, y0=-y_position+1, z0=0)
index = False
matrices_points = [points_matrix, points_matrix2]
delta_angle = -4
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    draw_world_axes()
    glLineWidth(1)
    glTranslatef(x_position, y_position, 0)
    glRotatef(angle, 0, 0, 1)
    plot_parametric_mesh(matrices_points[index])
    pygame.display.flip()
    pygame.time.wait(10)

    if angle <= -180 or angle >= 180:
        index = not index
        x_position = -x_position - 1
        y_position = -y_position + 1
        delta_angle *= -1

    angle += delta_angle

pygame.quit()

当它工作时,我认为你只需要一个球体模型.然而,我还没有弄清楚如何使球体甚至物体绕着一个不同于原点的坐标(0,0,0)旋转,而不需要在创建 timeshift 动该物体.我知道你可以用glRotatef()*glTranslatef()来使物体绕原点旋转,但我想要的是它绕着我指定的坐标旋转.

在这种情况下,创建一个绕一个坐标旋转的球体模型,然后将其中心切换到不同的坐标,并在整个8循环中重复.

有没有人知道我如何让一个球围绕一个坐标旋转,只是使用变换矩阵(fittef和rotatef),而不必改变球的参数方程中心,并且只使用一个球的模型来做8循环,而不是交换两个模型?

推荐答案

我想你要找的是Lissajous curve.这可以通过对两个轴应用不同Angular 的变换来创建.如果两个Angular 相同,你得到一个圆.如果其中一个Angular 是另一个的两倍,你得到8:

import pygame
from OpenGL.GL import *
import math

pygame.init()
display = (400, 400)
screen = pygame.display.set_mode(display, pygame.DOUBLEBUF | pygame.OPENGL)
clock = pygame.time.Clock()

run = True
angle1 = 0
angle2 = 0
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    x = math.cos(angle1) * 0.8
    y = math.sin(angle2) * 0.4
    glTranslatef(x, y, 0)
    angle1 += 0.01
    angle2 += 0.02
    glBegin(GL_QUADS)
    glVertex2f(-0.1, -0.1)
    glVertex2f(0.1, -0.1)
    glVertex2f(0.1, 0.1)
    glVertex2f(-0.1, 0.1)
    glEnd()

    clock.tick(100)
    pygame.display.flip()

pygame.quit()

Python相关问答推荐

我从带有langchain的mongoDB中的vector serch获得一个空数组

将jit与numpy linSpace函数一起使用时出错

如何在Python中将returns.context. DeliverresContext与Deliverc函数一起使用?

带条件计算最小值

Python中的嵌套Ruby哈希

按顺序合并2个词典列表

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

Python库:可选地支持numpy类型,而不依赖于numpy

Mistral模型为不同的输入文本生成相同的嵌入

DataFrames与NaN的条件乘法

pandas:排序多级列

移动条情节旁边的半小提琴情节在海运

Pandas Data Wrangling/Dataframe Assignment

lityter不让我输入左边的方括号,'

30个非DATETIME天内的累计金额

从源代码显示不同的输出(机器学习)(Python)

如何在一组行中找到循环?

如何从比较函数生成ngroup?

极点用特定值替换前n行

解析CSV文件以将详细信息添加到XML文件