3

私はpygameで表された一連の正方形を持っています。次のように、チェーンの一部を回転させるコードがあります。

#!/usr/bin/python
import pygame

def draw(square):
    (x,y) = square
    pygame.draw.rect(screen, black, (100+x*20,100+y*20,20,20), 1) 

def rotate(chain, index, direction):
    (pivotx, pivoty) = chain[index]
    if (direction == 1):
        newchain = chain[:index]+[(y-pivoty+pivotx, (x-pivotx)+pivoty) for (x,y) in chain[index:]]
    else:
        newchain = chain[:index]+[(y-pivoty+pivotx, -(x-pivotx)+pivoty) for (x,y) in chain[index:]]
    return newchain

pygame.init()

size = [600, 600]
screen = pygame.display.set_mode(size)
white = (255,255,255)
black = (0,0,0)

n = 20
chain = [(i,0) for i in xrange(n)]

screen.fill(white)
for square in chain:
    draw(square)

pygame.display.flip()
raw_input("Press Enter to continue...")
newchain = rotate(chain, 5, 1)
print chain
print newchain
screen.fill(white)
for square in newchain:
    draw(square)

pygame.display.flip()
raw_input("Press Enter to continue...")

screen.fill(white)
newchain = rotate(newchain, 10,0)
for square in newchain:
    draw(square)

pygame.display.flip()
raw_input("Press Enter to continue...")
pygame.quit()

関数 rotate は、チェーン内の正方形のインデックスを取り、その正方形の後のチェーン全体を最初の正方形を中心に 90 度回転させます。問題は、これが物理的なおもちゃを模倣することを意図しているため、それ自体との衝突が許可されていないことです。回転後に 2 つの正方形が重なり合っているかどうかを確認できますが、回転中に一時的に衝突しないようにするにはどうすればよいですか?

4

6 に答える 6

1

私が誤解していない限り、回転を行うと、それらが重なっているかどうかを知る方法をすでに知っているようです。その場合、理解の最後にチェックを追加することで、チェーン内のローテーションの可能性を考慮して、その質問に答える関数を定義するのは比較的簡単です。

if (direction == 1):
    newchain = chain[:index]+[(y-pivoty+pivotx, (x-pivotx)+pivoty) for (x,y) in chain[index:] if not overlapping(x, y, pivotx, pivoty)]
else:
    newchain = chain[:index]+[(y-pivoty+pivotx, -(x-pivotx)+pivoty) for (x,y) in chain[index:] if not overlapping(x, y, pivotx, pivoty)]

そしてもちろん、ある種のものに依存しています:

def overlapping(x, y, px, py):
    if (some logic that determins if this is bad):
        raise Exception('Overlapping')
    return True

例外を除いて何か便利なことをする必要がありますが、少なくともこれは、処理中に各正方形をチェックし、回転全体の後まで待ってそれが適切であることを確認するのではなく、すぐに抜け出します.

于 2013-10-22T16:46:27.657 に答える
1

そのためには pygame 関数を使用します。

1. サーフェスをスプライトにします。
2. pygame.transform.rotateで回転させます。
3. pygame 関数との衝突をチェックします。
4.この機能は私にとって完璧に機能します;)。

def collision(sprite, group):
    rectCol = pygame.sprite.spritecollide(sprite, group, False)
    return [s for s in rectCol if pygame.sprite.collide_mask(sprite, s)]

スプライトは正方形の 1 つです。
グループは他のすべての正方形です。
この関数は、あなたの正方形と衝突するすべての正方形のリストを返します。

于 2013-10-24T09:04:35.013 に答える
0

それを行う1つの方法は、円の後に正方形をモデル化し、関係を使用することです

d=sqrt((x2-x1)^2+(y2-y1)^2) (x1,y1)、(x2,y2) は正方形の中心です。

ここで、d は中心間の最小距離です。次に、それを r1+r2 と比較します。ここで、r1 と r2 は正方形にある円の半径です。d が r1+r2 より小さい場合、単位速度ベクトルを逆にするか、反対方向に回転させます。

ある正方形の頂点を別の正方形の対角線に対してテストすることで、モデルの精度を高めることができます。たとえば (方眼紙を使ってこれを確認してください)、四角形 A があり、頂点が [(2,0),(0,2),(2,4),(4,2)] であり、別の(square B) は [(2,2),(5,2),(5,5),(2,5)] であり、任意の 1 つの正方形 (B を使用します) を取り、その頂点のいずれかを使用します、たとえば、(2,2)。x 座標 (2) が A の対角線上にある頂点の x 座標、たとえば (2,4) と (2,0) の間にあるかどうかをテストします。どうやらそうです!次に、別の対角線 (0,2) および (4,2) に対してチェックします。それもそうです!したがって、正方形 B は正方形 A と衝突し、回転ベクトルまたは速度ベクトルを反転する必要があります。y 座標で確認することもできます。

各正方形をループして、他の正方形と衝突するかどうかを確認する必要があります。ただし、すべての正方形をチェックする必要はありません。d の最小距離が互いに相対的に r1+r2 より小さい正方形にのみ関心を持つ必要があるため、それらの距離が半径の合計よりも小さく、それらの頂点が正方形の本体に入ったかどうかを確認する別のループ。私は通常、パーティクルのランダムな動き (ブラウン運動など) を刺激するゲームでこれを行います。

于 2013-10-22T09:12:55.577 に答える
0

あなたがしなければならないことは、回転する四角形の2つの側面が内接する2つの4分の1円の間の衝突をチェックすることです. 4 分の 1 円と長方形の間の衝突をチェックするには、このコードを適用してみてください。

于 2013-10-15T19:52:19.237 に答える
-1

この問題は、一般的に何度も解決されてきました。最も簡単な説明は、使用する詳細レベルが上がることです。

形状自体については、形状の最も外側のポイントを含むのに十分な大きさのバウンディング ボックスまたはバウンディング サークルを作成する必要があります。境界円は、オブジェクトを常に完全に覆う最小の形状であるため、優れています。また、回転後に再生成する必要もありません。これは、形状に可能な最大スペースを常に記述するためです。

境界円の場合、次の操作は、各境界円間の距離を測定し、重なる可能性がないものを破棄することです。これはかなり安価です。反射を破棄できることにも注意してください。つまり、形状 a が形状 b に重ならないことをテストした場合は、形状 b が形状 a に重なるかどうかをテストしないでください。

重なり合う可能性のある形状を取得したら、正確なアルゴリズムを使用して、1 つの形状の任意の点が他の形状の任意の点と重なるかどうかを確認する必要があります。これにはさまざまな方法があります。それらのいくつかは幾何学的 ( GJK アルゴリズム) であり、他のものは z-buffer やピクセル マスクなどを使用します。後者の種類については、1 つの形状をテスト バッファーに描画してから、2 番目の形状の描画を開始できます。ピクセルをプロットする前にバッファーをチェックして、既にそこにピクセルがあることを確認した場合は、交差 (衝突) があることがわかります。

于 2013-10-21T18:22:31.160 に答える