2B Vektörün Çapraz Çarpımını Hesaplama


87

Wikipedia'dan:

çapraz çarpım, iki giriş vektörünü içeren düzleme dik olan başka bir vektörle sonuçlanan üç boyutlu bir Öklid uzayında iki vektör üzerinde ikili bir işlemdir .

Tanımın yalnızca üç ( veya yedi, bir ve sıfır ) boyutta tanımlandığı göz önüne alındığında , iki 2d vektörünün çapraz çarpımı nasıl hesaplanır?

İki uygulama gördüm. Biri yeni bir vektör döndürür (ancak yalnızca tek bir vektörü kabul eder), diğeri bir skaler döndürür (ancak iki vektör arasındaki bir hesaplamadır).

Uygulama 1 (bir skaler döndürür):

float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
{
    return (v1.X*v2.Y) - (v1.Y*v2.X);
}

Uygulama 2 (bir vektör döndürür):

Vector2D CrossProduct(const Vector2D & v) const
{
    return Vector2D(v.Y, -v.X);
}

Neden değişen uygulamalar? Skaler uygulamayı ne için kullanmalıyım? Vektör uygulamasını ne için kullanmalıyım?

Sormamın nedeni, kendim bir Vector2D sınıfı yazıyorum ve hangi yöntemi kullanacağımı bilmiyorum.


10
Uygulama 2 yanlış. Çapraz çarpım oluşturmak için iki vektöre ihtiyacınız var.
bobobobo

7
Uygulama 2, verilen v vektörünü -90 derece döndürür. İkame ürünleri -90 içinde x' = x cos θ - y sin θve y' = x sin θ + y cos θ. Bu uygulamanın bir başka varyasyonu olacaktır return Vector2D(-v.Y, v.X);hangi döndürme olduğunu v 90 derece.
legends2k

3
@ legends2k: Uygulama 2'nin çapraz çarpımı değerlendirmek için determinantı kullanmanın bir uzantısı olduğuna dikkat etmek önemlidir : sadece son satırı ve sütunu kaldırın. Böyle bir uzantı her zaman boyutlar N-1için işlenenlere sahiptir N.
Tim Čas

4
Uygulama 1 , Çapraz Ürünün büyüklüğünü hesaplar .
Mateen Ulhaq

@MateenUlhaq bir çeşit, " imzalanmış büyüklük"
Moritz Mahringer

Yanıtlar:


101

Uygulama 1, giriş vektörlerinin normal bir 3B çapraz çarpımından kaynaklanacak vektörün büyüklüğünü döndürür, Z değerlerini örtük olarak 0 olarak alır (yani 2B alanı 3B alanda bir düzlem olarak ele alır). 3D çapraz çarpım bu düzleme dik olacak ve bu nedenle 0 X & Y bileşenine sahip olacaktır (bu nedenle döndürülen skaler, 3D çapraz çarpım vektörünün Z değeridir).

3D çapraz çarpımdan elde edilen vektörün büyüklüğünün, Uygulama 1'e başka bir amaç veren iki vektör arasındaki paralelkenarın alanına da eşit olduğuna dikkat edin . Ek olarak, bu alan işaretlidir ve V1'den V2'ye dönmenin saat yönünün tersine mi yoksa saat yönünde mi hareket ettiğini belirlemek için kullanılabilir. Uygulama 1'in bu iki vektörden oluşturulan 2x2 matrisin belirleyicisi olduğu da unutulmamalıdır.

Uygulama 2, yine aynı 2D düzlemde bulunan giriş vektörüne dik bir vektör döndürür. Klasik anlamda bir çapraz çarpım değil, "bana dik bir vektör ver" anlamında tutarlı.

3B öklid uzayının çarpım işlemi altında kapatıldığına dikkat edin - yani, iki 3B vektörün çapraz çarpımı başka bir 3B vektör döndürür. Yukarıdaki 2D uygulamaların her ikisi de bir şekilde bununla tutarsızdır.

Bu yardımcı olur umarım...


7
Aslında, uygulama 2, v'nin çapraz çarpımıdır ve birim vektör z-yönünü gösterir.
mattiast

@mattiast: Doğru. 2D 'perp' işlemi tam olarak 3D olarak tanımlanır.
Drew Hall

@mattiast: Uygulama 2 , çapraz çarpımı hesaplamak için determinant kullanmanın bir uzantısı olarak düşünülebilir - sadece son satırı ve sütunu kaldırın. Uygulama 1'in şuna eşdeğer olduğuna dikkat edilmelidir: DotProduct(a, CrossProduct(b))(çok zarif bir şekilde!) "Dik nokta çarpımı" (bu uygulama 1'in aynı zamanda [ve belki de daha doğru olarak] olarak bilinir!) Kavramıyla tutarlıdır.
Tim Čas

İlk paragrafınızda büyüklük, döndürülen şeyin mutlak değeridir. Z bileşeniyle tamamen aynı şey değil. 2. paragrafta işaret ettiğiniz gibi, vampirleri püskürtmek için haç işaretini kullanabilirsiniz ... hata, örneğin bir vektörün ne zaman ayrıldığını ve bir çokgenin dış çizgisine girip çıkmadığını tespit etmek istiyorum.
Peter Cordes

68

Kısaca: Matematiksel bir hacklemenin kısaltmasıdır.

Uzun açıklama:

2B alanda vektörlerle çapraz çarpım yapamazsınız. Operasyon orada tanımlanmadı.

Bununla birlikte, iki vektörün çapraz çarpımını, 2B vektörlerin z koordinatlarını sıfıra ayarlayarak 3B'ye genişletildiğini varsayarak değerlendirmek ilginçtir. Bu, xy düzleminde 3B vektörlerle çalışmakla aynıdır.

Vektörleri bu şekilde genişletir ve böyle bir genişletilmiş vektör çiftinin çapraz çarpımını hesaplarsanız, yalnızca z bileşeninin anlamlı bir değere sahip olduğunu fark edeceksiniz: x ve y her zaman sıfır olacaktır.

Sonucun z bileşeninin genellikle basitçe skaler olarak döndürülmesinin nedeni budur. Bu skaler örneğin 2B uzayda üç noktanın sargısını bulmak için kullanılabilir.

Tamamen matematiksel bir bakış açısına göre, 2D uzayda çapraz çarpım mevcut değildir, skaler versiyon hack'tir ve 2D vektörü döndüren 2D çapraz çarpım hiç mantıklı değildir.


"örneğin 2B uzayda üç noktanın sargısını bulmak için kullanılabilir" @Nils Pipenbrinck, bu bağlamda sargı derken neyi kastediyorsunuz?
Nader Belal

1
@NaderBelal Sanırım burada sarmak şu anlama gelir - eğer a noktasından b noktasına gidersek, az önce yaydığımız açı açısından saat yönünde mi yoksa saat yönünün tersine mi gideceğiz.
Amit Tomar

12

Çapraz çarpımın bir başka kullanışlı özelliği, büyüklüğünün iki vektör arasındaki açının sinüsüyle ilgili olmasıdır:

| axb | = | a | . | b | . sinüs (teta)

veya

sinüs (teta) = | axb | / (| a |. | b |)

Bu nedenle, uygulama 1 'de, yukarıda halinde ave bbirim vektörleri olduğu önceden bilinen sonra bu işlevin bir sonucu tam olarak sinüs () değeridir.


1
... ki bu da a vektörü ile b vektörü arasındaki üçgenin alanının iki katıdır.
Tim Lovell-Smith

5

Uygulama 1, iki vektörün perp nokta çarpımıdır . 2D grafikler için bildiğim en iyi referans, mükemmel Graphics Gems serisidir. Çizik 2D çalışması yapıyorsanız , bu kitaplara sahip olmak gerçekten önemlidir. Cilt IV'te "Perp Dot Ürünlerinin Zevkleri" adlı bir çok kullanım alanı olan bir makale var.

Perp nokta çarpımının ana kullanımlarından biri sin, iki vektör arasındaki açının ölçeğini elde etmektir , tıpkı iç çarpımıncos açının ölçeğini döndürmesi gibi . Elbette iki vektör arasındaki açıyı belirlemek için iç çarpım ve nokta çarpımını birlikte kullanabilirsiniz.

İşte bunun üzerine bir gönderi ve işte Wolfram Matematik Dünyası makalesi.


3

Kütle merkezine göre keyfi bir noktada bir kuvvet vektörü tarafından etki edilen bir nesnenin yeni doğru dönüşünü bulmak için hesaplamamda 2d çapraz çarpım kullanıyorum. (Skaler Z bir.)


3

Kullanışlı bir 2B vektör işlemi, bir skaler döndüren bir çapraz çarpımdır. Bunu, bir çokgende birbirini izleyen iki kenarın sola veya sağa kıvrılıp bükülmediğini görmek için kullanıyorum.

Gönderen Chipmunk2D kaynağı:

/// 2D vector cross product analog.
/// The cross product of 2D vectors results in a 3D vector with only a z component.
/// This function returns the magnitude of the z value.
static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
{
        return v1.x*v2.y - v1.y*v2.x;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.